本文主要记录作者学习MapReduce的过程,尽量保持通顺吧,不通之处还望见谅。
主要基于这篇Cloudera的tutorial
讲几个踩过的坑
1. kerberos认证的UserGroupInformation.loginUserFromKeytab() 方法,看文档是说会替换掉当前用户的,但是必须在程序一开就调用,我是在main函数。如果在ToolRunner.run()里面调用,会无法替换掉当前的用户。
我分析是因为我公司Windows机器上本来就采用的是Kerberos认证,这样hadoop的java程序一开始就使用了我本机的用户。当然如果本级没有已存在的kerberos帐户,也应该还是要在main里面调用,要不然当前帐户应该会是null。
2. 更坑的是我从windows机器上去连linux server上的hadoop,各种莫名其妙的错误。
比如下面这种:
Application application_1556775811260_0771 failed 2 times due to AM Container for appattempt_1556775811260_0771_000002 exited with exitCode: 1For more detailed output, check application tracking page:http://dsccmaster02i1d.eur.nsroot.net:8088/proxy/application_1556775811260_0771/Then, click on links to logs of each attempt.Diagnostics: Exception from container-launch.Container id: container_e143_1556775811260_0771_02_000001Exit code: 1Stack trace: ExitCodeException exitCode=1:at org.apache.hadoop.util.Shell.runCommand(Shell.java:604)at org.apache.hadoop.util.Shell.run(Shell.java:507)at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:789)at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.launchContainer(LinuxContainerExecutor.java:399)at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)Shell output: main : command provided 1
这个日志信息没有给出任何有用的东西,只能在这个网页(link)去看yarn container的退出代码表示啥意思,但是依然不能帮助解决问题。
还有个open状态的jira说了这个问题,报错信息太抽象,无法具体定位错误
最后,解决方法居然是要改hadoop相关的xml文件,加上windows系统专用的一些参数,从这里来的community.cloudera.com/t5/Batch-Pr…
3. 最好下载hadoop对应版本的winutil.exe并在java程序里设置好它的路径,否则你的程序或许能跑通,但是有时候会有不好解决的bug,徒增烦恼。
System.setProperty("hadoop.home.dir", "C:\\winutil");