我目前正在尝试运行本地版本的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
我做错什么了?
最佳乐透
3条答案
按热度按时间irlmq6kh1#
如果向hadoop集群提交流作业,则必须使用
-file
命令行参数,以便hadoop将文件复制到所有Map器和还原器,以便它们可以访问python脚本。所以,试试这个:确保替换所有参数的路径。参数
-input
,-output
是hdfs中的路径,而其他路径将来自启动作业的本地文件系统。at0kjp5o2#
hadoop的流工具支持从hdfsMap文件。举个例子:
请注意,Map文件仍然是必需的。我用这个
-files
作为-file
已弃用。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