Подтвердить что ты не робот

Как получить доступ к файлам s3a://из Apache Spark?

Hadoop 2.6 не поддерживает s3a из коробки, поэтому я пробовал ряд решений и исправлений, в том числе:

развернуть с hadoop-aws и aws-java-sdk = > не может прочитать переменную окружения для учетных данных добавить hadoop-aws в maven = > различные конфликты транзитивной зависимости

Кто-нибудь успешно делает обе работы?

4b9b3361

Ответ 1

Почувствовав из первых рук разницу между s3a и s3n - 7,9 ГБ данных, переданных на s3a, было около ~ 7 минут, тогда как 7,9 ГБ данных на s3n заняло 73 минуты [us-east-1 to us-west-1, к сожалению, в обоих случаях; Redshift и Lambda, являющиеся нами-восточным-1 в это время], это очень важная часть стека, чтобы получить правильное решение, и это стоит разочарования.

Вот ключевые части, по состоянию на декабрь 2015 года:

  1. Для вашего Spark-кластера потребуется версия Hadoop 2.x или выше. Если вы используете скрипты установки Spark EC2 и, возможно, пропустили его, переключатель для использования чего-либо, кроме 1.0, должен указать --hadoop-major-version 2 (который использует CDH 4.2 на момент написания этой статьи).

  2. Вам нужно будет включить то, что поначалу может показаться устаревшей библиотекой AWS SDK (построенной в 2014 году как версия 1.7.4) для версий Hadoop до версии 2.7.1 (стабильная): aws-java-sdk 1.7 +0,4. Насколько я могу судить, используя это вместе со специфическими JAR AWS SDK для 1.10.8, ничего не сломалось.

  3. Вам также понадобится хаоп-aws 2.7.1 JAR на пути к классам. Этот JAR содержит класс org.apache.hadoop.fs.s3a.S3AFileSystem.

  4. В spark.properties вы, вероятно, хотите некоторые настройки, которые выглядят так:

    spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem  
    spark.hadoop.fs.s3a.access.key=ACCESSKEY  
    spark.hadoop.fs.s3a.secret.key=SECRETKEY
    

Я подробно описал этот список в сообщении, которое я написал, когда работал над этим процессом. Кроме того, я рассмотрел все случаи исключения, которые я ударил по пути и что я считаю причиной каждого и как их исправить.

Ответ 2

Я получил его, работая с исходным двоичным кодом Spark 1.4.1 с hadoop 2.6 Убедитесь, что вы установили как spark.driver.extraClassPath, так и spark.executor.extraClassPath, указывающие на две банки (hadoop-aws и aws-java-sdk) Если вы запускаете кластер, убедитесь, что ваши исполнители имеют доступ к файлам jar в кластере.

Ответ 3

Я пишу этот ответ для доступа к файлам с S3A от Spark 2.0.1 на Hadoop 2.7.3

Скопируйте hadoop-aws-2.7.3.jar AWS (hadoop-aws-2.7.3.jar и aws-java-sdk-1.7.4.jar), которые по умолчанию поставляются с Hadoop

  • Подсказка: если места в банке не уверены? запуск команды find в качестве привилегированного пользователя может быть полезен, команды могут быть.

     find / -name hadoop-aws*.jar
     find / -name aws-java-sdk*.jar
    

в искровой класс, который содержит все искровые баки

  • Подсказка: мы не можем напрямую указать местоположение (оно должно быть в файле свойств), поскольку я хочу сделать ответ общим для дистрибутивов и Linux-вкусов. Исходный путь пути может быть идентифицирован командой find ниже

     find / -name spark-core*.jar
    

в spark-defaults.conf

Подсказка: (В основном это будет помещено в /etc/spark/conf/spark-defaults.conf)

#make sure jars are added to CLASSPATH
spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar


spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem  
spark.hadoop.fs.s3a.access.key={s3a.access.key} 
spark.hadoop.fs.s3a.secret.key={s3a.secret.key} 
#you can set above 3 properties in hadoop level 'core-site.xml' as well by removing spark prefix.

в spark submit включают jars (aws-java-sdk и hadoop-aws) в --driver-class-path если это необходимо.

spark-submit --master yarn \
  --driver-class-path {spark/jars/home/dir}/aws-java-sdk-1.7.4.jar \
  --driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \
  other options

Замечания:

Убедитесь, что пользователь Linux с привилегиями чтения, перед запуском команды find чтобы предотвратить ошибку.

Ответ 4

