带有 spark.read.text 的 Spark 2.0 索引 3 处的预期方案特定部分:s3:错误

Posted

技术标签:

【中文标题】带有 spark.read.text 的 Spark 2.0 索引 3 处的预期方案特定部分:s3:错误【英文标题】:Spark 2.0 with spark.read.text Expected scheme-specific part at index 3: s3: error 【发布时间】:2017-03-28 16:44:36 【问题描述】:

我在使用 spark 2.0 加载文本文件时遇到了一个奇怪的问题。目前我的火花配置看起来像:

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")

如果我通过 rdd 加载 s3a 文件,它可以正常工作。但是,如果我尝试使用类似的东西:

    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:

我是否需要为 sqlcontext 或 sparksession 添加一些额外的 s3a 配置?我还没有找到任何指定此问题的问题或在线资源。奇怪的是,该作业似乎运行了 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:)

【问题讨论】:

【参考方案1】:

这应该可行。

在您的 CP 上获取正确的 JAR(Spark 与 Hadoop 2.7,匹配 hadoop-aws JAR、aws-java-sdk-1.7.4.jar(正是这个版本)和 joda-time-2.9.3.jar(或以后的版本) 您不需要设置 fs.s3a.impl 值,因为这是在 hadoop 默认设置中完成的。如果您确实发现自己这样做了,那就是问题的征兆。

什么是完整的堆栈跟踪?

【讨论】:

这很奇怪,但谢谢。这是我的 aws-java-sdk 版本。我找了很长时间,但没有找到这方面的文档。它是否在某个地方列出了火花? Spark 目前没有正确获取其对象存储依赖项,因为它不会自动拉入 AWS 的东西,SPARK-7481 带有这个补丁——如果你去那里长期存在的拉取请求,并明确说明了为什么它对您很重要。 今天用更新运行它,我仍然有问题。奇怪的是,它在 8-10 分钟后失败了。我认为错误消息是一个红鲱鱼。 无论如何都要添加整个堆栈:我现在很好奇 谢谢。我在上面加了。

以上是关于带有 spark.read.text 的 Spark 2.0 索引 3 处的预期方案特定部分:s3:错误的主要内容,如果未能解决你的问题,请参考以下文章

pyspark中的dataframe的观察操作

存储为字符串变量时如何执行spark sql多行查询?

01Spar内核架构原理

如何在并行火花中运行转换

Spark- Spar架构原理

将每个文件激发到数据集行