为什么我的BroadcastHashJoin比Spark中的ShuffledHashJoin慢

时间:2015-12-07 16:59:59

标签: hadoop apache-spark hive

我在Spark中使用javaHiveContext执行连接。

大表是1,76Gb,有1亿条记录。

第二张表是273Mb,有1000万条记录。

我收到JavaSchemaRDD,我就打电话给count()

String query="select attribute7,count(*) from ft,dt where ft.chiavedt=dt.chiavedt group by attribute7";

JavaSchemaRDD rdd=sqlContext.sql(query);

System.out.println("count="+rdd.count());

如果我强制broadcastHashJoin (SET spark.sql.autoBroadcastJoinThreshold=290000000)并在5节点上使用5个执行器,其中包含8个核心和20Gb内存,则会在100秒内执行。 如果我不强制广播,则会在30秒内执行。

N.B。表格存储为Parquet文件。

1 个答案:

答案 0 :(得分:7)

问题的根源很可能是广播费用。为简单起见,我们假设您在较大的RDD中有1800MB而在较小的RDD中有300MB。假设有5个执行器且没有先前的分区,则所有数据中的五分之一应该已经在正确的机器上。在标准连接的情况下,它可以移动~1700MB进行改组。

对于广播加入,必须将较小的RDD转移到所有节点。这意味着要传输大约1500MB的数据。如果您使用驱动程序添加所需的通信,则意味着您必须以更昂贵的方式移动相当数量的数据。必须首先收集广播的数据,然后才能将其转发给所有工作人员。