Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何确保将(小)数据集复制到所有节点?_Hadoop_Hadoop Streaming - Fatal编程技术网

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“分发”了小文件,这些映射器也不会在本地包含该文件

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

  • 你现在的做法,已经足够好了。在hdfs中使用
    -files
    标志
  • 如果文件非常小,您可以考虑将内容包含在python脚本中,而不是从单独的文件夹中读取
  • 事实上,如果您进行大量hadoop流式处理,NFS是一个方便的解决方案。因此,在脚本中,可以运行“openfile('nfs/smallfile')”,每个节点都应该看到它
  • 可以使用
    pydoop
    或其他一些库直接从hdfs访问mapper内部的小文件,因此每个mapper将动态读取hdfs中的
    small
    有一些想法突然出现在我的脑海中,我有成功使用前3个解决方案的经验