Spark 2.0 с spark.read.text Ожидаемая часть, специфичная для схемы, с индексом 3: s3: error

У меня возникла странная проблема с Spark 2.0, когда я использую Sparksession для загрузки текстового файла. В настоящее время моя конфигурация искры выглядит так:

val sparkConf = new SparkConf().setAppName("name-here")
sparkConf.registerKryoClasses(Array(Class.forName("org.apache.hadoop.io.LongWritable"), Class.forName("org.apache.hadoop.io.Text")))
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
val spark = SparkSession.builder()
    .config(sparkConf)
    .getOrCreate()
spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.enableServerSideEncryption", "true")
spark.sparkContext.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")

Если я загружаю файл s3a через rdd, он работает нормально. Однако, если я попытаюсь использовать что-то вроде:

    val blah = SparkConfig.spark.read.text("s3a://bucket-name/*/*.txt")
        .select(input_file_name, col("value"))
        .drop("value")
        .distinct()
    val x = blah.collect()
    println(blah.head().get(0))
    println(x.size)

Я получаю исключение, которое говорит: java.net.URISyntaxException: Expected scheme-specific part at index 3: s3:

Нужно ли мне добавить дополнительную конфигурацию s3a для sqlcontext или sparksession? Я не нашел ни одного вопроса или онлайн-ресурса, в котором это уточняется. Странно то, что кажется, что задание выполняется в течение 10 минут, но затем завершается ошибкой из-за этого исключения. Опять же, при использовании того же ведра и всего остального, обычная загрузка rdd не вызывает проблем.

Другая странность заключается в том, что он жалуется на s3, а не на s3a. Я трижды проверил свой префикс, и он всегда говорит s3a.

Изменить: проверено как s3a, так и s3, оба выдают одно и то же исключение.

17/04/06 21:29:14 ERROR ApplicationMaster: User class threw exception: 
java.lang.IllegalArgumentException: java.net.URISyntaxException: 
Expected scheme-specific part at index 3: s3:
java.lang.IllegalArgumentException: java.net.URISyntaxException: 
Expected scheme-specific part at index 3: s3:
at org.apache.hadoop.fs.Path.initialize(Path.java:205)
at org.apache.hadoop.fs.Path.<init>(Path.java:171)
at org.apache.hadoop.fs.Path.<init>(Path.java:93)
at org.apache.hadoop.fs.Globber.glob(Globber.java:240)
at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:1732)
at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:1713)
at org.apache.spark.deploy.SparkHadoopUtil.globPath(SparkHadoopUtil.scala:237)
at org.apache.spark.deploy.SparkHadoopUtil.globPathIfNecessary(SparkHadoopUtil.scala:243)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:374)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:370)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.immutable.List.flatMap(List.scala:344)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:370)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152)
at org.apache.spark.sql.DataFrameReader.text(DataFrameReader.scala:506)
at org.apache.spark.sql.DataFrameReader.text(DataFrameReader.scala:486)
at com.omitted.omitted.jobs.Omitted$.doThings(Omitted.scala:18)
at com.omitted.omitted.jobs.Omitted$.main(Omitted.scala:93)
at com.omitted.omitted.jobs.Omitted.main(Omitted.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:637)
Caused by: java.net.URISyntaxException: Expected scheme-specific part 
at index 3: s3:
at java.net.URI$Parser.fail(URI.java:2848)
at java.net.URI$Parser.failExpecting(URI.java:2854)
at java.net.URI$Parser.parse(URI.java:3057)
at java.net.URI.<init>(URI.java:746)
at org.apache.hadoop.fs.Path.initialize(Path.java:202)
... 26 more
17/04/06 21:29:14 INFO ApplicationMaster: Final app status: FAILED, 
exitCode: 15, (reason: User class threw exception: 
java.lang.IllegalArgumentException: java.net.URISyntaxException: 
Expected scheme-specific part at index 3: s3:)

person Derek_M    schedule 28.03.2017    source источник


Ответы (1)


Это должно сработать.

  • получите правильные JAR-файлы на своем CP (Spark с Hadoop 2.7, соответствующий JAR-файл hadoop-aws, aws-java-sdk-1.7.4.jar (именно эта версия) и joda-time-2.9.3.jar (или более поздняя версия) )
  • вам не нужно устанавливать значение fs.s3a.impl, как это сделано в настройках по умолчанию для hadoop. Если вы обнаружите, что делаете это, это признак проблемы.

Что такое полная трассировка стека?

person stevel    schedule 31.03.2017
comment
Странно, но спасибо. Это была моя версия aws-java-sdk. Я очень долго искал, но не нашел по этому поводу документации. Это где-то указано для искры? - person Derek_M; 01.04.2017
comment
В настоящее время Spark неправильно понимает зависимости своего хранилища объектов, потому что он не загружает материалы AWS автоматически, SPARK-7481 содержит исправление для этого - было бы здорово, если бы вы отправились на давний запрос на перенос и сделали понятно, почему это важно для вас. - person stevel; 03.04.2017
comment
Пробежал сегодня с обновлениями, а проблемы остались. Что странно, он выходит из строя через 8-10 минут. Я думаю, что сообщение об ошибке - отвлекающий маневр. - person Derek_M; 07.04.2017
comment
все равно добавить весь стек: мне любопытно - person stevel; 07.04.2017
comment
Спасибо. Я добавил это выше. - person Derek_M; 07.04.2017
comment
Также следует добавить, что в этом ведре включено шифрование. - person Derek_M; 07.04.2017
comment
Ok. Что-то звонит Dataframe.text("s3:"); s3: отклоняется как недопустимый URI. Что касается того, как это происходит, ваши фрагменты кода, я подозреваю, - person stevel; 12.04.2017