Hive on Spark 实践

一、准备

  1. jdk、hadoop、Hive、mysql和spark。为避免兼容问题,本人全部采用cdh版本,对应cdh5.15.0,不过貌似spark版本有点低,不过无所谓,毕竟只是实验。
  2. 由于本人之前搭建过kylin环境,因此hadoop和hive环境已经配置妥当,都是yarn管理下的伪分布式集群。
  3. 安装scala,mac下通过brew安装:brew install scala,网速慢可以使用代理或国内源
  4. hadoophivespark的基本概念,原理,运行方式可做一个初步了解,方便以后问题排查。

二、配置SPARK

  1. 在/etc/profile或~/.bash_profile(假设你没有使用zsh之类的shell)中加入SPARK_HOME环境变量,并将bin路径添加到PATH中。

    1
    2
    export SPARK_HOME=/Users/xxx/spark-1.6.0-cdh5.15.0
    export PATH=$PATH:$SPARK_HOME/bin
  2. 在spark下的config目录中找到spark-env.sh和spark-defaults.conf(如果没有就自己创建),然后添加如下配置:

    spark-env.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # !/usr/bin/env bash
    export SCALA_HOME=/usr/local/Cellar/scala/2.12.7 #注意scala版本
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
    export HADOOP_HOME=/Users/xxx/hadoop-2.6.0-cdh5.15.0
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop #hadoop配置文件目录
    export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop #yarn配置文件目录(和hadoop配置在一起)
    export SPARK_MASTER_IP=localhost #master节点IP,本地搭建使用localhost
    export SPARK_MASTER_HOST=localhost #master机器名称,本地搭建可使用localhost代替
    export SPARK_EXECUTOR_MEMORY=512m #每个executor可分配的内存,可根据机器实际情况设置为512m到1g
    export SPARK_DRIVER_MEMORY=512m #driver可分配的内存,可根据机器实际情况设置为512m到1g
    export SPARK_DIST_CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath) #saprk运行依赖hadoop的库

    spark-defaults.conf

    1
    2
    3
    4
    5
    6
    7
    8
    spark.master                     yarn
    spark.home /Users/xxx/spark-1.6.0-cdh5.15.0
    spark.eventLog.enabled true
    spark.eventLog.dir hdfs://localhost:8001/spark_history
    spark.serializer org.apache.spark.serializer.KryoSerializer
    spark.executor.memory 512m
    spark.driver.memory 512m
    spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

    注意:这里将spark托管到yarn上,所以spark.master配置为yarn,日志目录必须是hdfs路径下的 已经存在的目录,如果不存在请手动创建hdfs dfs -mkdir /spark_history,这个目录也是后面的spark history服务依赖的目录。

三、配置Hive

  1. 将spark-defaults.conf中的配置同步到hive配置中,在hive下的conf目录下找到hive-site.xml,增加如下内容:
    hive-site.xml

    1
    2
    3
    4
    5
    6
    7
    <!-- 注意:hive.execution.engine在这里设置表示hive默认使用spark引擎,
    也可以不在这里设置,进入hive cli或客户端后使用set hive.execution.engine=spark
    启用spark引擎,但这种方式只针对当前会话有效。-->
    <property>
    <name>hive.execution.engine</name>
    <value>spark</value>
    </property>
    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

    <property>
    <name>spark.home</name>
    <value>/Users/xxx/spark-1.6.0-cdh5.15.0</value>
    </property>

    <property>
    <name>spark.master</name>
    <value>yarn</value>
    </property>

    <property>
    <name>spark.executor.memory</name>
    <value>512m</value>
    </property>

    <property>
    <name>spark.driver.memory</name>
    <value>512m</value>
    </property>

    <property>
    <name>spark.serializer</name>
    <value>org.apache.spark.serializer.KryoSerializer</value>
    </property>

    <property>
    <name>spark.enentLog.enabled</name>
    <value>true</value>
    </property>

    <property>
    <name>spark.enentLog.dir</name>
    <value>hdfs://localhost:8001/spark_history</value>
    </property>

    <property>
    <name>spark.executor.extraJavaOptions</name>
    <value>-XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"</value>
    </property>

    注意:这里的配置务必和spark-defaults.conf中的一致,尤其是spark.executor.memoryspark.driver.memory,自己配置时填错了这两项,结果一堆莫名其妙的异常。

四、配置yarn

  1. 配置yarn,在hadoop的etc/hadoop目录下找到yarn-site.xml,增加(修改)如下内容:
    yarn-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <!-- yarn资源调度器:公平调度 -->
    <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
    <!-- NM的web监控地址,主要是端口设置 -->
    <property>
    <name>yarn.nodemanager.webapp.address</name>
    <value>0.0.0.0:8042</value>
    </property>
    <!-- NM可分派的内存量,单机的话看机器剩余内存量配置 -->
    <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
    </property>
    <!-- NM可分配的虚拟CPU数,单机的话配置为CPU核数-2或-1 -->
    <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>6</value>
    </property>

五、其他配置

  1. CDH版本的Hive与Spark没有联系,需要我们手动将spark lib中的spark-assembly-1.6.0-cdh5.15.0-hadoop2.6.0-cdh5.15.0.jar拷贝到hive lib下,hive才能与spark建立联系。

  2. 使用spark自带的example进行测试诊断(cd到spark bin目下):./spark-submit --master yarn --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-cdh5.15.0-hadoop2.6.0-cdh5.15.0.jar 10,具体example jar路径及文件名自行查看。运行起来后有一个异常解决一个异常,直到跑出结果为止,测试中发现以下问题:

    • 没有jackson模块:CDH版本没带jackson的相关包,去maven官网下载(三个都要下载),放到{HADOOP_HOME}/share/hadoop/common/lib下,至于为什么放在这儿而不是spark lib,这是因为我们在前面配置了SPARK_DIST_CLASSPATH(看不明白就在shell中echo一下),它会加入到spark类路径下,这个路径就包含上面的{HADOOP_HOME}/share/hadoop/common/lib,而且它下面还有jackson的其他包,顺理成章就放这儿了。

    • jackson版本问题:Jackson内部抛异常,上网查发现是版本问题,于是按热心网友推荐采用2.4.4的版本,问题解决!

    • 无限ACCEPT:spark-env.sh中SPARK_MASTER_IPSPARK_MASTER_HOST需要配置为自己机器的hostname或者localhost。

    • 如果机器内存较小,导致分配资源缓慢,可适当调整一下${HADOOP_HOME}/etc/hadoop/capacity-scheduler.xml中的yarn.scheduler.capacity.maximum-am-resource-percent,可以由0.1调整为0.5,它表示yarn所管理的资源中,最多可以有多少资源可以用来运行application master,即控制当前激活状态的应用,默认是10%,可适当调大比例。

  3. 终极测试:

文章作者: Jack.Charles
文章链接: https://blog.zjee.me/2018/12/02/hive-on-spark/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 江影不沉浮