【问题标题】:spark RDD union action very slowspark RDD联合行动非常慢
【发布时间】:2015-09-02 22:48:37
【问题描述】:

我有 2 个 spark RDD,dataRDD 和 newPairDataRDD,它们用于 spark SQL 查询。 当我的应用程序初始化时,dataRDD 将被初始化。一个指定的 hbase 实体中的所有数据都将存储到 dataRDD。

当客户端的 sql 查询到来时,我的 APP 将获取所有新的更新和插入到 newPairDataRDD。 dataRDD 联合 newPairDataRDD 并在 Spark SQL 上下文中注册为表。

我什至在 dataRDD 中发现了 0 条记录,在 newPairDataRDD 中发现了 1 条新插入记录。联合需要 4 秒。太慢了

我认为这是不合理的。任何人都知道如何使它更快?谢谢 简单代码如下

    // Step1: load all data from hbase to dataRDD when initial, this only run once. 
    JavaPairRDD<String, Row>  dataRDD= getAllBaseDataToJavaRDD();
    dataRDD.cache();
    dataRDD.persist(StorageLevel.MEMORY_ONLY());
    logger.info(dataRDD.count());

    // Step2: when spark sql query coming, load latest updated and inserted data from db to newPairDataRDD

    JavaPairRDD<String, Row> newPairDataRDD = getUpdateOrInstertBaseDataToJavaRDD();
    // Step3: if count>0 do union and reduce

       if(newPairDataRDD.count() > 0) {

        JavaPairRDD<String, Row> unionedRDD =dataRDD.union(newPairDataRDD);

    // if data was updated in DB, need to delete the old version from the dataRDD.

        dataRDD = unionedRDD.reduceByKey(
            new Function2<Row, Row, Row>() {
            // @Override
            public Row call(Row r1, Row r2) {
             return r2;
             }
            });
    }
//step4: register the dataRDD
JavaSchemaRDD schemaRDD = sqlContext.applySchema(dataRDD..values(), schema);

//step5: execute sql query
retRDD = sqlContext.sql(sql);
List<org.apache.spark.sql.api.java.Row> rows = retRDD.collect();

从 spark web ui,我可以看到下面。显然它需要 4s 来联合

已完成阶段 (8)

StageId 描述 Submitted Duration Tasks: Succeeded/Total Input Shuffle Read Shuffle Write

6 收集于 SparkPlan.scala:85+details 1/4/2015 8:17 2 s 8-Aug 156.0 B

7 union at SparkSqlQueryForMarsNew.java:389+details 1/4/2015 8:17 4 s 8-Aug 64.0 B 156.0 B

【问题讨论】:

  • 你确定是工会吗?该操作只是连接分区,因此并不需要时间。
  • 请发布您的代码。也许有一个重要的细节可以解释时间。正如肖恩所说,这不应该花太多时间。
  • 有缓存操作,应该是需要时间的
  • 我知道缓存需要时间,但在我的帖子中,时间只是为了联合。我更新了我的帖子并添加了 spark web ui 运行结果。连RDD1都没有数据。当RDD2有1个数据时。从 spark web ui 运行结果。您可以看到仅 union 需要 4s,collect() 需要 2s。

标签: apache-spark


【解决方案1】:

您监控的是两个 .count() 调用的时间,而不是 .union() 的时间,后者由调度程序分组在同一阶段,实际上是 Spark 中的一个非常长的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2016-11-18
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多