3

环境:

spark-1.2.0-bin-hadoop2.4

spark-submit --class MyClass \
--master yarn-client \ 
 --num-executors 20 --executor-memory 5g \
--driver-memory 4g --executor-cores 4 \
 MyJar.jar

大家好,

最近我得到一个查询,它在同一张表上加入

SELECT columns_I_need
FROM
    ( 
        SELECT blablabla,column_for_join
        FROM a_huge_table
        WHERE common_expr AND expr_A
    ) a
LEFT JOIN

    ( 
        SELECT somethingelse,column_for_join
        FROM a_huge_table
        WHERE common_expr AND expr_B
    ) b
ON a.column_for_join = b.column_for_join
GROUP BY
columns_I_need

a_huge_table是一个非常大的并且column_for_join没有索引(我不是 DBA,我无能为力 - 他们拒绝)

此查询在 Hive CLI 中需要 3~5 分钟(2 个阶段,总共 <200 个映射),但是在使用时HiveContext.sql(),事情以非常糟糕的方式崩溃 -> 4 个阶段,30 分钟/阶段。

使用spark.sql.codegen将阶段数减少到2,但每个阶段的时间成本不会减少。由于这个表只会被使用一次,我认为 HiveContext.CacheTable() 不会有太大帮助。我猜火花中使用的方法与蜂巢有些不同。

我尝试挖掘火花源,发现很难理解:HiveContext.sql(SqlText)return SchemaRDD(HiveContext, LogicalPlan_Created_by_Parser_using_SqlText ),我看到 LogicalPlan 用于 trait SchemaRDDLike=> sqlContext.executePlan=> executedPlan.execute()=>SparkPlan.execute()但我找不到SparkPlan.execute()任何覆盖版本称为SELECT. 然后我就卡住了。我仍然不明白 spark 如何从 hive 中获取数据。

那么 Spark SQL 是如何工作的呢?我想知道是否有任何文档可以阅读以更好地理解 Spark SQL?

顺便说一句,HiveContext().sql():SchemaRDD没有了,master 分支的版本现在是HiveContext().sql():DataFrame. 他们改变事物的速度如此之快。

4

0 回答 0