mapper文件

lvmkulzt  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(392)

我目前正在尝试运行本地版本的hadoop,但是我有点卡住了。我的设置使用了以下教程:
http://glebche.appspot.com/static/hadoop-ecosystem/hadoop-hive-tutorial.html
现在,我想使用本教程执行一个简单的mapreduce:
http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/
但是,我似乎对hdfs有一些问题,因为当我想运行以下命令时:

:libexec me$ hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.4.0.jar -Dmapred.reduce.tasks=1 -input text/* -output text/output -mapper code/mapper.py -reducer code/reducer.py

我得到的错误是找不到Map程序文件:

java.io.IOException: Cannot run program "code/mapper.py": error=2, No such file or directory

但是,该文件似乎存在:

:tmp me$ hadoop dfs -ls code
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

14/11/20 21:28:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 lotte supergroup        536 2014-11-20 20:04 code/mapper.py
-rw-r--r--   1 lotte supergroup       1026 2014-11-20 20:04 code/reducer.py

我做错什么了?
最佳乐透

irlmq6kh

irlmq6kh1#

如果向hadoop集群提交流作业,则必须使用 -file 命令行参数,以便hadoop将文件复制到所有Map器和还原器,以便它们可以访问python脚本。所以,试试这个:

hadoop har /path/to/hadoop-streaming.jar \
  -Dmapred.reduce.tasks=1
  -input /path/to/input
  -output /path/to/output
  -mapper /path/to/mapper.py
  -reducer /path/to/reducer.py
  -file /path/to/mapper.py
  -file /path/to/reducer.py

确保替换所有参数的路径。参数 -input , -output 是hdfs中的路径,而其他路径将来自启动作业的本地文件系统。

at0kjp5o

at0kjp5o2#

hadoop的流工具支持从hdfsMap文件。举个例子:

hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.7.1.jar \
    -files hdfs://host:port/user/<hadoop_username>/code/mapper.py,hdfs://host:port/user/<hadoop_username>/code/reducer.py \
    -Dmapred.reduce.tasks=1 \
    -input text/* \
    -output text/output \
    -mapper code/mapper.py \
    -reducer code/reducer.py

请注意,Map文件仍然是必需的。我用这个 -files 作为 -file 已弃用。

w9apscun

w9apscun3#

你在跑步 :libexec me$ hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.4.0.jar -Dmapred.reduce.tasks=1 -input text/* -output text/output -mapper code/mapper.py -reducer code/reducer.py 正如ashrith告诉你的,你必须使用 -files 指定Map器和还原器的路径,但它们不需要是本地文件,也就是说,如果您有一个名为 basic_mapper.py 你把它储存在 hdfs 使用 -put 选项,您可以从 hdfs .
例如: hadoop fs -put /home/<user>/files/basic_mapper.py hadoop/mappers 现在你的Map绘制器在了 hdfs ,因此您可以从新位置调用它: hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.4.0.jar -Dmapred.reduce.tasks=1 -files hdfs://host:port/user/<hadoop_username>/hadoop/mappers/basic_mapper.py -input text/* -output text/output -mapper basic_mapper.py 小心,因为它会创建一个名为 basic_mapper.py 而不是 hadoop/mapper/basic_mapper.py

相关问题