Проблемы Hadoop HADOOP_CLASSPATH

Этот вопрос не относится к распределению банок по всему кластеру, чтобы работники могли их использовать.

Это относится к указанию ряда дополнительных библиотек на клиентском компьютере. Чтобы быть более конкретным: я пытаюсь выполнить следующую команду для получения содержимого SequenceFile:

   /path/to/hadoop/script fs -text /path/in/HDFS/to/my/file

Это выдает мне эту ошибку: text: java.io.IOException: WritableName can't load class: util.io.DoubleArrayWritable

У меня есть доступный для записи класс DoubleArrayWritable. На самом деле на другом компьютере все работает хорошо.

Я пытался установить HADOOP_CLASSPATH включить банку, содержащую этот класс, но без результатов. На самом деле, когда работает:

   /path/to/hadoop/script classpath 

Результат не содержит банку, которую я добавил в HADOOP_CLASSPATH.

Вопрос в том, как указать дополнительные библиотеки при запуске hadoop (имея в виду дополнительные библиотеки, отличные от тех, которые сценарий hadoop автоматически включает в classpath).

Еще немного информации, которая может помочь:

  • Я не могу изменить сценарий hadoop.sh (или любые связанные сценарии)
  • Я не могу скопировать свою библиотеку в каталог /lib в каталоге установки hadoop
  • В hadoop-env.sh, который запускается из hadoop.sh, есть эта строка: export HADOOP_CLASSPATH=$HADOOP_HOME/lib что, вероятно, объясняет, почему моя HADOOP_CLASSPATH env var игнорируется.

2 ответа

Решение

Если вам разрешено установить HADOOP_CLASSPATH затем

export HADOOP_CLASSPATH=/path/to/jar/myjar.jar:$HADOOP_CLASSPATH; \
    hadoop fs -text /path/in/HDFS/to/my/file

сделаю работу. Поскольку в вашем случае эта переменная переопределяется в hadoop-env.sh поэтому рассмотрите возможность использования -libjars вариант вместо:

hadoop fs -libjars /path/to/jar/myjar.jar -text /path/in/HDFS/to/my/file

Альтернативно вызвать FsShell вручную:

java -cp $HADOOP_HOME/lib/*:/path/to/jar/myjar.jar:$CLASSPATH \
org.apache.hadoop.fs.FsShell -conf $HADOOP_HOME/conf/core-site.xml \
-text /path/in/HDFS/to/my/file

Если кто-то хочет проверить classpath hadoop, введите hadoop classpath в терминале.
Чтобы скомпилировать это, используйте это: javac -cp $(hadoop classpath):path/to/jars/* java_file.java

Попробуйте добавить свой jar-файл в переменную CLASSPATH по умолчанию, а также добавить к нему HADOOP_CLASSPATH. Затем выполните вашу команду.

export CLASSPATH=/your/jar/file/myjar.jar:$CLASSPATH:$HADOOP_CLASSPATH /path/to/hadoop/script fs -text /path/in/HDFS/to/my/file

Другие вопросы по тегам