首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流jar无法找到HDFS中的Mapper文件

流jar无法找到HDFS中的Mapper文件
EN

Stack Overflow用户
提问于 2014-11-20 20:31:12
回答 3查看 1.6K关注 0票数 1

我目前正在尝试运行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有一些问题,因为当我想运行以下命令时:

代码语言:javascript
复制
: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

我得到了无法找到映射文件的错误:

代码语言:javascript
复制
java.io.IOException: Cannot run program "code/mapper.py": error=2, No such file or directory

但是,该文件似乎存在:

代码语言:javascript
复制
: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

我做错了什么?

最佳乐天

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 22:45:12

如果向hadoop集群提交流作业,则必须使用-file命令行参数指定映射程序和还原器在本地文件系统上的位置,以便hadoop将文件复制到所有Mappers和reducer,从而使它们能够访问python脚本。所以,试试这样的东西:

代码语言:javascript
复制
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中的路径,而其他路径则是从启动作业的本地文件系统来的。

票数 0
EN

Stack Overflow用户

发布于 2015-11-13 20:55:26

Hadoop的流工具支持从HDFS映射文件。下面是一个例子:

代码语言:javascript
复制
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

注意,映射文件仍然是必要的。在这里,我使用-files作为不推荐的-file

票数 0
EN

Stack Overflow用户

发布于 2017-04-17 13:48:21

你在跑

: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来指定映射器和还原程序的路径,但它们不需要是本地文件,也就是说,如果您有一个名为basic_mapper.py的映射器,并且使用-put选项将其存储在hdfs中,那么您可以从hdfs中使用它。

例如:hadoop fs -put /home/<user>/files/basic_mapper.py hadoop/mappers现在您的映射器在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的符号链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27048981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档