Hive on Spark 就是把 Hive 默认的执行引擎从 MapReduce 换成 Apache Spark。
Hive on Spark 只在 Spark 的制定版本上进行了测试,其它版本则不是很有保证。对稳定性有要求可以去官方文档查看版本兼容性,再根据 Hive 和 Spark 源码中 pom 文件的配置,另行选择版本。这里几乎全部选择最新版进行演示。

环境及一些信息

  • VMWare 15,参考之前的搭建博文
    • Ubuntu 18.04 bionic
    • 8G 内存
    • Docker 18.09.0
    • IP: 192.168.99.100,后面看到这个地址出现就自行翻译成你们运行环境的ip
    • 全程 root 用户操作(手动滑稽)

准备

  1. 安装Docker,拉取 MySQL 8 镜像(不使用 Docker 的后面自行安装 MySQL)
  2. 下载安装包
  3. Spark 二进制包可以在这里获取,但是我们要自己编译不内建 Hive 的版本,所以要下载源码编译

    1
    2
    git clone -b v2.3.3 https://github.com/apache/spark.git
    rm -rf spark/.git
  4. 创建 /home/tools 文件夹,将解压后的安装包和源码都放这里,解压后的 mysql-connector-java-8.0.16.jar 放到 /home/tools/hive/lib

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    home  
    | -- tools
    | -- hadoop
    | -- hive
    | -- lib
    | -- mysql-connector-java-8.0.16.jar
    | -- java
    | -- maven
    | -- scala
    | -- spark-source

安装

Java、Maven 和 Scala 安装

  • 编辑 /etc/profile,加入环境变量

    1
    2
    3
    4
    export JAVA_HOME=/home/tools/java
    export M2_HOME=/home/tools/maven
    export SCALA_HOME=/home/tools/scala
    export PATH=${M2_HOME}/bin:${SCALA_HOME}/bin:${JAVA_HOME}/bin:$PATH
  • 在终端运行以下指令,若显示出 jdk、Scala 和 Maven 版本,则安装已完成

    1
    2
    3
    4
    source /etc/profile
    java -version
    scala -version
    mvn -v
  • (可选)网络不好的孩纸可自行配置 Maven 的仓库为阿里云的镜像

    Hadoop 安装

  • 安装需要的软件

    1
    apt install -y ssh pdsh rsync
  • 修改配置

    • etc/hadoop/core-site.xml:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <configuration>
      <property>
      name>fs.defaultFS</name>
      <value>hdfs://localhost:9000</value>
      </property>
      <property>
      <name>hadoop.tmp.dir</name>
      <value>/home/hadoop/tmp/data</value>
      </property>
      </configuration>
    • etc/hadoop/hdfs-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>dfs.replication</name>
      <value>1</value>
      </property>
      </configuration>
    • etc/hadoop/mapred-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      </configuration>
    • etc/hadoop/yarn-site.xml:

      1
      2
      3
      4
      5
      6
      <configuration>
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      </configuration>
    • sbin/start-dfs.shsbin/stop-dfs.sh 头部配置使用 root 账户:

      1
      2
      3
      4
      5
      #!/usr/bin/env bash
      HDFS_DATANODE_USER=root
      HDFS_DATANODE_SECURE_USER=hdfs
      HDFS_NAMENODE_USER=root
      HDFS_SECONDARYNAMENODE_USER=root
    • sbin/start-yarn.shsbin/stop-yarn.sh 头部配置使用 root 账户:

      1
      2
      3
      4
      #!/usr/bin/env bash
      YARN_RESOURCEMANAGER_USER=root
      HADOOP_SECURE_DN_USER=yarn
      YARN_NODEMANAGER_USER=root
    • etc/hadoop/hadoop-env.sh 中添加:

      1
      2
      export PDSH_RCMD_TYPE=ssh
      export JAVA_HOME=/home/tools/java
  • 配置 SSH 密钥登录

    1
    2
    3
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 0600 ~/.ssh/authorized_keys

    修改 SSH 配置文件 /etc/ssh/sshd_config,加入:

    1
    2
    PermitRootLogin yes       
    PubkeyAuthentication yes

    重启 SSH 服务:

    1
    service ssh restart

    运行 ssh localhost 测试,看是否直接登录到本机

  • 格式化文件系统

    1
    bin/hdfs namenode -format
  • 运行 HDFS,运行成功后可访问 http://192.168.99.100:9870 查看 NameNode 的 Web 管理界面

    1
    sbin/start-dfs.sh
  • 运行 yarn,运行成功后可访问 http://192.168.99.100:8088 查看 ResourceManager 的 Web 管理界面

    1
    sbin/start-yarn.sh

