相关疑难解决方法(0)

Hadoop流程记录如何跨块边界分割?

根据 Hadoop - The Definitive Guide

FileInputFormats定义的逻辑记录通常不适合HDFS块.例如,TextInputFormat的逻辑记录是行,它们将经常跨越HDFS边界.这与你的程序的功能没有关系 - 例如,线路不会丢失或损坏 - 但值得了解,因为它确实意味着数据本地地图(即,与他们在同一主机上运行的地图)输入数据)将执行一些远程读取.这导致的轻微开销通常不显着.

假设记录行分为两个块(b1和b2).处理第一个块(b1)的映射器将注意到最后一行没有EOL分隔符,并从下一个数据块中取出剩余的行(b2).

映射器如何处理第二个块(b2)如何确定第一个记录是不完整的并且应该从块(b2)中的第二个记录开始处理?

hadoop split mapreduce block hdfs

118
推荐指数
3
解决办法
3万
查看次数

HDFS文件中的定位read或seek()会加载并忽略文件的全部内容吗?

我想从某个偏移/位置读取大文件的子内容。例如,我有一个 1M 行的文件,我想从第 100 行开始读取 50 行。(行号:101 至 150 - 包括在内)

我想我应该使用 PositionalReadable。 https://issues.apache.org/jira/browse/HADOOP-519

我看到FSInputStream.readFully实际上使用了seek()的方法Seekable

当我检查底层实现时,seek()我发现它使用BlockReader.skip()

blockReader.skip() 不会读取整个数据直到跳过字节的位置吗?问题是 HDFS 是否也会加载前 100 行才能到达第 101 行。

如何使位置位于文件中任何所需的偏移量(例如文件的第 10000 行)而不加载其余内容?s3 在 header-offsets 中提供的东西。

这是我发现的类似问题:How to read files with a offset from Hadoop using Java,但它建议使用seek()并且在评论中争论这seek()是昂贵的操作,应该谨慎使用。我认为这是正确的,因为查找似乎读取所有数据以便跳到该位置。

java file hdfs

3
推荐指数
1
解决办法
893
查看次数

标签 统计

hdfs ×2

block ×1

file ×1

hadoop ×1

java ×1

mapreduce ×1

split ×1