据我了解,将文件复制到HDFS时的文件拆分和文件中的输入拆分用于映射器输入完全是两种不同的方法。
这是我的问题 -
假设我的File1大小是128MB,它被分成两个块并存储在hadoop集群中的两个不同的数据节点(Node1,Node2)中。我想在这个文件上运行MR作业,并得到两个大小分别为70MB和58 MB的输入分割。第一个映射器将通过获取输入拆分数据(大小为70 MB)在node1上运行,但Node1仅具有64MB数据,并且在Node2中显示剩余的6 MB数据。
要在Node1上完成Map任务,hadoop是否会将6MB数据从Node2传输到Node1?如果是,如果Node1没有足够的存储空间来存储来自Node2的6MB数据,该怎么办。
如果我的担忧很尴尬,我道歉。
答案 0 :(得分:0)
将在节点1中写入64 MB的数据,并在节点2中写入6 MB的数据。
Map Reduce算法不适用于文件的物理块。它适用于逻辑输入拆分。输入拆分取决于记录的写入位置。记录可能跨越两个Mappers。
在您的示例中,假设记录在63 KB数据和记录长度之后开始为2 MB。在这种情况下,1 MB是节点1的一部分,而其他1 MB是节点2的一部分。在映射操作期间,其他1 MB数据将从节点2传输到节点1。
请查看下面的图片,以便更好地了解logical split Vs physical blocks
看看一些SE问题:
How does Hadoop process records split across block boundaries?
About Hadoop/HDFS file splitting
MapReduce数据处理由输入分割的概念驱动。为特定应用程序计算的输入拆分数决定了映射器任务的数量。
在可能的情况下,将每个映射器任务分配给存储输入分割的从属节点。资源管理器(或JobTracker,如果您在Hadoop 1中)尽力确保在本地处理输入拆分。
如果由于跨越数据节点边界的输入拆分而无法实现数据位置,则某些数据将从一个数据节点传输到其他数据节点。 < / p>