在hadoop中查找文件的第一个块

zwghvu4y  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(260)

我正在hdfs中存储一个500 mb或更大的视频文件。因为它大于块大小,所以它将被分发。我必须先收集或只处理第一块数据(这里是视频文件),因为它只包含序列头。我该怎么做,或者如何在hadoop中找到文件的第一个数据块?

qij5mzcb

qij5mzcb1#

如果你想读第一个街区,你可以得到一个 InputStreamFileSystem 并读取字节,直到它达到预定的数量(示例块大小64mb将是6410241024字节)。下面是一个例子(尽管64mb是大量的数据。如果您认为您需要的数据早于64mb,只需更改bytesleet)

  1. import java.io.EOFException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.URI;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.FileSystem;
  7. import org.apache.hadoop.fs.Path;
  8. import org.apache.zookeeper.common.IOUtils;
  9. public class TestReaderFirstBlock {
  10. private static final String uri = "hdfs://localhost:9000/path/to/file";
  11. private static int bytesLeft = 64 * 1024 * 1024;
  12. private static final byte[] buffer = new byte[4096];
  13. public static void main(String[] args) throws Exception {
  14. Configuration conf = new Configuration();
  15. FileSystem fs = FileSystem.get(URI.create(uri), conf);
  16. InputStream is = fs.open(new Path(uri));
  17. OutputStream out = System.out;
  18. while (bytesLeft > 0) {
  19. int read = is.read(buffer, 0, Math.min(bytesLeft, buffer.length));
  20. if (read == -1) {
  21. throw new EOFException("Unexpected end of data");
  22. }
  23. out.write(buffer, 0, read);
  24. bytesLeft -= read;
  25. }
  26. IOUtils.closeStream(is);
  27. }
  28. }
展开查看全部

相关问题