Найти первый блок файла в hadoop

#hadoop #hdfs

#hadoop #hdfs

Вопрос:

Я сохраняю видеофайл размером 500 Мб или больше в hdfs. Поскольку он больше размера блока, он будет распространяться. Я должен сначала собрать или обработать только первый блок данных (здесь видеофайл), поскольку он будет содержать только заголовок последовательности. Как я могу это сделать или как найти первый блок данных файла в hadoop?

Ответ №1:

Если вы хотите прочитать первый блок, вы можете просто получить InputStream из FileSystem и читать байты, пока он не достигнет заданного вами количества (примерный размер блока 64 МБ будет 64 * 1024 * 1024 байт). Вот пример (хотя 64 мб — это много данных. Если вы считаете, что необходимые вам данные задолго до 64 МБ, просто измените байтовое лево)

 import java.io.EOFException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.zookeeper.common.IOUtils;

public class TestReaderFirstBlock {

    private static final String uri = "hdfs://localhost:9000/path/to/file";
    private static int bytesLeft = 64 * 1024 * 1024;
    private static final byte[] buffer = new byte[4096];

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(uri), conf);

        InputStream is = fs.open(new Path(uri));
        OutputStream out = System.out;

        while (bytesLeft > 0) {
            int read = is.read(buffer, 0, Math.min(bytesLeft, buffer.length));
            if (read == -1) {
                throw new EOFException("Unexpected end of data");
            }
            out.write(buffer, 0, read);
            bytesLeft -= read;
        }

        IOUtils.closeStream(is);
    }
}
  

Комментарии:

1. выделит ли это весь файл на локальном компьютере и выполнит обработку? Если true, то мы не получим никакой пользы от hadoop. Я хочу обработать видео размером во много гигабайт.

2. Ваш комментарий отчасти противоречит. Вам нужен весь файл или нет? Я думал, что ваш вопрос заключался в том, что вам нужен только первый блок (который по умолчанию равен 64 МБ)

3. да, я хотел только первый блок … но… Я хотел знать, загрузит ли это весь файл на локальном компьютере? Если нет, то это то, что я хотел.