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

2019-05-12 08:23发布

我执行联接使用javaHiveContext的星火。

大表是1,76Gb并有100个百万记录。

第二个表是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秒内执行。

NB表存储为文件的实木复合地板。

Answer 1:

最有可能的问题的根源是广播的成本。 为了让事情简单让我们假设你在较小的一个较大的RDD和300MB具有1800MB。 假设5个遗嘱执行人,并没有以前的分区的所有数据的五分之一应该是已经在正确的机器上。 它左派〜1700MB在标准情况下,加入洗牌。

对于广播加入小RDD已被转移到所有节点。 这意味着各地要传输1500MB数据。 如果添加与驱动程序所需要的通信就意味着你要在一个更昂贵的方式移动数据相当量。 广播的数据必须收集第一个也是唯一可转发到所有的工人之后。



文章来源: Why my BroadcastHashJoin is slower than ShuffledHashJoin in Spark