在Hive中,如果一个很大的表和一个小表做join,Hive可以自动或者手动使用MapJoin,将小表的数据加载到DistributeCache中,从而在使用Map Task扫描大表的同时,完成join,这对join的性能提升非常多。
在SparkSQL中,目前还不支持自动或者手动使用MapJoin。变通的方法是,将小表进行cache,然后再和大表做join。 SparkSQL中cache的作用就是将小表数据广播到每一个Worker的内存中,和加载到DistributeCache中是一个道理。
具体实现如下:
create table t_lxw1234 as SELECT a.cookieid, b.brand, a.orderid AS ad_activity_id, a.orderitemid AS ad_id, a.siteid AS media_id, a.inventoryid AS ad_area_id, SUM(1) AS pv FROM lxw1234.t_log a join lxw1234.t_config b ON (a.orderid = b.ad_activity_id) WHERE a.pt = '2015-06-15' GROUP BY a.cookieid, b.brand, a.orderid, a.orderitemid, a.siteid, a.inventoryid
上面SQL中,大表 lxw1234.t_log 有3亿多条记录,而小表 lxw1234.t_config 中只有1000多条,一般情况下,SparkSQL的执行计划如下图所示:
可以看出,先分别扫描两张表,之后在做ShuffledHashJoin,而在这一步,由于小表数据量非常小,也就是能关联上的键值很少,因此这里发生了数据倾斜,导致最后的几个task处理的数据量非常大,直到内存溢出而报错,如图:
SparkSQL中提供了CACHE TABLE的命令,可以将一个表或者查询进行广播,命令如下:
CACHE TABLE t_config AS SELECT ad_activity_id,brand FROM lxw1234.t_config
这样,等于是将t_config这张table加载到DistributeCache中,接下来再用这张内存表和大表做join:
create table t_lxw1234 as SELECT a.cookieid, b.brand, a.orderid AS ad_activity_id, a.orderitemid AS ad_id, a.siteid AS media_id, a.inventoryid AS ad_area_id, SUM(1) AS pv FROM lxw1234.t_log a join t_config b ON (a.orderid = b.ad_activity_id) WHERE a.pt = '2015-06-15' GROUP BY a.cookieid, b.brand, a.orderid, a.orderitemid, a.siteid, a.inventoryid
再看执行计划:
这次,在一个Stage中,便完成了大表的扫描和与小表的BroadcastHashJoin,性能上自然不用说了,很快就跑完了。
在Hive中试了下同样的语句,Hive中走MapJoin,使用的时间比SparkSQL中多近50%,但需要注意的是,Hive中MapReduce消耗的资源,却是SparkSQL消耗资源的好几倍,这也证实,尽管是从HDFS中读数据,Spark仍然要优于MapReduce。
另外,SparkSQL从Hive表(HDFS)中读数据,全部用的NODE_LOCAL task,如果是ANY,那就要慢一些了,而且会消耗很大的网络资源。
本文同步自我的大数据田地(关注Hadoop、Spark、Hive等大数据技术)。
相关推荐
- **增加Executor内存**:有助于优化MapJoin等操作,但同时会增加Garbage Collection时间。需要注意的是,在HDFS客户端未实现多写的情况下,过多的Executor可能会导致核心资源浪费。 - **确定Executor核心数**:...
Spark SQL中的join操作可以用来结合多个DataFrame中的数据。例如,可以通过DataFrame的join()方法来关联两个DataFrame。join()方法支持不同类型的join,如inner join、left join、right join、full outer join等。 ...
为了优化性能,Spark SQL提供了DataFrame Join Operators,包括广播连接(也称为map-side连接)以及多维聚合。数据集缓存和持久化是通过DataFrame的cache()和persist()方法实现的,它能保持数据在内存中以供重复计算...
- UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF(用户定义的表生成函数):将一...
HiveSQL编译原理是大数据处理领域中的一个重要概念,它主要涉及到如何将用户提交的SQL语句转换为可执行的MapReduce或者Tez任务。在Hadoop生态系统中,Hive作为一个基于HDFS的数据仓库工具,提供了对大规模数据集进行...
Spark SQL 是 Apache Spark 的一个模块,它允许用户通过 SQL 或者 DataFrame API 来处理数据。在大数据处理场景中,性能优化是至关重要的,特别是在处理大规模数据时。Spark SQL 的优化主要包括内存管理、执行计划...
3. **Map-side Join**:为了解决大规模数据集的Join问题,Hive引入了Map-side Join。这种方法适用于小表与大表的连接,小表可以被完全加载到内存中,从而避免了在Reduce阶段的昂贵数据交换。 4. **Bucketing与...
5. 内存调优:调整Hive的内存参数,如mapred.tasktracker.map.tasks.maximum和hive.exec.memory.per.node,提高任务执行效率。 七、Hive与Spark集成 随着Spark的流行,Hive也提供了与Spark的集成,允许用户使用...
在 Spark 1.3.1 版本中,对 RDD 的操作更加丰富和完善,包括转换(Transformation)如 map、filter 和 join,以及行动(Action)如 count、saveAsTextFile 等。 此外,Spark SQL 是 Spark 提供的用于处理结构化数据...
3. **倾斜表处理**:数据倾斜可能导致某些节点负载过高,使用mapjoin、split big tables和repartitioning等技术可以缓解此问题。 4. **缓存和本地化**:启用HDFS的短期缓存和MapReduce的本地化机制,可减少数据传输...
使用Joins的优化策略,如Map-side Join和Bucket Map Join;以及使用EXPLAIN查看查询计划,调整查询语句。 六、Hive与其他系统集成 Hive可以与多种大数据生态系统的组件无缝集成,如Pig、HBase、Spark等。例如,Hive...
转换如map、filter、join等,动作如count、saveAsTextFile等。RDD的弹性体现在容错机制,可以通过检查点或宽依赖关系实现数据恢复。 3. Spark SQL与DataFrame/Dataset:Spark SQL引入DataFrame和Dataset,提供更...
对于大小表JOIN,可调整`hive.mapjoin.smalltable.filesize`等相关参数。 3. **避免全局排序和`DISTINCT`操作**:全局排序在大数据集上效率低下,应尽可能避免。使用`DISTRIBUTE BY`和`SORT BY`组合可以局部排序,...
Hive提供了许多优化策略,如 cbo (Cost-Based Optimization)、动态分区插入、mapjoin等,以提升查询性能。用户可以通过配置参数调整这些策略。 8. **Hive的扩展性** Hive可以通过编写自定义函数(UDF, User ...
1. **Hive概述**:Hive是一个基于Hadoop的数据仓库工具,它允许使用SQL-like语言(HQL,Hive Query Language)对存储在HDFS中的大量数据进行查询和分析。Hive的设计目标是简化大数据的处理,为非程序员提供数据分析...
- 优化JOIN操作:避免全表JOIN,利用Broadcast JOIN或MapJOIN。 - 使用索引:虽然Hive原生不支持索引,但可通过第三方工具如Hive-Indexer实现。 - 使用Tez或Spark执行引擎:替代默认的MapReduce,提高执行效率。 **...
3. **Spark SQL**:Spark SQL允许用户使用SQL或DataFrame API来处理结构化数据,与Hive、HBase等数据存储系统无缝集成,提升了SQL用户的体验。 4. **Spark Streaming**:提供了微批处理模型来处理实时数据流,支持...
Spark SQL通过DataFrame和Dataset API实现了对SQL的支持,允许用户使用SQL语法进行数据操作,并且能够与多种数据源(如Hive,Parquet,JSON等)无缝集成。DataFrame API提供了高阶的抽象,使得处理数据更加便捷,而...
对于大数据JOIN,考虑使用Spark SQL或Tez引擎。 4. **GROUP BY与ORDER BY的使用**:GROUP BY后跟ORDER BY会导致额外的排序,可能增加计算成本。若无特别需求,可尽量避免。 5. **使用子查询替换自连接**:某些情况...
8. **Hive与其他系统集成**:Hive可以与Pig、HBase、Spark等大数据处理工具无缝集成,实现更复杂的数据处理和分析任务。 9. **性能监控与调试**:Hive提供了日志系统和Explain命令来帮助用户理解和优化查询性能。...