我有一个小数据集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
复制到所有节点,然后使用myscript.py
从{{1}}访问它
hadoop路径。
有可能吗?
PS。当我说" 小数据集"时,我指的是从单个记录(小于1kB)到200k记录(4MB)的范围。
答案 0 :(得分:0)
当您将文件加载到hdfs时,它会将文件分成块并在不同节点上复制每个块三次(默认情况下)。在你的情况下,如果你真的有一个小于默认块大小的小文件(Cloudera的128MB我依稀记得)。该文件不会被破坏,它将仅被发送到三个数据节点(不在每个节点上分发)。
您可以使用网址namenodeFQDN:50070/dfshealth.jsp
查看文件是如何分解成碎片的,并且有一个选项可以在Hadoop1或Hadoop2环境中浏览文件系统。
要回答你的问题,如果你运行hadoop流,那么每个数据节点上都可能有mappers,即使你已经使用hdfs dfs put“分发”它,也不会在本地包含小文件。
要访问该文件,有四种解决方案。
-files
标志。 pydoop
或其他一些库,因此每个映射器都会动态地从small
形式读取HDFS。 我脑子里浮现出一些想法,我有成功的前3个解决方案的经验。