【问题标题】:Hadoop: Cost of reading non-local data from other DatanodesHadoop:从其他 Datanode 读取非本地数据的成本
【发布时间】:2012-11-30 00:44:20
【问题描述】:

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

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

编辑:

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

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

谢谢:)

【问题讨论】:

    标签: hadoop


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!这部分回答了我的问题,但我对一次复制多少数据很感兴趣,所以我可以估计通过在非本地文件位置读取几个字节会产生多少开销。
    • 我认为开销很小并且考虑到以太网帧的大小 - 我认为开销接近于零。主要开销将是 HDFS 层 - 它没有针对小型读取进行优化。
    • 谢谢。我意识到,假设一个映射器作业运行一个小时左右的大规模任务,这个开销确实接近于零,可以忽略不计。从这个意义上说,数据局部性可能只需要在集群分布在具有低带宽连接的不同数据中心的环境中担心 FileSplits(或文件块)的大小被选择为相当小,默认为 64 MB 块,通常也不是这种情况。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!实际上,我的场景有点像第三种场景,因为我实现了自己的 InputFormat,它总是需要读取不在 InputSplit 中的文件部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2015-09-09
    • 2011-08-23
    • 1970-01-01
    • 2021-11-05
    • 2014-02-23
    相关资源
    最近更新 更多