8.hive安装 和 Hive环境准备 (hive on Spark 、Yarn队列配置)

1 Hive安装部署

  • 1)把apache-hive-3.1.2-bin.tar.gz上传到linux目录下
  • 2)解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面
[root@node09 06_hive]# tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/
  • 3)修改apache-hive-3.1.2-bin.tar.gz的名称为hive
[root@node09 06_hive]# mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive
  • 4)修改/etc/profile.d/my_env.sh,添加环境变量
[root@node09 06_hive]# vim /etc/profile.d/my_env.sh
  • 5)添加内容
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin

使环境变量生效或者

[root@node09 06_hive]# source /etc/profile.d/my_env.sh
  • 6)解决日志Jar包冲突,进入/opt/module/hive/lib目录
[root@node09 lib]# mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak

2 Hive元数据配置到MySql

2.1 拷贝驱动

将MySQL的JDBC驱动拷贝到Hive的lib目录下

[root@node09 07_mysql]# cp  mysql-connector-java-5.1.48.jar /opt/module/hive/lib/

2.2 配置Metastore到MySql

在$HIVE_HOME/conf目录下新建hive-site.xml文件

[root@node09 conf]# vim hive-site.xml

添加如下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node09:3306/metastore?useSSL=false</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>000000</value>
    </property>

    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>

    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>

    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node09:9083</value>
    </property>

    <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    </property>

    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>node09</value>
    </property>

    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>

    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>

    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
</configuration>

3 启动Hive

3.1 初始化元数据库

  • 1)登陆MySQL
[root@node09 conf]# mysql -uroot -p000000
  • 2)新建Hive元数据库
mysql> create database metastore;
mysql> quit;
  • 3)初始化Hive元数据库
[root@node09 conf]# schematool -initSchema -dbType mysql -verbose

3.2 启动metastore和hiveserver2

  • 1)Hive 2.x以上版本,要先启动这两个服务,否则会报错:
    FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  • 2)在/opt/module/hive/bin目录编写hive服务启动脚本
[root@node09 bin]# vim hiveservices.sh

内容如下:

#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs

mkdir -p $HIVE_LOG_DIR

#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    echo $pid
    [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}

function hive_start()
{
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}

function hive_stop()
{
    metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}

case $1 in
"start")
    hive_start
    ;;
"stop")
    hive_stop
    ;;
"restart")
    hive_stop
    sleep 2
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status'
    ;;
esac
  • 3)添加执行权限
[root@node09 bin]# chmod +x hiveservices.sh
  • 4)启动Hive后台服务
[root@node09 bin]# hiveservices.sh start
  • 5)查看Hive后台服务运行情况
[root@node09 bin]# hiveservices.sh status
Metastore服务运行正常
HiveServer2服务运行异常
  • 6)启动Hive客户端
[root@node09 bin]# hive

2. Hive on Spark

2.1 编译

官方文档 https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started#:~:text=Version%20Compatibility%20%20%20%20Hive%20Version%20,%20%201.6.0%20%204%20more%20rows%20

  • 1)从官网下载Spark源码并解压
    下载地址: https://www.apache.org/dyn/closer.lua/spark/spark-2.4.5/spark-2.4.5.tgz
  • 2)上传并解压spark
  • 3)进入spark解压后的目录
  • 4)执行编译命令
    [root@node09 spark-2.4.5]# ./dev/make-distribution.sh --name without-hive --tgz -Pyarn -Phadoop-3.1 -Dhadoop.version=3.1.3 -Pparquet-provided -Porc-provided -Phadoop-provided
  • 5)等待编译完成,spark-2.4.5-bin-without-hive.tgz为最终文件

2.2 Hive on Spark配置

  • 1)解压spark-2.4.5-bin-without-hive.tgz
[root@node09 1.Spark]# tar -zxf /opt/software/spark-2.4.5-bin-without-hive.tgz -C /opt/module^C
[root@node09 1.Spark]#  mv /opt/module/spark-2.4.5-bin-without-hive /opt/module/spark
  • 2)配置SPARK_HOME环境变量
