Linux服務器搭建單機版Hive與搭建Hive集羣

  • Hive
  • Hive概述
  • Hive架構
  • Hive計算引擎
  • Linux安裝Hive
  • 下載Hive
  • 解壓及重命名
  • 配置hive-env.sh
  • 創建hive-site.xml
  • 配置日誌
  • 添加驅動包
  • 配置環境變量
  • 初始化元數據庫
  • 修改元數據庫字符集
  • 啓動Hive
  • 解決日誌Jar包衝突
  • Hive的交互方式
  • 使用bin/hive
  • 使用hiveServer2
  • 使用sql語句或者sql腳本
  • Hive集羣搭建
  • 安裝一個單節點Hive
  • 分發Hive到其他節點
  • 修改分發節點配置文件
  • 啓動Hive集羣

Hive

Hive概述

Hive是一個構建在Hadoop上的數據倉庫框架。最初,Hive是由Facebook開發,後來移交由Apache軟件基金會開發,並作為一個Apache開源項目。

Hⅳve是基於 Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SαL査詢功能。

Hⅳve能夠存儲很大的數據集,可以直接訪問存儲在 Apache HDFS或其他數據存儲系統(如 Apache HBase)中的文件。

Hive支持 MapReduce、 Spark、Tez這三種分佈式計算引擎

Hive本質是將SQL轉換為MapReduce的任務進行運算,底層由HDFS來提供數據存儲

Hive架構

Hive是建立在 Hadoop上的數據倉庫基礎構架。提供了一系列的工具,可以存儲、查詢和分析存儲在分佈式存儲系統中的大規模數據集。Hive定義了簡單的類sql査詢語言,通過底層的計算引擎,將SαL轉為具體的計算任務進行執行

客户端:Client

Client CLI(hive shell 命令行)

JDBC/ODBC(java訪問hive)

WEBUI(瀏覽器訪問hive)

元數據:Metastore

元數據包括表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是
外部表)、表的數據所在目錄等。元數據默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore。

驅動器:Driver

(1)解析器(SQL Parser):將SQL字符轉換成抽象語法樹AST,這一步一般使用都是第三方工具庫完成,比如antlr,對AST進行語法分析,比如表是否存在,字段是否存在,SQL語句是否有誤

(2)編譯器(Physical Plan):將AST編譯生成邏輯執行計劃

(3)優化器(Query Optimizer):對邏輯執行計劃進行優化

(4)執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃,對於Hive來説,就是MR/Spark

數據處理:存儲和執行

Hive使用HDFS進行存儲,使用MapReduce進行計算。

解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。

Hive計算引擎

MapReduce

MapReduce將計算分為兩個階段,分別為 Map 和 Reduce。對於應用來説,需要想方設法將應用拆分成多個map、reduce的作業,以完成一個完整的算法。

MapReduce整個計算過程會不斷重複地往磁盤裏讀寫中間結果,導致計算速度比較慢,效率比較低

Tez

Tez把Map/Reduce過程拆分成若干個子過程,同時可以把多個Map/Reduce任務組合成一個較大的DAG任務,減少了Map/Reduce之間的文件存儲。

Spark

Apache Spark是一個快速的, 多用途的集羣計算系統, 相對於 Hadoop MapReduce 將中間結果保存在磁盤中, Spark 使用了內存保存中間結果, 能在數據尚未寫入硬盤時在內存中進行運算,同時Spark提供SQL 支持。

Spark 實現了一種叫做 RDDs 的 DAG 執行引擎, 其數據緩存在內存中可以進行迭代處理。

Linux安裝Hive

安裝Hive,確保已安裝Mysql數據庫和Hadoop

下載Hive

進入官網: https://archive.apache.org/dist/hive/,選擇與Hadoop匹配的版本進行下載

wget https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz

解壓及重命名

tar -zxvf apache-hive-3.1.3-bin.tar.gz

mv apache-hive-3.1.2-bin hive

cd hive/conf

配置hive-env.sh

cp hive-env.sh.template hive-env.sh

vim hive-env.sh

修改Hadoop安裝位置及Hive的配置目錄、Lib目錄

# Set HADOOP_HOME to point to a specific hadoop install directory
export  HADOOP_HOME=/usr/local/program/hadoop

# Hive Configuration Directory can be controlled by:
 export HIVE_CONF_DIR=/usr/local/program/hive/conf
 
# Folder containing extra libraries required for hive compilation/execution can be controlled by:
 export HIVE_AUX_JARS_PATH=/usr/local/program/hive/lib

創建hive-site.xml

創建hive-site.xml,配置將Hive元數據存儲到MySQL

cp hive-default.xml.template hive-site.xml

vim hive-site.xml

刪除多餘的配置文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <!-- 數據庫相關配置 -->
  <!-- 保存元數據信息到MySQL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://node001:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
    </property>
    <!-- Hive連接MySQL的驅動全類名 -->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <!-- Hive連接MySQL的用户名 -->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
     <!-- Hive連接MySQL的密碼 -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    <!-- 控制Hive元數據存儲的數據模型的自動創建 -->
    <property>
        <name>datanucleus.schema.autoCreateAll</name>
        <value>true</value>
    </property>
    <!-- 控制在Hive CLI中查詢結果是否打印字段名稱的標頭行 -->
    <property>
        <name>hive.cli.print.header</name>
        <value>true</value>
    </property>
    <!-- 控制在Hive CLI中是否打印當前數據庫的信息 -->
    <property>
        <name>hive.cli.print.current.db</name>
        <value>true</value>
    </property>
    <!-- 配置Hive Server2 WebUI的主機地址,提供了一個Web界面,用於監視和管理Hive服務 -->
    <property>
        <name>hive.server2.webui.host</name>
        <value>node001</value>
    </property>
    <!-- 配置Hive Server2 WebUI的端口號 -->
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </property>
    <!-- metastore數據存儲位置 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse</value>
    </property>
    <!-- Hive元數據存儲的模式驗證 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
     <!-- Hive元數據事件通知的認證方式 -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
