我有一个 20 节点的 Hadoop 集群,其中每个节点都有 8GB 内存和一个 8 核处理器。当我使用 300-600 个减速器进行长时间运行的工作时,有时会随机出现以下错误:
Exception in thread "main" java.io.IOException: Exception reading file:/var/tmp/jim/hadoop-jim/mapred/local/taskTracker/jim/jobcache/job_201305231647_0005/jobToken
at org.apache.hadoop.security.Credentials.readTokenStorageFile(Credentials.java:135)
at org.apache.hadoop.mapreduce.security.TokenCache.loadTokens(TokenCache.java:165)
at org.apache.hadoop.mapred.Child.main(Child.java:92)
Caused by: java.io.IOException: failure to login
at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:501)
at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:463)
at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:1519)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1420)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:187)
at org.apache.hadoop.security.Credentials.readTokenStorageFile(Credentials.java:129)
... 2 more
Caused by: javax.security.auth.login.LoginException: java.lang.NullPointerException: invalid null input: name
at com.sun.security.auth.UnixPrincipal.<init>(UnixPrincipal.java:70)
at com.sun.security.auth.module.UnixLoginModule.login(UnixLoginModule.java:132)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
我尝试切换 JVM 并且打开 JDK 1.7 和 Oracle JVM 1.6 偶尔会导致相同的错误。它并不总是发生,当它发生时,在特定节点中运行的所有任务都会失败,并且该节点会被列入黑名单。但是,当我提交另一个作业时,同一个节点通常运行得很好。我在集群节点上运行 Ubuntu 12.10。
我在网上搜索了这个错误,我能找到的唯一帖子是来自 Cloudera 邮件档案,其中有人在 Mac 上运行伪分布式 Hadoop 集群。除此之外,我想我是第一个遇到这个问题的人。
我对 Hadoop 并不陌生,通常可以自己解决与集群相关的问题或错误配置问题,但我非常感谢对此的任何反馈。