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