</configuration>

配置日誌

cp hive-log4j2.properties.template hive-log4j2.properties

vim hive-log4j2.properties

	property.hive.log.dir = /usr/local/program/hive/logs

mkdir -p /usr/local/program/hive/logs

添加驅動包

下載Mysql驅動包,放到到hive的lib目錄

wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar

cp  mysql-connector-java-5.1.49.jar /usr/local/program/hive/lib

查看Hadoop與Hive分別的guava本版

ls hadoop/share/hadoop/common/lib/guava-*.jar
ls hadoop/share/hadoop/hdfs/lib/guava-*.jar

ls hive/lib/guava-*.jar

若版本差異過大或運行中出現異常:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

刪除低版本的那個,將高版本的複製到低版本目錄下

cp /usr/local/program/hadoop/share/hadoop/common/lib/guava-*.jar  hive/lib/

配置環境變量

vim /etc/profile

export HIVE_HOME=/usr/local/program/hive
export PATH=$HIVE_HOME/bin:$PATH

source /etc/profile:使配置生效

初始化元數據庫

初始化數據庫:schematool -dbType mysql -initSchema

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:        jdbc:mysql://172.29.234.1:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver :    com.mysql.jdbc.Driver
Metastore connection User:       root
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql



Initialization script completed
schemaTool completed

修改元數據庫字符集

Hive元數據庫的字符集默認為Latin1,其不支持中文字符,如果建表語句中包含中文註釋,會出現亂碼現象。

修改Hive元數據庫中存儲註釋字段的字符集為utf-8

mysql>  use hive;

字段註釋

mysql> alter table hive.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8mb4;

表註釋

mysql> alter table hive.TABLE_PARAMS modify column PARAM_VALUE mediumtext character set utf8mb4;

啓動Hive

[root@administrator bin]# hive
which: no hbase in (:/usr/local/program/hadoop/bin:/usr/local/program/hadoop/sbin:/usr/local/jdk1.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive Session ID = 83605e87-918d-455d-81cf-c8d9ba2348cc

Logging initialized using configuration in file:/usr/local/program/hive/conf/hive-log4j2.properties Async: true
Hive Session ID = 92dccb9f-0514-4949-9e03-38b634bb33c0
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> show databases;
OK
database_name
dbazkaban
dbsqoop
default
myhive
Time taken: 1.057 seconds, Fetched: 4 row(s)
hive (default)>

解決日誌Jar包衝突

上述啓動Hive過程中,已經有提示日誌相關的輸出,只需要解決日誌Jar包衝突即可解決。

進入/hive/lib目錄

mv lib/log4j-slf4j-impl-2.17.1.jar  lib/log4j-slf4j-impl-2.17.1.jar.back

Hive的交互方式

使用bin/hive

shell交互Hive,用命令hive啓動一個hive的shell命令行

cd /usr/local/hive

bin/hive

使用hiveServer2

Hive啓動為一個服務器,對外提供服務,其他機器通過客户端通過協議連接到服務器,完成訪問操作,官方推薦交互方式

啓動服務端

cd /usr/local/hive
bin/hive --service hiveserver2

cd /usr/local/hive/bin 
nohup hiveserver2 > /dev/null 2>&1 &

新開窗口,啓動客户端進行連接

bin/beeline
!connect jdbc:hive2://IP:10000

輸入用户名與密碼進行連接

or

beeline -u jdbc:hive2://node001:10000 -n root

使用sql語句或者sql腳本

直接執行hive的hql語句

bin/hive -e "create database if not exists myhive;"

hive -f 執行sql腳本

vim hive.sql

create database if not exists myhive;
use myhive;
create tb_test(id int,name string);
hive -f ./hive.sql

Hive集羣搭建

節點

metastore

hiveserver2

client

node001

*

*

node002

*

node003

*

安裝一個單節點Hive

參考上述操作搭建一個單節點Hive

分發Hive到其他節點

[root@node001 program]# scp -r hive node002:/usr/local/program/
[root@node001 program]# scp -r hive node003:/usr/local/program/

[root@node001 program]# scp /etc/profile node002:/etc/
[root@node001 program]# scp /etc/profile node003:/etc/

source /etc/profile

修改分發節點配置文件

vim conf/hive-site.xml

<configuration>
    <!-- 數據存儲位置 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse</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>
    <!--metastore的schema一致性的校驗-->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
    <property>
        <name>datanucleus.schema.autoCreateAll</name>
        <value>true</value>
    </property>
    <!--指定hive.metastore.uris的port-->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://node001:9083</value>
    </property>
</configuration>

啓動Hive集羣

啓動Hadoop集羣:start-all.sh

初始化數據庫:schematool -dbType mysql -initSchema

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/program/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/program/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:        jdbc:mysql://172.29.234.1:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver :    com.mysql.jdbc.Driver
Metastore connection User:       root
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql



Initialization script completed
schemaTool completed

啓動Hive

hive --service metastore
hive --service metastore -p 9083

nohup hive --service metastore > /dev/null 2>&1 &

hive

啓動HiveServer2

hiveserver2

nohup hiveserver2 > /dev/null 2>&1 &

beeline -u jdbc:hive://node001:10000 -n root