[root@node09 spark]# vim /etc/profile.d/my_env.sh

添加如下内容

export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin

source 使其生效

[root@node09 spark]# source /etc/profile.d/my_env.sh
  • 3)配置spark运行环境
[root@node09 spark]# mv /opt/module/spark/conf/spark-env.sh.template /opt/module/spark/conf/spark-env.sh
[root@node09 spark]# vim /opt/module/spark/conf/spark-env.sh

添加如下内容

export SPARK_DIST_CLASSPATH=$(hadoop classpath)
  • 4)连接spark jar包到hive,如何hive中已存在则跳过
[root@node09 spark]# ln -s /opt/module/spark/jars/scala-library-2.11.12.jar /opt/module/hive/lib/scala-library-2.11.12.jar
[root@node09 spark]#  ln -s /opt/module/spark/jars/spark-core_2.11-2.4.5.jar /opt/module/hive/lib/spark-core_2.11-2.4.5.jar
[root@node09 spark]# ln -s /opt/module/spark/jars/spark-network-common_2.11-2.4.5.jar /opt/module/hive/lib/spark-network-common_2.11-2.4.5.jar
  • 5)新建spark配置文件
[root@node09 spark]# vim /opt/module/hive/conf/spark-defaults.conf

添加如下内容

spark.master                                    yarn
spark.master                                    yarn
spark.eventLog.enabled                          true
spark.eventLog.dir                              hdfs://hadoop102:8020/spark-history
spark.driver.memory                             2g
spark.executor.memory                           2g
  • 6)在HDFS创建如下路径
[root@node09 spark]# hadoop fs -mkdir /spark-history
  • 7)上传Spark依赖到HDFS
[root@node09 spark]#  hadoop fs -mkdir /spark-jars

[root@node09 spark]# hadoop fs -put /opt/module/spark/jars/* /spark-jars
  • 8)修改hive-site.xml
  <!--Spark依赖位置-->
  <property>
    <name>spark.yarn.jars</name>
    <value>hdfs://hadoop102:8020/spark-jars/*</value>
  </property>
  
  <!--Hive执行引擎-->
  <property>
    <name>hive.execution.engine</name>
    <value>spark</value>
  </property>
  • 9)Hive on Spark 测试
    a. 启动hive客户端
    b. 创建一张测试表
    hive (default)> create external table student(id int, name string) location '/student';
    c. 通过insert测试效果
    hive (default)> insert into table student values(1,'abc');

3 Yarn容量调度器队列配置

  • 1)增加hive队列
    默认Yarn的配置下,容量调度器只有一条Default队列。在capacity-scheduler.xml中可以配置多条队列,修改以下属性,增加hive队列。
<property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,hive</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
</property>
<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
    <description>
      default队列的容量为50%
    </description>
</property>

同时为新加队列添加必要属性:

<property>
    <name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>50</value>
    <description>
      hive队列的容量为50%
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
    <description>
      一个用户最多能够获取该队列资源容量的比例
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
    <description>
      hive队列的最大容量
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.state</name>
    <value>RUNNING</value>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
    <description>
      访问控制,控制谁可以将任务提交到该队列
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
    <description>
      访问控制,控制谁可以管理(包括提交和取消)该队列的任务
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
<description>
      访问控制,控制用户可以提交到该队列的任务的最大优先级
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
    <description>
      hive队列中任务的最大生命时长
</description>
</property>
<property>
    <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
    <description>
      default队列中任务的最大生命时长
</description>
</property>
  • 2)配置hive客户端任务提交到hive队列
    为方便后续hive客户端的测试和shell脚本中的任务能同时执行,我们将hive客户端的测试任务提交到hive队列,让shell脚本中的任务使用默认值,提交到default队列。
    每次进入hive客户端时,执行以下命令
hive (default)> set mapreduce.job.queuename=hive;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349