Spark 安装

  • 编译不带 Hive 的版本

    1
    2
    3
    4
    5
    cd /home/tools/spark-source
    ./dev/make-distribution.sh --name "hadoop3-without-hive" --tgz "-Pyarn,-Phadoop-3.1,-Dhadoop.version=3.1.2,parquet-provided,orc-provided"
    cd ..
    mkdir spark
    tar -xf spark-source/spark-2.3.3-bin-hadoop3-without-hive.tgz --strip-components 1 -C spark
  • 新建配置文件 /home/tools/spark/conf/spark-env.sh:

    1
    2
    3
    4
    #!/usr/bin/env bash
    export JAVA_HOME=/home/tools/java
    export HADOOP_CONF_DIR=/home/tools/hadoop/etc/hadoop
    export SPARK_DIST_CLASSPATH=$(/home/tools/hadoop/bin/hadoop classpath)

Hive 安装

  • 复制 Jar 包到 Hive 的 lib 文件夹,其中某些包的小版本号可能会不一样

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    cd /home/tools/hive
    cp ../scala/lib/scala-library.jar lib/
    cp ../spark/jars/spark-core_2.11-2.3.3.jar lib/
    cp ../spark/jars/spark-network-common_2.11-2.3.3.jar lib/
    cp ../spark/jars/jersey-container-servlet-core-2.22.2.jar lib/
    cp ../spark/jars/jersey-server-2.22.2.jar lib/
    cp ../spark/jars/json4s-ast_2.11-3.2.11.jar lib/
    cp ../spark/jars/kryo-shaded-3.0.3.jar lib/
    cp ../spark/jars/minlog-1.3.0.jar lib/
    cp ../spark/jars/scala-xml_2.11-1.0.5.jar lib/
    cp ../spark/jars/spark-launcher_2.11-2.3.3.jar lib/
    cp ../spark/jars/spark-network-shuffle_2.11-2.3.3.jar lib/
    cp ../spark/jars/spark-unsafe_2.11-2.3.3.jar lib/
    cp ../spark/jars/xbean-asm5-shaded-4.4.jar lib/
  • 修改配置 conf/hive-site.yml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:21109/metastore?createDatabaseIfNotExist=true</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123123</value>
    </property>
    <property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
    </property>
    <property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
    </property>
    <property>
    <name>hive.execution.engine</name>
    <value>spark</value>
    </property>
    <property>
    <name>hive.enable.spark.execution.engine</name>
    <value>true</value>
    </property>
    <property>
    <name>spark.yarn.jars</name>
    <value>hdfs://localhost:9000/spark-jars/*</value>
    </property>
    <property>
    <name>spark.master</name>
    <value>spark://localhost.localdomain:7077</value>
    </property>
    <property>
    <name>spark.eventLog.enabled</name>
    <value>true</value>
    </property>
    <property>
    <name>spark.eventLog.dir</name>
    <value>file:///home/tools/hive/logs</value> #
    </property>
    <property>
    <name>spark.serializer</name>
    <value>org.apache.spark.serializer.KryoSerializer</value>
    </property>
    </configuration>
  • 创建运行数据库实例的 docker-compose.yml :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: "2.4"
    services:
    mysql:
    restart: always
    image: mysql:8
    container_name: mysql4hive
    ports:
    - 21109:3306
    environment:
    MYSQL_ROOT_PASSWORD: 123123

    docker-compose.yml 所在目录运行:

    1
    docker-compose up -d
  • 初始化数据库,提示 schemaTool completed 则为成功,连接数据库实例,能看到 metastore 数据库和相关的表

    1
    /home/tools/hive/bin/schematool -initSchema -dbType mysql
  • 修改 /etc/profile 配置环境变量

    1
    2
    3
    4
    export HIVE_HOME=/home/tools/hive
    export SPARK_HOME=/home/tools/spark
    export HADOOP_HOME=/home/tools/hadoop
    export PATH=$HIVE_HOME/bin:$PATH
  • 添加文件用来插入假数据 test_data.txt:

    1
    2
    1 Bryant
    2 Jordan

运行

Spark

1
/home/tools/spark/sbin/start-all.sh

Hive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@localhost: /home/tools/hive/bin/beeline -u jdbc:hive2://
hive > create table test2 (id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';
hive > load data local inpath '/home/tools/hive/test_data.txt' into table test2;
hive > select count(*) from test2;
Hive on Spark Session Web UI URL: http://192.168.99.100:4040

Query Hive on Spark job[0] stages: [0, 1]
Spark job[0] status = RUNNING
--------------------------------------------------------------------------------------
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: 13.05 s
--------------------------------------------------------------------------------------
Spark job[0] finished successfully in 13.05 second(s)
OK
+------+
| _c0 |
+------+
| 2 |
+------+
1 row selected (60.643 seconds)

打完收工 ヾ( ̄▽ ̄)Bye~Bye~