2

默认情况下,Hadoop 在文件的块边界上拆分要由 Mapper 处理的文件。也就是说,这就是 FileInputFormat 实现对 getSplits() 所做的。然后,Hadoop 确保将要由 Mapper 处理的块复制到运行 Mapper 的 Datanode 上。

现在我想知道,如果我需要在此 InputSplit 之外读取(在 RecordReader 中,但这无关紧要),与在 InputSplit 内部读取相比,这会花费我什么 - 假设它之外的数据不存在于读数据节点?

编辑:

换句话说: 我是一个 RecordReader并且被分配了一个跨越一个文件块的 InputSplit。我有这个文件块的本地副本(相反,我正在运行的数据节点有),但没有文件的其余部分。现在我确实需要在 InputSplit 之外阅读,因为我需要阅读最开始的文件头。然后我需要跳过文件中的记录(通过读取记录标题,它告诉我每条记录有多长,而不是跳过那个字节数)。我需要这样做,直到遇到 InputSplit 中的第一条记录。然后我可以开始阅读 InputSplit 中的实际记录。这是确保我将从有效记录边界开始的唯一方法。

问题:当我在 InputSplit 之外读取时,非本地文件块中的数据何时被复制?这是一次完成一个字节(即每次调用 InputStream.read() 一次),还是在我调用 InputStream.read() 直到遇到之前将整个文件块(当前 InputStream 位置的)复制到本地数据节点下一个非本地文件块等?我需要知道这一点,这样我才能估计跳过文件会产生多少开销。

谢谢 :)

4

2 回答 2

2

据我所知,如果数据不驻留在本地数据节点上 - 它不会参与读取它。HDFS 客户端将询问 NameNode 块所在的位置,并直接与相关数据节点对话以获取块。
所以成本将是 - 在远程数据节点上:从磁盘读取,计算 CRC,发送到网络,代码读取数据 - 从网络获取。
我认为集群明智的价格只是网络带宽和一些用于发送、接收的 CPU。

于 2012-12-12T11:14:43.207 回答
0

数据移动通常发生在两种情况下。首先,如果 InputSplit 的大小大于块大小。其次,如果持有该块的节点没有任何空闲槽来启动TaskTracker。在这种情况下,块将被移动到另一个具有空闲槽的节点(最好在同一个机架内)。

于 2012-12-13T10:33:45.930 回答