Мы используем искру 1.6.1 с Mesos, и у нас появилось много проблем, связанных с S3 от искры. Я отвечаю за cfeduke за ответ. Небольшое изменение, которое я сделал, заключалось в добавлении координат maven в конфигурацию spark.jar в файле spark-defaults.conf. Я пробовал с hadoop-aws: 2.7.2, но все еще получал много ошибок, поэтому мы вернулись к 2.7.1. Ниже приведены изменения в spark-defaults.conf, которые работают для нас:

spark.jars.packages             net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1
spark.hadoop.fs.s3a.impl        org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key  <MY ACCESS KEY>
spark.hadoop.fs.s3a.secret.key  <MY SECRET KEY>
spark.hadoop.fs.s3a.fast.upload true

Спасибо, cfeduke за то, что нашли время, чтобы написать свой пост. Это было очень полезно.

Ответ 5

Вот подробности на октябрь 2016 года, представленные на Spark Summit EU: Apache Spark и Object Stores.

Ключевые моменты

  • Прямой выходной коммиттер исчез из Spark 2.0 из-за риска/опыта повреждения данных.
  • Есть несколько настроек в FileOutputCommitter для уменьшения переименований, но не устранения их
  • Я работаю с некоторыми коллегами, чтобы сделать коммиттер O (1), полагаясь на Apache Dynamo, чтобы дать нам такую последовательность, в которой мы нуждаемся.
  • Чтобы использовать S3a, получите правильный путь к классу.
  • И будьте на Hadoop 2.7.z; 2.6.x имели некоторые проблемы, которые были решены тогда HADOOP-11571.
  • Там есть PR под SPARK-7481, чтобы вытащить все в источник искры, который вы строите сами. В противном случае спросите, кто бы ни поступил в двоичные файлы, чтобы выполнить эту работу.
  • Hadoop 2.8 собирается добавить основные усовершенствования HADOOP-11694.

Размещение продукта: сторона HADOOP-11694 с поддержкой чтения и записи включена в HDP2.5; Документация Spark и S3 может представлять интерес, особенно варианты настройки.

Ответ 6

Используя Spark 1.4.1, предварительно построенный с Hadoop 2.6, я могу заставить s3a://работать при развертывании в кластер Spark Standalone, добавив файлы хаоса-aws и aws-java-sdk jar из Hadoop 2.7.1 distro (найденный в $HADOOP_HOME/share/hadoop/tools/lib из Hadoop 2.7.1) в мою переменную среды SPARK_CLASSPATH в файле $SPARK_HOME/conf/spark-env.sh.

Ответ 7

как вы сказали, hasoop 2.6 не поддерживает s3a, а последний искровой разряд 1.6.1 не поддерживает hadoop 2.7, но искру 2.0 определенно не проблема с hadoop 2.7 и s3a.

для искры 1.6.x, мы сделали какой-то грязный взлом, с драйвером s3 из EMR... вы можете посмотреть этот документ: https://github.com/zalando/spark-appliance#emrfs-support

если вы все еще хотите попробовать использовать s3a в spark 1.6.x, см. ответ здесь: fooobar.com/questions/278399/...

Ответ 8

Вы также можете добавить зависимости S3A к пути к классам, используя spark-defaults.conf.

Пример:

spark.driver.extraClassPath     /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.executor.extraClassPath   /usr/local/spark/jars/hadoop-aws-2.7.5.jar
spark.driver.extraClassPath     /usr/local/spark/jars/aws-java-sdk-1.7.4.jar
spark.executor.extraClassPath   /usr/local/spark/jars/aws-java-sdk-1.7.4.jar

Или просто:

spark.jars     /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-java-sdk-1.7.4.jar

Просто убедитесь, что ваша версия AWS SDK соответствует версии Hadoop. Для получения дополнительной информации об этом, посмотрите на этот ответ: невозможно получить доступ к данным S3 с помощью Spark 2.2

Ответ 9

Здесь решение для pyspark (возможно, с прокси):

def _configure_s3_protocol(spark, proxy=props["proxy"]["host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]):
    """
    Configure access to the protocol s3
    https://sparkour.urizone.net/recipes/using-s3/
    AWS Regions and Endpoints
    https://docs.aws.amazon.com/general/latest/gr/rande.html
    """
    sc = spark.sparkContext
    sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key",  os.environ.get("AWS_ACCESS_KEY_ID"))
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.host", proxy)
    sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port)
    sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint)
    return spark

Ответ 10

Вы можете использовать s3n://и изменить коммандер искрового испускания на тот, который напрямую выводит файл (см. этот фрагмент)

Ответ 11

Я использую искру версии 2.3, и когда я сохраняю набор данных с использованием искры вроде:

dataset.write().format("hive").option("fileFormat", "orc").mode(SaveMode.Overwrite)
    .option("path", "s3://reporting/default/temp/job_application")
    .saveAsTable("job_application");

Он отлично работает и сохраняет мои данные в s3.