我在星火中使用javaHiveContext执行一个连接。
这张大桌子是1,76 is,有1亿张唱片。
第二张表是273兆美元,有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),并在具有8核和20 it内存的5个节点上使用5个执行器,它将在100秒内执行。如果我不强制广播,它将在30秒内执行。
注:表存储为Parquet文件。
发布于 2015-12-07 19:26:00
问题的根源很可能是广播成本。为了简单起见,让我们假设在较大的RDD中有1800 in,在较小的RDD中有300 in。假设有5个执行器而以前没有分区,那么所有数据中的五分之一应该已经在正确的机器上了。在标准连接的情况下,它的洗牌容量为1700 of。
对于广播连接,必须将较小的RDD传输到所有节点。这意味着大约1500 be的数据将被传输。如果您添加了所需的与驱动程序的通信,这意味着您必须以一种更昂贵的方式移动相当数量的数据。必须首先收集经广播的数据,然后才能将数据转发给所有工人。
https://stackoverflow.com/questions/34139049
复制相似问题