寻找关于Spark DStream到Parquet文件的性能提示

时间:2019-04-01 20:31:12

标签: java apache-spark spark-streaming

我想不使用ES-Hadoop Connector将Elasticsearch索引存储到HDFS文件。 一种建议的解决方案是使用流式自定义接收器读取并另存为实木复合地板文件,并且代码类似于

JavaDStream<String> jsonDocs = ssc.union(dsList.get(0), dsList.subList(1, dsList.size())); // I have a couple receivers
jsonDocs.foreachRDD( rdd -> {
    Dataset<Row> ds = spark.read().json(spark.createDataset(rdd.rdd(), Encoders.STRING()));
    ds.write().mode(SaveMode.Append).option("compression","gzip").parquet(path); 

有了这个,我得到了一些不错的性能指标,但是,由于我是Spark的新手,我想知道是否还有任何改进的余地。 例如,我看到json()和parquet()作业花费大部分时间,而json()作业是否需要较长时间呢?还是可以避免? (为简单起见,我从代码段中省略了其他一些工作,例如count()。)

使用结构化流看起来不错,但尚未找到“自定义接收器流”的简单解决方案。 预先感谢,

1 个答案:

答案 0 :(得分:0)

spark.read().json(spark.createDataset(rdd.rdd(), Encoders.STRING()));

从上面看,对于性能敏感的工作,读取json()可能不是最好的方法。 Spark在其数据源api中使用JacksonParser来读取json。如果您的json结构很简单,请尝试使用map()函数自己解析它以创建Row。