#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. да, я хотел только первый блок … но… Я хотел знать, загрузит ли это весь файл на локальном компьютере? Если нет, то это то, что я хотел.