在Spark中禁用镶木地板元数据摘要

Pie*_*ave 7 apache-spark parquet

我有一个火花工作(1.4.1)接收卡夫卡事件流.我想在tachyon上不断保存它们作为镶木地板.

val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2)

lines.window(Seconds(1), Seconds(1)).foreachRDD { (rdd, time) =>
  if (rdd.count() > 0) {
    val mil = time.floor(Duration(86400000)).milliseconds
    hiveContext.read.json(rdd).toDF().write.mode(SaveMode.Append).parquet(s"tachyon://192.168.1.12:19998/persisted5$mil")
    hiveContext.sql(s"CREATE TABLE IF NOT EXISTS persisted5$mil USING org.apache.spark.sql.parquet OPTIONS ( path 'tachyon://192.168.1.12:19998/persisted5$mil')")
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,我发现随着时间的推移,每次镶木地板上都会产生火花,每1秒的镶木地板部件会产生火花,速度越来越慢

15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-db03b24d-6f98-4b5d-bb40-530f35b82633.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-3a7857e2-0435-4ee0-ab2c-6d40224f8842.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-47ff2ac1-da00-4473-b3f7-52640014bc5b.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-61625436-7353-4b1e-bb8d-e8afad3a582e.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-e711aa9a-9bf5-41d5-8523-f5edafa69626.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-4e0cca38-cf75-4771-8965-20a30c863100.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-d1510ed4-2c99-43e2-b3d1-38d3d54e626d.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-022d1918-392d-433f-a7f4-074e46b4460f.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-cf71f5d2-ba0e-4729-9aa1-41dad5d1d08f.gz.parquet, 65536)
15/08/22 22:04:05 INFO : open(tachyon://192.168.1.12:19998/persisted51440201600000/part-r-00000-ce990b1e-82cc-4feb-a162-ac3ddc275609.gz.parquet, 65536)
Run Code Online (Sandbox Code Playgroud)

我得出结论,这是由于摘要数据的更新,我相信spark不会利用它们.所以我想禁用它

镶木地板来源显示我应该能够将"parquet.enable.summary-metadata"设置为false.

现在,我已经尝试在创建hiveContext之后立即设置它

hiveContext.sparkContext.hadoopConfiguration.setBoolean("parquet.enable.summary-metadata", false)
hiveContext.sparkContext.hadoopConfiguration.setInt("parquet.metadata.read.parallelism", 10) 
Run Code Online (Sandbox Code Playgroud)

但是没有成功,我还会得到显示5(默认)并行度的日志.

使用镶木地板禁用spark中的摘要数据的正确方法是什么?

Arn*_*-Oz 12

将"parquet.enable.summary-metadata"设置为文本("false"而非false)似乎对我们有用.

顺便说一句,Spark确实使用_common_metadata文件(我们手动复制那些重复的工作)


Ste*_*ran 11

Spark 2.0不再默认保存元数据摘要,请参阅SPARK-15719.

如果您正在使用S3中托管的数据,您可能仍会发现镶木地板本身的镶木地板性能试图扫描所有对象的尾部以检查其模式.可以明确禁用它

sparkConf.set("spark.sql.parquet.mergeSchema", "false")
Run Code Online (Sandbox Code Playgroud)

  • “由于模式合并是一项相对昂贵的操作,并且在大多数情况下不是必需的,因此默认情况下,我们从1.5.0开始将其关闭。”-[Spark docs](https://spark.apache.org/docs/最新/sql-programming-guide.html#schema-合并) (2认同)