Hadoop 如何确保将(小)数据集复制到所有节点?
我有一个小数据集Hadoop 如何确保将(小)数据集复制到所有节点?,hadoop,hadoop-streaming,Hadoop,Hadoop Streaming,我有一个小数据集mysmall,在流式处理大数据集mylarge时需要它 现在我知道了 hadoop fs -get mysmall hadoop jar hadoop-streaming.jar -files mysmall,myscript.py \ -reducer ... -input mylarge -output ... \ -mapper "python myscript.py mysmall" 这似乎不太理想-我从hadoop收集mysmall,然后 使用-files选
mysmall
,在流式处理大数据集mylarge
时需要它
现在我知道了
hadoop fs -get mysmall
hadoop jar hadoop-streaming.jar -files mysmall,myscript.py \
-reducer ... -input mylarge -output ... \
-mapper "python myscript.py mysmall"
这似乎不太理想-我从hadoop收集mysmall
,然后
使用-files
选项将其重新分发到所有节点
似乎应该有一种方法告诉hadoop将mysmall
复制到所有节点,然后使用
hadoop路径
有可能吗
注:当我说“小数据集”时,我指的是从单个记录(小于1kB)到200k记录(4MB)的范围。当您将文件加载到hdfs时,它会将文件分成块,并在不同节点上复制每个块三次(默认情况下)。在您的情况下,如果您确实有一个小于默认块大小的小文件(我模糊地记得Cloudera是128MB)。该文件不会被破坏,只会发送到三个DataNode(不是每个节点上都分发) 您可以使用url
namenodeFQDN:50070/dfshhealth.jsp
查看文件是如何被拆分的,并且可以在Hadoop1或Hadoop2环境中浏览文件系统
为了回答您的问题,如果您运行hadoop streaming,每个数据节点上都可能有映射器,即使您已经使用hdfs dfs put“分发”了小文件,这些映射器也不会在本地包含该文件
要访问该文件,有四种解决方案
-files
标志李>
pydoop
或其他一些库直接从hdfs访问mapper内部的小文件,因此每个mapper将动态读取hdfs中的small
李>
有一些想法突然出现在我的脑海中,我有成功使用前3个解决方案的经验