• 配置Hive使用Spark执行引擎


    Hive引擎

    概述

    在Hive中,可以通过配置来指定使用不同的执行引擎。Hive执行引擎包括:默认MR、tez、spark

    MapReduce引擎:

    早期版本Hive使用MapReduce作为执行引擎。MapReduce是Hadoop的一种计算模型,它通过将数据划分为小块并在集群上并行处理来完成计算任务。在MapReduce引擎中,Hive将HiveQL查询转换为一系列Map和Reduce阶段的操作,然后由Hadoop的MapReduce框架执行。

    Tez引擎:

    从Hive 0.13版本开始,引入了Tez作为新的执行引擎。Tez是Hadoop上的一种高性能的数据处理框架,它提供了更低的延迟和更高的吞吐量。Tez引擎通过以更高效的方式执行HiveQL查询,比传统的MapReduce引擎更快速。Tez引擎将HiveQL查询转换为一种称为有向无环图(Directed Acyclic Graph, DAG)的形式,然后通过并行执行任务来实现查询。

    Spark引擎:

    将Spark作为Hive的执行引擎,以替代Hive默认的MapReduce执行引擎。通过将Spark作为执行引擎,Hive能够利用Spark的并行处理能力和内存计算优势,从而提高查询性能和处理速度。

    Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法

    Spark on Hive:Hive只作为存储元数据,Spark负责SQL解析优化,语法是Spark SQL语法

    使用Spark作为Hive的执行引擎可以带来以下好处:

    更快的执行速度:Spark具有内存计算的能力,可以在执行过程中缓存数据,加快查询速度
    
    更高的交互性:Spark支持迭代式查询和实时数据处理,适用于需要更快响应时间的应用场景
    
    更好的资源管理:Spark可以与其他Spark应用程序共享资源,实现更好的资源管理和利用
    
    • 1
    • 2
    • 3
    • 4
    • 5

    兼容问题

    通常Hive与Spark间存在兼容性,需处理该兼容问题

    在Hive解压目录,查看Hive支持的Spark版本

    当前Hive版本使用的Spark版本为2.3.0

    [root@node01 hive]# ls lib/spark-*
    lib/spark-core_2.11-2.3.0.jar     lib/spark-launcher_2.11-2.3.0.jar        lib/spark-network-shuffle_2.11-2.3.0.jar  lib/spark-unsafe_2.11-2.3.0.jar
    lib/spark-kvstore_2.11-2.3.0.jar  lib/spark-network-common_2.11-2.3.0.jar  lib/spark-tags_2.11-2.3.0.jar
    
    • 1
    • 2
    • 3

    解决方案:

    1.下载与当前Hive版本使用的Spark版本
    
    2.重新编译Hive,使其支持更高的Spark版本
    
    • 1
    • 2
    • 3

    安装Spark

    下载Spark

    https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.4.0/spark-3.4.0-bin-without-hadoop.tgz
    
    • 1

    解压及重命名

    tar -zxvf spark-3.4.0-bin-without-hadoop.tgz
     
    mv spark-3.4.0-bin-without-hadoop spark
    
    • 1
    • 2
    • 3

    Spark配置

    在Spark中配置spark-env.sh

    修改文件名

    mv conf/spark-env.sh.template  conf/spark-env.sh
    
    • 1

    vim conf/spark-env.sh,添加配置

    export SPARK_DIST_CLASSPATH=$(hadoop classpath)
    
    • 1

    配置SPARK_HOME环境变量

    # Spark
    export SPARK_HOME=/usr/local/program/spark
    export PATH=$PATH:$SPARK_HOME/bin
    
    • 1
    • 2
    • 3

    使配置生效

    source /etc/profile
    
    • 1

    Hive配置

    注意:在Hive正常运行的基础之上进行如下额外配置

    在hive中创建spark配置文件

    vim conf/spark-defaults.conf
    
    • 1

    参数代表:在执行任务时,会根据如下参数执行

    spark.master  yarn
    spark.eventLog.enabled   true
    spark.eventLog.dir  hdfs://node01:9000/spark/history
    spark.executor.memory 1g
    spark.driver.memory	1g
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在HDFS创建目录,用于存储历史日志

    hadoop fs -mkdir -p /spark/history
    
    • 1

    HDFS上传Spark的jar包

    为什么要HDFS上传Spark的jar包?

    • 使用的是spark-3.4.0-bin-without-hadoop.tgz版本,不带hadoop和hive相关依赖

    • Hive任务由Spark执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点

    • 因此需要将Spark的依赖上传到HDFS集群路径,让集群中任何一个节点都能获取到

    hadoop fs -mkdir -p /spark/jars
    
    hadoop fs -put spark/jars/* /spark/jars
    
    • 1
    • 2
    • 3

    修改hive-site.xml文件

    
    <property>
        <name>spark.yarn.jarsname>
        <value>hdfs://node01:9000//spark/jars/*value>
    property>
      
    
    <property>
        <name>hive.execution.enginename>
        <value>sparkvalue>
    property>
    
    
    <property>
        <name>hive.spark.client.connect.timeoutname>
        <value>10000msvalue>
    property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    执行测试

    hive (default)> create table tb_user(id int,name string,age int);
    
    hive (default)> insert into tb_user values(2,'hive',20);
    
    • 1
    • 2
    • 3

    查看Yarn控制台:
    在这里插入图片描述

    注意:

    1.yarn的容量调度器对每个资源队列中同时运行的Application Master占用的资源进行了限制,防止大部分资源都被Application Master占用,导致Map/Reduce Task无法执行

    2.如果资源不够,可能造成同一时刻只能运行一个Job的情况。

    3.通过hadoop/etc/hadoop/capacity-scheduler.xml参数控制,默认值是0.1,即每个资源队列上Application Master最多可使用的资源为该队列总资源的10%

    配置示例:

    <property>
        <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
        <value>0.5</value>
    </property>
    
    • 1
    • 2
    • 3
    • 4

    速度对比

    MapReduce引擎:

    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (SessionState.java:printInfo(1227)) - MapReduce Jobs Launched: 
    Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 3.51 sec   HDFS Read: 16233 HDFS Write: 276 SUCCESS
    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (SessionState.java:printInfo(1227)) - Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 3.51 sec   HDFS Read: 16233 HDFS Write: 276 SUCCESS
    Total MapReduce CPU Time Spent: 3 seconds 510 msec
    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (SessionState.java:printInfo(1227)) - Total MapReduce CPU Time Spent: 3 seconds 510 msec
    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (Driver.java:execute(2531)) - Completed executing command(queryId=root_20230807200946_06634674-a1f5-4cfa-ae34-166bfda3d90e); Time taken: 92.685 seconds
    OK
    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (SessionState.java:printInfo(1227)) - OK
    2023-08-07 20:11:22,834 INFO  [2704e498-c1b3-4dd5-8658-1f0a1393a3bb main] ql.Driver (Driver.java:checkConcurrency(285)) - Concurrency mode is disabled, not creating a lock manager
    col1    col2    col3
    Time taken: 96.059 seconds
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Yarn引擎:

    --------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------
              STAGES   ATTEMPT        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  
    --------------------------------------------------------------------------------------
              STAGES   ATTEMPT        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  
    --------------------------------------------------------------------------------------
    Stage-0 ........         0      FINISHED      1          1        0        0       0  
    Stage-1 ........         0      FINISHED      1          1        0        0       0  
    --------------------------------------------------------------------------------------
    STAGES: 02/02    [==========================>>] 100%  ELAPSED TIME: 10.24 s    
    --------------------------------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    由此可大概粗略得知:

    在Hive执行引擎中,Yarn引擎的执行效率大概是MapReduce引擎的10倍。

    注意:

    具体的性能差异取决于多种因素,如数据量的大小、查询的复杂程度、集群的配置等。

  • 相关阅读:
    【数据挖掘】数据统计性描述与相似度
    QML控件类型:TabBar
    Terraform Chef Puppet
    SpringBoot的核心原理(扒笔记记录)
    【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数
    基于ZYNQ的PCIE高速数据采集卡的设计(一)
    mysql死锁介绍以及解决
    玩转MySQL:如何正确应用索引
    数据分析报告常见步骤
    mac使用VMware Fusion安装Centos 7系统
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/132137669