Spark RDD vs DataSet性能

时间:2017-04-10 18:58:28

标签: apache-spark spark-streaming

我是Spark的新手。我正在尝试将Spark 2.1版本用于CEP目的。 在最近2分钟内检测丢失的事件。我将收到的输入转换为JavaDSStream的输入事件,然后在inputEvents上执行reducebykeyandWindow并执行spark sql。

 JavaPairDStream<String, Long> reduceWindowed =   inputEvents.reduceByKeyAndWindow(new MaxTimeFuntion(),
                Durations.seconds(124), new Duration(2000));
 reduceWindowed.foreachRDD((rdd, time) -> {
              SparkSession spark = TestSparkSessionSingleton.getInstance(rdd.context().getConf()); 
              JavaRDD<EventData> rowRDD = rdd.map(new org.apache.spark.api.java.function.Function<Tuple2<String,Long>, EventData>() {
                    @Override
                    public EventData call(Tuple2<String, Long> javaRDD) {
                    {
                           EventData record = new EventData ();
                            record.setId(javaRDD._1); 
                            record.setEventTime(javaRDD._2);
                             return record;               
                    }
              })
    Dataset<Row> eventDataFrames = spark.createDataFrame(rowRDD, EventData.class);
     eventDataFrames.createOrReplaceTempView("checkins");  


Dataset<Row> resultRows=                         
                    spark.sql("select id, max(eventTime) as maxval,  from events group by id having (unix_timestamp()*1000 - maxval >= 120000)");

我使用RDD函数执行相同的过滤:

JavaPairDStream<String, Long> filteredStream = reduceWindowed.filter(new Function<Tuple2<String,Long>, Boolean>() {

        public Boolean call(Tuple2<String,Long> val)
        {
           return (System.currentTimeMillis() - val._2() >= 120000);
       }
    });

    filteredStream.print();

这两种方法都为数据集和数据提供了相同的结果。 RDD。

我是否正确使用Spark sql。

在本地模式下,对于相同的输入速率,Spark SQL查询执行会比RDD函数消耗相对较高的CPU。任何人都可以帮助我理解为什么Spark SQL与RDD过滤器功能相比消耗相对较高的CPU ..

1 个答案:

答案 0 :(得分:1)

Spark SQL使用催化剂(SQL优化器),它执行:

  1. 分析sql查询
  2. 进行一些逻辑优化
  3. 添加一些物理规划
  4. 生成一些代码
  5. DataSet在内部对外部JVM对象进行排序。可以使用类型安全+快速。比DataFrame慢,不如交互式分析好。 Dataset API作为 Spark 1.6 中的API预览版发布,旨在提供两全其美的优势;熟悉的面向对象编程风格和RDD API的编译时类型安全性,但具有Catalyst查询优化器的性能优势。数据集也使用与DataFrame API相同的高效堆外存储机制。

    另一方面,RDD只是一个弹性分布式数据集,它更像是一个无法优化的数据黑盒,可以对其执行操作,不受限制。