现在的位置: 首页 > 搜索技术 > 黄专家专栏 > 正文

Hadoop Local 模式运行 Pipes 程序

2014年10月30日 搜索技术, 黄专家专栏 ⁄ 共 2024字 ⁄ 字号 评论关闭

秒速赛车公式 www.l19l7.cn 现在用的 hadoop 的版本是 0.20.2-cdh3u6。 cdh 是 Cloudera 的开源版本。

使用 local 模式的时候,会出现几个错误,记录如下:

1. java.lang.NullPointerException 异常

1
2
3
4
5
6
7
java.lang.Exception: java.lang.NullPointerException
  at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:349)
Caused by: java.lang.NullPointerException
  at org.apache.hadoop.mapred.pipes.Application.<init>(Application.java:103)
  at org.apache.hadoop.mapred.pipes.PipesMapRunner.run(PipesMapRunner.java:68)
  at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:390)
  ... ...

追踪以上错误的代码,我们可以知道,空指针异常是由于 jobToken 引起的,深入代码可以知道,hadoop pipes 从 TokenCache 中读入一个叫 “ShuffleAndJobToken” 的 token,然后写入一个 jobTokenPassword 文件。但是在 local 模式下并没有这个 key 对应的 token, 也就无从写入。 所以,修改代码

1
2
Token<JobTokenIdentifier> jobToken = TokenCache.getJobToken(conf.getCredentials());
byte[]  password = jobToken.getPassword();

1
2
3
4
5
Token<JobTokenIdentifier> jobToken = TokenCache.getJobToken(conf.getCredentials());
byte[] password = "no password".getBytes();
if (jobToken != null) {
  password = jobToken.getPassword();
}

2. jobTokenPassword 的文件权限

修改 jobTokenPassword 的文件权限

1
2
FSDataOutputStream out = FileSystem.create(localFs, localPath,
  new FsPermission("400"));

改为

1
2
FSDataOutputStream out = FileSystem.create(localFs, localPath,
  new FsPermission("666"));

3. userlog 目录的生成

在 src/mapred/org/apache/hadoop/mapred/pipes/Application.java 文件中,一下代码会将标准输入和标准错误重定向到你的日志文件中。

一般日志文件是在 ${hadoop.log.dir}/userlog/${jobid}/${taskid}/stdout 这样的方式出现的,但是在 local 模式中,不会为你建立这样的目录,所以导致执行 pipes 的 c++ 进程失败。

修改代码建立日志目录即可

1
2
3
File stdout = TaskLog.getTaskLogFile(taskid, false, TaskLog.LogName.STDOUT);
File stderr = TaskLog.getTaskLogFile(taskid, false, TaskLog.LogName.STDERR);
long logLength = TaskLog.getTaskLogLength(conf);

加入建立目录的代码

1
2
3
4
5
6
7
8
9
10
11
File stdout = TaskLog.getTaskLogFile(taskid, false, TaskLog.LogName.STDOUT);
File stderr = TaskLog.getTaskLogFile(taskid, false, TaskLog.LogName.STDERR);
long logLength = TaskLog.getTaskLogLength(conf);

String[] dirs = new String[1];
dirs[0] = TaskLog.getAttemptDir(taskid, false).toString();
try {
  TaskLog.createTaskAttemptLogDir(taskid, false, dirs);
} catch (IOException e) {
  LOG.info("Creation of failed.");      // 日志目录已经存在
}

现在 local 模式的 pipes 程序就可以运行了

抱歉!评论已关闭.

  • 第十六届中国经济论坛 2019-06-26
  • 拜博口腔医疗集团创始人、董事长黎昌仁获第十二届人民企业社会责任奖年度人物奖 2019-06-26
  • 县名解析晋城高平市地名来历 2019-06-25
  • “网络党课”第二课 杨禹《为美好生活而奋斗》 2019-06-25
  • 自然规律是不可改变的,社会规律是可以改变的。这是自然科学与社会科学的区别之一。 2019-06-25
  • 香港有祖国全面支持<br>港人对未来满怀憧憬 2019-06-25
  • 中央第四环保督察组向江西移交1034件信访问题线索 2019-06-24
  • 第十二届中国(南宁)国际园林博览会吉祥物正式发布 2019-06-24
  • C级总销量迫近A4L 宝马3系乏力 2019-06-24
  • 包车司机借口“学炒股”敲开门 抢钱后杀人抛尸 2019-06-23
  • 临汾“尧王杯”马拉松赛激情开跑 2019-06-23
  • 我们包住内力,在不断变化中寻找契机可出击可借力亦可卸力。 2019-06-23
  • “ONE NIGHT 给小孩”北京站探访周迅刘雯共奏可爱“交响曲” 2019-06-22
  • 爱护民生:什么基金都不能买,即使获利,也不会给分多少红利,只是意思意思。 2019-06-22
  • 三颗迄今最年轻行星现形 2019-06-22
  • 二o一三年曾道人送码 诈金花怎样洗牌 浙江七乐彩走势图2 河南快三预测一定牛 山东机选彩票大奖 天津时时彩计划软件 河南快三一定牛基本走势图 22选5体育彩票走势图 湖北11选5遗漏值 浙江体彩6+1开奖结果查询 双色球2019103期大奖地区 新时时彩老时时彩 十三水棋牌游戏在线 白姐急旋风 重庆幸运农场开奖软件