如何确保(小)数据集复制到所有节点?

时间:2014-06-02 15:05:38

标签: 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选项将其重新分发到所有节点。

似乎应该有办法告诉hadoop将mysmall复制到所有节点,然后使用myscript.py从{{1}}访问它 hadoop路径。

有可能吗?

PS。当我说" 小数据集"时,我指的是从单个记录(小于1kB)到200k记录(4MB)的范围。

1 个答案:

答案 0 :(得分:0)

当您将文件加载到hdfs时,它会将文件分成块并在不同节点上复制每个块三次(默认情况下)。在你的情况下,如果你真的有一个小于默认块大小的小文件(Cloudera的128MB我依稀记得)。该文件不会被破坏,它将仅被发送到三个数据节点(不在每个节点上分发)。

您可以使用网址namenodeFQDN:50070/dfshealth.jsp查看文件是如何分解成碎片的,并且有一个选项可以在Hadoop1或Hadoop2环境中浏览文件系统。

要回答你的问题,如果你运行hadoop流,那么每个数据节点上都可能有mappers,即使你已经使用hdfs dfs put“分发”它,也不会在本地包含小文件。

要访问该文件,有四种解决方案。

  1. 你正在做的事情,这已经足够了。在hdfs中使用-files标志。
  2. 如果文件非常小,也许您可​​以考虑在python脚本中包含内容,而不是从单独的文件夹中读取。
  3. 实际上,如果你做了很多hadoop流媒体,NFS是一个方便的解决方案。所以在你的脚本中,你可以运行“openfile('nfs / smallfile')”,每个节点都应该看到它。
  4. 直接从hdfs访问mapper中的小文件,可能使用pydoop或其他一些库,因此每个映射器都会动态地从small形式读取HDFS。
  5. 我脑子里浮现出一些想法,我有成功的前3个解决方案的经验。