在 emr 中使用 spark 从 S3 读取 avro 失败

Posted

技术标签:

【中文标题】在 emr 中使用 spark 从 S3 读取 avro 失败【英文标题】:Fail reading avro from S3 using spark in emr 【发布时间】:2017-10-16 14:36:12 【问题描述】:

在 aws-emr 执行我的 Spark 作业时,尝试从 s3 存储桶读取 avro 文件时出现此错误: 它发生在版本中:

emr - 5.5.0 emr - 5.9.0

这是代码:

val files  = 0 until numOfDaysToFetch map  i =>
  s"s3n://bravos/clicks/$fromDate.minusDays(i)/*"

spark.read.format("com.databricks.spark.avro").load(files: _*)

例外:

java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: 1037330823653531755-2017-10-16T03:06:00.avro
    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:241)
    at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:1732)
    at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:1713)
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.globStatus(EmrFileSystem.java:362)
    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)

`

【问题讨论】:

请将您的代码块添加到问题中。 拜托,@ThiagoBaldim,我添加它 【参考方案1】:

Path 不支持冒号。它将 1037330823653531755-2017-10-16T03: 解释为 URI 模式,然后对任何填充的“/”不满意..即使它走到了那一步,它也会在“没有模式的文件系统”1037330823653531755-2017-10-16T03 上失败"

修正:不要在文件名中使用“:”。

【讨论】:

【参考方案2】:

我从 /* 中删除了最后一个 * 并且它正常工作

【讨论】:

以上是关于在 emr 中使用 spark 从 S3 读取 avro 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将 s3 数据从一个 EMR 集群读取到另一个 EMR 集群?

从 EMR Spark 处理 s3 gzip 文件的有效方法

来自EMR / Spark的S3写入速度非常慢

EMR 5.28 无法在 s3 上加载镶木地板文件

Spark:如何使用子集日期读取多个 s3 文件

使用 403 写入 S3 时,在 EMR 上运行的 Spark 偶尔会失败