Hadoop MapReduce NoSuchElementException

Я хотел запустить MapReduce-Job в своем кластере FreeBSD с двумя узлами, но получаю следующее исключение

14/08/27 14:23:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
14/08/27 14:23:04 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
14/08/27 14:23:04 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
14/08/27 14:23:04 WARN mapreduce.JobSubmitter: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
14/08/27 14:23:04 WARN mapreduce.JobSubmitter: No job jar file set.  User classes may not be found. See Job or Job#setJar(String).
14/08/27 14:23:04 INFO mapreduce.JobSubmitter: Cleaning up the staging area file:/tmp/hadoop-otlam/mapred/staging/otlam968414084/.staging/job_local968414084_0001
Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.loadPermissionInfo(RawLocalFileSystem.java:565)
at org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus.getPermission(RawLocalFileSystem.java:534)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.checkPermissionOfOther(ClientDistributedCacheManager.java:276)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.isPublic(ClientDistributedCacheManager.java:240)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineCacheVisibilities(ClientDistributedCacheManager.java:162)
at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineTimestampsAndCacheVisibilities(ClientDistributedCacheManager.java:58)
at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:265)
at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:301)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:389)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303)
...

Это происходит, когда я пытаюсь запустить job.watForCompletion(true); в новом задании MapReduce. Исключение NoSuchElementException должно быть выброшено, потому что для него не было больше элементов в StringTokenizer и next(). Я просмотрел исходный код и нашел следующую часть кода в RawLocalFileSystem.java:

/// loads permissions, owner, and group from `ls -ld`
private void loadPermissionInfo() {
  IOException e = null;
  try {
    String output = FileUtil.execCommand(new File(getPath().toUri()), 
        Shell.getGetPermissionCommand());
    StringTokenizer t =
        new StringTokenizer(output, Shell.TOKEN_SEPARATOR_REGEX);
    //expected format
    //-rw-------    1 username groupname ...
    String permission = t.nextToken();

Насколько я вижу, Hadoop пытается выяснить некоторые разрешения для определенного файла с помощью ls -ld, который отлично работает, если я использую его в консоли. К сожалению, я еще не выяснил, какие права доступа к файлам он искал.

Версия Hadoop — 2.4.1, а версия HBase — 0.98.4, и я использую Java-API. Другие операции, такие как создание таблицы, работают нормально. Кто-нибудь сталкивался с подобными проблемами или знает, что делать?

EDIT: я только что узнал, что это просто проблема, связанная с Hadoop. Выполнение простейшей MapReduce-Operation даже без использования HDFS дает мне такое же исключение.


person maltesmann    schedule 18.08.2014    source источник


Ответы (1)


Не могли бы вы проверить, может ли это решить вашу проблему.

Если у вас проблема с разрешением, то это работает.

public static void main(String[] args) {
     //set user group information       
     UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hdfs");
     //set privilege exception
     ugi.doAs(new PrivilegedExceptionAction<Void>() {
     public Void run() throws Exception {
                //create configuration object
                 Configuration config = new Configuration();
                 config.set("fs.defaultFS", "hdfs://ip:port/");
                 config.set("hadoop.job.ugi", "hdfs");
                 FileSystem dfs = FileSystem.get(config);
                 .
                 .
person USB    schedule 11.09.2014
comment
Спасибо за Ваш ответ. Я уже решил эту проблему: оказалось, что я использовал неправильные зависимости, поэтому я начал использовать maven для управления зависимостями, и теперь все работает нормально. - person maltesmann; 11.09.2014