Hadoop 流与 Python : splitting input files manually

标签 hadoop mapreduce hadoop-streaming

我是 Hadoop 的新手,正在尝试将其流功能与 Python 编写的映射器和缩减器一起使用。问题是我的原始输入文件将包含要由映射器识别的行序列。如果我让 Hadoop 拆分输入文件,它可能会在序列的中间进行拆分,因此不会检测到该序列。所以,我正在考虑手动拆分文件。这也将打破一些序列,因此,除此之外,我还将提供替代拆分,以创建与“第一个”拆分重叠的文件。这样我就不会丢失任何序列。

我将运行 this article 中描述的以下命令:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar \
-file /home/hduser/mapper.py    -mapper /home/hduser/mapper.py \
-file /home/hduser/reducer.py   -reducer /home/hduser/reducer.py \
-input /user/hduser/seq_files/* -output /user/hduser/output_files

我打算将我的输入文件(即手动拆分生成的文件)放在/user/hduser/seq_files/

问题是:

  1. 如何配置 Hadoop 以获取每个输入文件并将其原样发送到映射器?

  2. 如果输入文件的数量大于节点的数量,是否会映射所有文件? 谢谢。

最佳答案

这里有很多问题需要考虑。

  1. map/reduce 的映射部分要求映射该行所需的所有数据都驻留在该行上。试图解决这个问题是非常糟糕的做法,可能会被认为是您做错事的味道。
  2. Hadoop 只拆分可拆分的输入文件,例如 bz2 或未压缩的文件。 Gzip does not get split for instance .
  3. 如果您正在分析序列或“需要特定顺序才能有意义的事物”,这通常在 reducer 中完成,因为流向它的数据始终按 the Hadoop sort key 排序。 (这就是为什么要映射出 key )。
  4. reducers 会在数据集排序后从 mappers 收到一个拆分数据集,为了避免分离所有需要去同一个 reducer 进行解释的信息,使用 the Hadoop partitioning key

请注意,所有链接都指向同一页面,只是不同的章节。总的来说,我认为从上到下阅读该页面将使您对如何以流方式使用 Hadoop 有更坚定的认识。

额外提示: 如果你想用 python 做 map/reduce,我建议你看看 Apache Spark for Python ,它在 Hadoop 上运行,但是是 A whole lot faster它还允许您使用 iPython 控制台开发您的 map/reduce 算法,这极大地提高了开发速度。

关于Hadoop 流与 Python : splitting input files manually,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146923/

相关文章:

hadoop - MapReduce Reducer 的 KeyOut 类型

hadoop - 区域服务器在哪里以及其他位置?

hadoop - 如何预处理数据并加载到配置单元中

Hadoop任务进度

amazon-web-services - 如何使用 HadoopJarStep Config.Step 属性?

hadoop - SalesForce 与 Hadoop 哪个更好?

hadoop - Hive 生成​​ ID

hadoop - Amazon Elastic Map Reduce 是否在每个实例中运行一个或多个映射器进程?

java - 编译hadoop Java文件

java - 将流数据插入hive