【问题标题】:How do I ensure that the (small) data set is replicated to all nodes?如何确保将(小)数据集复制到所有节点?
【发布时间】:2014-06-02 15:05:38
【问题描述】:

我有一个小型数据集 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 访问它 hadoop 路径。

有可能吗?

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

【问题讨论】:

    标签: hadoop hadoop-streaming


    【解决方案1】:

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

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

    为了回答您的问题,如果您运行 hadoop 流式传输,每个数据节点上可能都有映射器,即使您已经使用 hdfs dfs put “分发”它,它也不会在本地包含小文件。

    为了让您访问该文件,有四种解决方案。

    1. 你正在做的方式,这已经足够好了。在 hdfs 中使用 -files 标志。
    2. 如果文件真的很小,也许您可​​以考虑将内容包含在您的 python 脚本中,而不是从单独的文件夹中读取。
    3. 实际上,如果您执行大量 hadoop 流式处理,NFS 是一个方便的解决方案。因此,在您的脚本中,您可以运行“openfile('nfs/smallfile')”,并且每个节点都应该看到它。
    4. 直接从 hdfs 访问映射器内部的小文件,可能使用pydoop 或其他一些库,因此每个映射器都会从 HDFS 动态读取 small

    我的脑海中浮现出一些想法,我对前 3 个成功的解决方案有经验。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 2017-07-27
      • 1970-01-01
      • 2016-06-02
      • 2021-06-25
      • 2017-01-24
      • 2014-07-15
      • 2015-01-02
      相关资源
      最近更新 更多