`
superlxw1234
  • 浏览: 552364 次
  • 性别: Icon_minigender_1
  • 来自: 西安
博客专栏
Bd1c0a0c-379a-31a8-a3b1-e6401e2f1523
Hive入门
浏览量:44554
社区版块
存档分类
最新评论

Spark SQL中实现Hive MapJoin

阅读更多

     在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的执行计划如下图所示:

 

Spark执行计划

 

可以看出,先分别扫描两张表,之后在做ShuffledHashJoin,而在这一步,由于小表数据量非常小,也就是能关联上的键值很少,因此这里发生了数据倾斜,导致最后的几个task处理的数据量非常大,直到内存溢出而报错,如图:

 

Spark MapJoin

 

 

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

再看执行计划:

 

Spark MapJoin

 

 

   这次,在一个Stage中,便完成了大表的扫描和与小表的BroadcastHashJoin,性能上自然不用说了,很快就跑完了。

 

   在Hive中试了下同样的语句,Hive中走MapJoin,使用的时间比SparkSQL中多近50%,但需要注意的是,Hive中MapReduce消耗的资源,却是SparkSQL消耗资源的好几倍,这也证实,尽管是从HDFS中读数据,Spark仍然要优于MapReduce。

 

    另外,SparkSQL从Hive表(HDFS)中读数据,全部用的NODE_LOCAL task,如果是ANY,那就要慢一些了,而且会消耗很大的网络资源。

    

    本文同步自我的大数据田地关注Hadoop、Spark、Hive等大数据技术)。

    更多关于Spark、SparkSQL的技术文章

10
5
分享到:
评论

相关推荐

    基于CDH 6.3.0 搭建 Hive on Spark 及相关配置和调优

    - **增加Executor内存**:有助于优化MapJoin等操作,但同时会增加Garbage Collection时间。需要注意的是,在HDFS客户端未实现多写的情况下,过多的Executor可能会导致核心资源浪费。 - **确定Executor核心数**:...

    spark rdd api dataframe 以及dataframe rdd dataset 相互转换 spark sql

    Spark SQL中的join操作可以用来结合多个DataFrame中的数据。例如,可以通过DataFrame的join()方法来关联两个DataFrame。join()方法支持不同类型的join,如inner join、left join、right join、full outer join等。 ...

    mastring-spark-sql

    为了优化性能,Spark SQL提供了DataFrame Join Operators,包括广播连接(也称为map-side连接)以及多维聚合。数据集缓存和持久化是通过DataFrame的cache()和persist()方法实现的,它能保持数据在内存中以供重复计算...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    - UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF(用户定义的表生成函数):将一...

    HiveSQL编译原理

    HiveSQL编译原理是大数据处理领域中的一个重要概念,它主要涉及到如何将用户提交的SQL语句转换为可执行的MapReduce或者Tez任务。在Hadoop生态系统中,Hive作为一个基于HDFS的数据仓库工具,提供了对大规模数据集进行...

    spark sql优化.doc

    Spark SQL 是 Apache Spark 的一个模块,它允许用户通过 SQL 或者 DataFrame API 来处理数据。在大数据处理场景中,性能优化是至关重要的,特别是在处理大规模数据时。Spark SQL 的优化主要包括内存管理、执行计划...

    Hive-Summit-2011-join.zip_hive

    3. **Map-side Join**:为了解决大规模数据集的Join问题,Hive引入了Map-side Join。这种方法适用于小表与大表的连接,小表可以被完全加载到内存中,从而避免了在Reduce阶段的昂贵数据交换。 4. **Bucketing与...

    大数据hive笔记.zip

    5. 内存调优:调整Hive的内存参数,如mapred.tasktracker.map.tasks.maximum和hive.exec.memory.per.node,提高任务执行效率。 七、Hive与Spark集成 随着Spark的流行,Hive也提供了与Spark的集成,允许用户使用...

    spark_api_1.3.1

    在 Spark 1.3.1 版本中,对 RDD 的操作更加丰富和完善,包括转换(Transformation)如 map、filter 和 join,以及行动(Action)如 count、saveAsTextFile 等。 此外,Spark SQL 是 Spark 提供的用于处理结构化数据...

    Hive优化以及执行原理

    3. **倾斜表处理**:数据倾斜可能导致某些节点负载过高,使用mapjoin、split big tables和repartitioning等技术可以缓解此问题。 4. **缓存和本地化**:启用HDFS的短期缓存和MapReduce的本地化机制,可减少数据传输...

    Hive用户指南.zip

    使用Joins的优化策略,如Map-side Join和Bucket Map Join;以及使用EXPLAIN查看查询计划,调整查询语句。 六、Hive与其他系统集成 Hive可以与多种大数据生态系统的组件无缝集成,如Pig、HBase、Spark等。例如,Hive...

    spark笔记.zip

    转换如map、filter、join等,动作如count、saveAsTextFile等。RDD的弹性体现在容错机制,可以通过检查点或宽依赖关系实现数据恢复。 3. Spark SQL与DataFrame/Dataset:Spark SQL引入DataFrame和Dataset,提供更...

    hive常见的优化方案ppt

    对于大小表JOIN,可调整`hive.mapjoin.smalltable.filesize`等相关参数。 3. **避免全局排序和`DISTINCT`操作**:全局排序在大数据集上效率低下,应尽可能避免。使用`DISTRIBUTE BY`和`SORT BY`组合可以局部排序,...

    apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)

    Hive提供了许多优化策略,如 cbo (Cost-Based Optimization)、动态分区插入、mapjoin等,以提升查询性能。用户可以通过配置参数调整这些策略。 8. **Hive的扩展性** Hive可以通过编写自定义函数(UDF, User ...

    hive官方文档整理

    1. **Hive概述**:Hive是一个基于Hadoop的数据仓库工具,它允许使用SQL-like语言(HQL,Hive Query Language)对存储在HDFS中的大量数据进行查询和分析。Hive的设计目标是简化大数据的处理,为非程序员提供数据分析...

    hive安装

    - 优化JOIN操作:避免全表JOIN,利用Broadcast JOIN或MapJOIN。 - 使用索引:虽然Hive原生不支持索引,但可通过第三方工具如Hive-Indexer实现。 - 使用Tez或Spark执行引擎:替代默认的MapReduce,提高执行效率。 **...

    Spark技术参考手册

    3. **Spark SQL**:Spark SQL允许用户使用SQL或DataFrame API来处理结构化数据,与Hive、HBase等数据存储系统无缝集成,提升了SQL用户的体验。 4. **Spark Streaming**:提供了微批处理模型来处理实时数据流,支持...

    2018阿里BAT面试题

    Spark SQL通过DataFrame和Dataset API实现了对SQL的支持,允许用户使用SQL语法进行数据操作,并且能够与多种数据源(如Hive,Parquet,JSON等)无缝集成。DataFrame API提供了高阶的抽象,使得处理数据更加便捷,而...

    Hive查询优化整理与Hive简易版思维导图

    对于大数据JOIN,考虑使用Spark SQL或Tez引擎。 4. **GROUP BY与ORDER BY的使用**:GROUP BY后跟ORDER BY会导致额外的排序,可能增加计算成本。若无特别需求,可尽量避免。 5. **使用子查询替换自连接**:某些情况...

    Hive用户指南(Hive_user_guide)_中文版pdf

    8. **Hive与其他系统集成**:Hive可以与Pig、HBase、Spark等大数据处理工具无缝集成,实现更复杂的数据处理和分析任务。 9. **性能监控与调试**:Hive提供了日志系统和Explain命令来帮助用户理解和优化查询性能。...

Global site tag (gtag.js) - Google Analytics