默认情况下,Hadoop 在文件的块边界上拆分要由 Mapper 处理的文件。也就是说,这就是 FileInputFormat 实现对 getSplits() 所做的。然后,Hadoop 确保将要由 Mapper 处理的块复制到运行 Mapper 的 Datanode 上。
现在我想知道,如果我需要在此 InputSplit 之外读取(在 RecordReader 中,但这无关紧要),与在 InputSplit 内部读取相比,这会花费我什么 - 假设它之外的数据不存在于读数据节点?
编辑:
换句话说: 我是一个 RecordReader并且被分配了一个跨越一个文件块的 InputSplit。我有这个文件块的本地副本(相反,我正在运行的数据节点有),但没有文件的其余部分。现在我确实需要在 InputSplit 之外阅读,因为我需要阅读最开始的文件头。然后我需要跳过文件中的记录(通过读取记录标题,它告诉我每条记录有多长,而不是跳过那个字节数)。我需要这样做,直到遇到 InputSplit 中的第一条记录。然后我可以开始阅读 InputSplit 中的实际记录。这是确保我将从有效记录边界开始的唯一方法。
问题:当我在 InputSplit 之外读取时,非本地文件块中的数据何时被复制?这是一次完成一个字节(即每次调用 InputStream.read() 一次),还是在我调用 InputStream.read() 直到遇到之前将整个文件块(当前 InputStream 位置的)复制到本地数据节点下一个非本地文件块等?我需要知道这一点,这样我才能估计跳过文件会产生多少开销。
谢谢 :)