Как получить доступ к файлу паркета в регионе us-east-2 из spark2.3 (используя hadoop aws 2.7)

Мы можем получить доступ к us-east-1 из нашего текущего кода, но мы не можем получить доступ к файлу parquet на us-east-2. Обратите внимание на соединение «us-east-2», создание datafream отлично работает на Intellij, но выдает ошибку 400, когда мы пытаемся из spark-shell.

Я пытался заставить его работать на искровой оболочке

/Пользователи/тест/Загрузки/spark-2.3.3-bin-hadoop2.7/bin/spark-shell --jars /Пользователи/тест/Загрузки/hadoop-aws-2.7.3.jar,/Пользователи/тест/Загрузки /aws-java-sdk-1.7.4.jar

val конфигурация = sc.hadoopConfiguration

configuration.set("fs.s3a.impl.disable.cache", "true");

configuration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");

configuration.set("fs.defaultFS", "s3a://parquet-dev");

configuration.set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")

configuration.set("fs.s3a.access.key", "xyz");

configuration.set("fs.s3a.secret.key","abc");

val имя_файла = "s3a://xyz:abc@parquet-dev/c000.snappy.parquet"

val df = spark.sqlContext.read.parquet(имя файла)

com.amazonaws.services.s3.model.AmazonS3Exception: Код состояния: 400, Сервис AWS: Amazon S3, Идентификатор запроса AWS: asadfas, Код ошибки AWS: null, Сообщение об ошибке AWS: Неверный запрос

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
408
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. fs.s3a.endpoint — правильный вариант; Я только что убедился, что это в Hadoop 2.7.
  2. вы не должны помещать секреты в URL-адрес имени файла, так как они регистрируются везде.
  3. и вам не нужно устанавливать значения fs.defaultFS или fs.s3a.impl

«Bad Request» — это довольно расплывчатая ошибка от amazon, это означает какую-то проблему с авторизацией, без каких-либо подробностей. Возможно, вам нужно переключиться на подписывание V4, что можно сделать только с JAR-файлами hadoop-2.7.x/AWS-1.7.x через свойства JVM. Другие сообщения о переполнении стека охватывают эту тему.

Если вы пытаетесь работать с S3 через коннектор S3A, вам лучше начать с обновления до Hadoop 2.9 JAR и затененного AWS SDK или 2.8.x как абсолютный минимум. В коде hadoop-aws произошли кардинальные изменения, и более свежий SDK aws также имеет большое значение.

Я решил это, почти так же, как вы сказали ... ниже более подробная информация в качестве ответа ..

Sunny Gupta 06.08.2019 19:42
Ответ принят как подходящий

Это простое изменение, но его трудно найти в документах AWS или где-либо еще.

Ниже приведены внесенные нами изменения (можно сделать код для конкретного языка)

spark-shell \
    --master local[4] \
    --driver-memory 2g \
    --conf 'spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
    --conf 'spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true' \
    --jars aws-java-sdk-1.7.4.jar,hadoop-aws-2.7.7.jar


System.getProperty("com.amazonaws.services.s3.enableV4")

sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
sc.hadoopConfiguration.set("fs.s3a.access.key", "access")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "secret")
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")

val fileName = "s3a://parquet123/c000.parquet"
val df = spark.sqlContext.read.parquet(fileName)
df.count

Немногие новые корзины s3 поддерживают только поддержку версии (версий) подписи v4, с которой старые SDK не работают, если вы не укажете

System.getProperty("com.amazonaws.services.s3.enableV4") sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")

и

--conf ‘spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true’ --conf ‘spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true’

System.getProperty("com.amazonaws.services.s3.enableV4") очень важен и должен быть установлен для всех исполнительных JVM, указав вышеуказанные флаги. Спасибо

Я рад, что все работает, но все же думаю, что вам следует перейти на hadoop 2.8.x или более позднюю версию для чтения данных Parquet или ORC. Была проделана большая работа по улучшению шаблонов случайного чтения операций ввода-вывода, используемых при чтении файлов, и специальный режим произвольного ввода-вывода fs.s3a.experimental.input.fadvise=random работает значительно быстрее. С Hadoop 2.7 всякий раз, когда ваш клиент делает большой шаг вперед или назад, все HTTP-соединение разрывается и согласовывается новое.

stevel 12.08.2019 21:32

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