Проблемы 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