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

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-04-19
  • 长效机制加速推进 楼市下半年或持续降温 2019-04-19
  • 树立文化自信 创新节庆模式 2019-04-19
  • 朝韩将军级会谈时隔11年后在板门店重启 2019-04-19
  • 经济日报多媒体数字报刊 2019-04-18
  • 搞好公有制就是好,故得出结论:计划经济好。 2019-04-18
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-04-18
  • 南海网-海南新闻网-权威媒体 海南门户 2019-04-17
  • 海底捞回应侵犯音乐人林海著作权:已停止播放 2019-04-17
  • 自然型社会和规则性社会,是会随着科技的改变而发生改变的,当然只有规矩也就是制度才能规范人的行为,所以国家是不会灭亡的,但国家的形式是会发生改变的。 2019-04-17
  • 惊艳!上外学子英译60首热门中文歌  让世界倾听中国 2019-04-16
  • 西安,给盲人朋友留一条路吧…无障碍设施盲道-编辑整合 2019-04-16
  • 的确如此。报刊亭取消的确是短视行为。把报刊亭设计的现代化一些,与城市绿化衔接起来,相得益彰,成为文化一景多好。 2019-04-16
  • 让更多企业和劳动者尝到协商的“甜头” 2019-04-16
  • 2014金家岭财富论坛嘉宾云集(二) 2019-04-15
  • 221| 878| 84| 484| 307| 950| 847| 263| 774| 166|