Почему чтение из 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.
Есть также некоторые другие источники, где вы можете найти обходные пути:
- https://issues.apache.org/jira/browse/SPARK-7442
- https://community.mapr.com/thread/9635
- Как получить доступ к файлам s3a:// из Apache Spark?
- https://community.hortonworks.com/articles/36339/spark-s3a-filesystem-client-from-hdp-to-access-s3.html
- https://community.hortonworks.com/articles/25523/hdp-240-and-spark-160-connecting-to-aws-s3-buckets.html
У меня нет среды (и опыта), чтобы попробовать вышеописанное, поэтому после того, как вы попробуете описанное выше, пожалуйста, сообщите, чтобы лучше понять текущую ситуацию с поддержкой S3 в Spark. Благодарю.