Почему чтение из Hive завершается с ошибкой "java.lang.ClassNotFoundException: класс org.apache.hadoop.fs.s3a.S3AFileSystem not found"?

Я использую Spark v1.6.1 и Hive v1.2.x с Python v2.7

Для Hive у меня есть несколько таблиц (ORC-файлов), хранящихся в HDFS, а некоторые хранятся в S3. Если мы пытаемся объединить 2 таблицы, одна из которых находится в HDFS, а другая - в S3, java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found брошен

Например, это работает при запросе к таблице HIVE в HDFS.

df1 = sqlContext.sql('select * from hdfs_db.tbl1')

Это работает при запросе к таблице HIVE в S3.

df2 = sqlContext.sql('select * from s3_db.tbl2')

Этот код ниже бросает выше RuntimeException,

sql = """
select *
from hdfs_db.tbl1 a
 join s3_db.tbl2 b on a.id = b.id
"""
df3 = sqlContext.sql(sql)

Мы переходим с HDFS на S3, и поэтому существует разница в том, что хранилище поддерживает таблицы HIVE (в основном, файлы ORC в HDFS и S3). Одна интересная вещь заключается в том, что если мы используем DBeaver или beeline клиенты подключаются к Hive и выдают присоединенный запрос, все работает. Я также могу использовать sqlalchemy оформить объединенный запрос и получить результат. Эта проблема отображается только в sqlContext от Spark.

Дополнительная информация о выполнении и среде: этот код выполняется в Jupyter Записная книжка на краевом узле (в которой уже есть spark, hadoop, hive, tez и т. д., настройка / настройка). Среда Python управляется conda для Python v2.7. Юпитер начинается с pyspark следующее.

IPYTHON_OPTS="notebook --port 7005 --notebook-dir='~/' --ip='*' --no-browser" \
 pyspark \
 --queue default \
 --master yarn-client

Когда я иду в интерфейс приложения Spark под Environment, следующие Classpath Entries имеет следующее.

  • /usr/hdp/2.4.2.0-258/spark/lib/datanucleus-api-jdo-3.2.6.jar
  • /usr/hdp/2.4.2.0-258/spark/lib/datanucleus-core-3.2.10.jar
  • /usr/hdp/2.4.2.0-258/spark/lib/datanucleus-rdbms-3.2.9.jar
  • /usr/hdp/2.4.2.0-258/spark/lib/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar
  • / USR / HDP / ток / Hadoop-клиент / CONF /
  • / USR / HDP / ток / искровым historyserver / CONF /

sun.boot.class.path имеет следующее значение: /usr/jdk64/jdk1.8.0_60/jre/lib/resources.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/rt.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/sunrsasign.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jsse.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jce.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/charsets.jar:/usr/jdk64/jdk1.8.0_60/jre/lib/jfr.jar:/usr/jdk64/jdk1.8.0_60/jre/classes,

spark.executorEnv.PYTHONPATH имеет следующее значение: /usr/hdp/2.4.2.0-258/spark/python/lib/py4j-0.9-src.zip:/usr/hdp/2.4.2.0-258/spark/python/:<CPS>{{PWD}}/pyspark.zip<CPS>{{PWD}}/py4j-0.9-src.zip,

Распределение Hadoop осуществляется через CDH: Hadoop 2.7.1.2.4.2.0-258

1 ответ

Цитирование Steve Loughran (который дал свой послужной список в разработке Spark, похоже, является источником правды о доступе к файловым системам S3) из SPARK-15965 Нет файловой системы для схемы: s3n или s3a spark-2.0.0 и spark-1.6.1:

Это исправлено тестами в моей работе в SPARK-7481; ручной обходной путь

Spark 1.6+ Для этого моего патча требуется перестройка сборки искры. Однако, как только этот патч будет установлен, попытка использовать сборку без JAR-файлов AWS остановит запуск искры - если вы не перейдете на Hadoop 2.7.3.

Есть также некоторые другие источники, где вы можете найти обходные пути:

У меня нет среды (и опыта), чтобы попробовать вышеописанное, поэтому после того, как вы попробуете описанное выше, пожалуйста, сообщите, чтобы лучше понять текущую ситуацию с поддержкой S3 в Spark. Благодарю.

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