安裝Hive3.1.2

下載地址:https://downloads.apache.org/hive/hive-3.1.2/

解壓在指定目錄

tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/
mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive3.1.2

修改/etc/profile.d/my_env.sh,添加環境變量

#HIVE_HOME
export HIVE_HOME=/opt/module/hive3.1.2
export PATH=$PATH:$HIVE_HOME/bin

3.1.2版本執行bin/schematool -dbType derby -initSchema的時候會報一個錯誤:

SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
        at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)

刪除掉hive裏面的guava-19.0.jar,將hadoop裏面的guava-27.0-jre.jar複製到hive裏即可。

默認的hive使用內置的derby,不好用,這裏修改爲mysql。

vim $HIVE_HOME/conf/hive-site.xml

   <!--jdbc連接的URL-->
   <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value><![CDATA[jdbc:mysql://139.199.106.57:3306/hive_metastore?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&tinyInt1isBit=false]]></value>
   </property>
   <!--jdbc連接的Driver-->
   <property>
     <name>javax.jdo.option.ConnectionDriverName</name>
     <value>com.mysql.cj.jdbc.Driver</value>
   </property>
   <!--jdbc連接的username-->
   <property>
     <name>javax.jdo.option.ConnectionUserName</name>
     <value>pupbook</value>
   </property>
   <!--jdbc連接的password-->
   <property>
     <name>javax.jdo.option.ConnectionPassword</name>
     <value>pbFeZ^SCWmKg@Jar</value>
   </property>
   <!--Hive元數據存儲版本的驗證-->
   <property>
     <name>hive.metastore.schema.verification</name>
     <value>false</value>
   </property>
   <!--元數據存儲授權-->
   <property>
     <name>hive.metastore.event.db.notification.api.auth</name>
     <value>false</value>
   </property>

初始化 Hive 元數據庫 schematool -initSchema -dbType mysql -verbose

完整的hive-site.xml的配置

<configuration>
  <!--jdbc連接的URL-->
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value><![CDATA[jdbc:mysql://139.199.106.57:3306/hive_metastore?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&tinyInt1isBit=false]]></value>
  </property>
  <!--jdbc連接的Driver-->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.cj.jdbc.Driver</value>
  </property>
  <!--jdbc連接的username-->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>pupbook</value>
  </property>
  <!--jdbc連接的password-->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>pbFeZ^SCWmKg@Jar</value>
  </property>
  <!--Hive元數據存儲版本的驗證-->
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <!--元數據存儲授權-->
  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>

  <!--Hive默認在HDFS的工作目錄-->
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
  </property>

  <!-- 指定存儲元數據要連接的地址 -->
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://node101:9083</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>

  <!-- 指定 hiveserver2 連接的 host -->
  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>node101</value>
  </property>
  <!-- 指定 hiveserver2 連接的端口號 -->
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
  </property>
</configuration>


創建hive啓動腳本 vim ~/bin.myhive.sh

#!/bin/bash
HIVE_LOG_DIR=/data_disk/hive/logs
# 配置hive日誌目錄
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi

#檢查進程是否運行正常,參數 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 /opt/module/hive3.1.2/bin/hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
  cmd=$cmd" sleep 3; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
  [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服務已啓動"
  server2pid=$(check_process HiveServer2 10000)
  cmd="nohup /opt/module/hive3.1.2/bin/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 3
  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

chmod +x myhive.sh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章