Мы можем получить доступ к 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: Неверный запрос





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 также имеет большое значение.
Это простое изменение, но его трудно найти в документах 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-соединение разрывается и согласовывается новое.
Я решил это, почти так же, как вы сказали ... ниже более подробная информация в качестве ответа ..