Spark SQL中实现Hive MapJoin
来源:互联网 发布:c语言大小写转化 编辑:程序博客网 时间:2024/06/05 00:19
转载地址:
http://lxw1234.com/archives/2015/06/296.htm
在Hive中,如果一个很大的表和一个小表做join,Hive可以自动或者手动使用MapJoin,将小表的数据加载到DistributeCache中,从而在使用Map Task扫描大表的同时,完成join,这对join的性能提升非常多。
在SparkSQL中,目前还不支持自动或者手动使用MapJoin。变通的方法是,将小表进行cache,然后再和大表做join。SparkSQL中cache的作用就是将小表数据广播到每一个Worker的内存中,和加载到DistributeCache中是一个道理。
具体实现如下:
上面SQL中,大表 lxw1234.t_log 有3亿多条记录,而小表 lxw1234.t_config 中只有1000多条,一般情况下,SparkSQL的执行计划如下图所示:
可以看出,先分别扫描两张表,之后在做ShuffledHashJoin,而在这一步,由于小表数据量非常小,也就是能关联上的键值很少,因此这里发生了数据倾斜,导致最后的几个task处理的数据量非常大,直到内存溢出而报错,如图:
SparkSQL中提供了CACHE TABLE的命令,可以将一个表或者查询进行广播,命令如下:
这样,等于是将t_config这张table加载到DistributeCache中,接下来再用这张内存表和大表做join:
再看执行计划:
这次,在一个Stage中,便完成了大表的扫描和与小表的BroadcastHashJoin,性能上自然不用说了,很快就跑完了。
在Hive中试了下同样的语句,Hive中走MapJoin,使用的时间比SparkSQL中多近50%,但需要注意的是,Hive中MapReduce消耗的资源,
却是SparkSQL消耗资源的好几倍,这也证实,尽管是从HDFS中读数据,Spark仍然要优于MapReduce。
另外,SparkSQL从Hive表(HDFS)中读数据,全部用的NODE_LOCAL task,如果是ANY,那就要慢一些了,而且会消耗很大的网络资源。
转载请注明:lxw的大数据田地 » Spark SQL中实现Hive MapJoin
- Spark SQL中实现Hive MapJoin
- Spark SQL中实现Hive MapJoin
- Hive中Mapjoin的使用
- hive sql优化-join Mapjoin Group by
- hive mapjoin
- Hive MapJoin
- Hive mapjoin 与 Bucket mapjoin
- spark-sql部署实现与Hive交互
- spark-sql部署实现与Hive交互
- HIVE中MAPJOIN可以使用的场景分析
- HIVE中MAPJOIN可以使用的场景分析
- HIVE中MAPJOIN可以使用的场景分析
- HIVE中MAPJOIN可以使用的场景分析<转>
- HIVE中MAPJOIN可以使用的场景分析
- HIVE中MAPJOIN可以使用的场景分析
- HIVE中MAPJOIN可以使用的场景分析
- hive mapjoin使用
- hive MapJoin优化
- mac上现在使用item2作为终端
- EhCache 分布式缓存/缓存集群
- 模拟同步流式Socket通信
- WebSocket协议详解及应用
- ODI环境搭建_06配置代理
- Spark SQL中实现Hive MapJoin
- android studio从svn上检出项目以及可能遇到的一些问题
- ios学习--IOS 3DES加密解密
- 常数e的含义
- jQuery Mobile
- ubuntu小技巧6——如何修复Ubuntu系统引导项
- POJ 2421 Constructing Roads
- iOS UIAlertController提示框控制器
- 完整的R语言预测建模实例-从数据清理到建模预测