Hadoop:从其他Datanode读取非本地数据的成本

时间:2012-12-12 10:24:05

标签: hadoop

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

现在我想知道,如果我需要在这个InputSplit之外读取(在RecordReader中,但这是无关紧要的),这会让我付出代价而不是在InputSplit内部读取 - 假设它之外的数据不是出现在阅读Datanode?

修改

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

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

谢谢:)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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