一、概述
Hive是什么?
Hive是一個數據倉庫基礎工具在Hadoop中用來處理結構化數據。它架構在Hadoop之上,總歸為大數據,並使得查詢和分析方便。
最初,Hive是由Facebook開發,后來由Apache軟件基金會開發,並作為進一步將它作為名義下Apache Hive為一個開源項目。它用在好多不同的公司。例如,亞馬遜使用它在 Amazon Elastic MapReduce。
Hive 不是
- 一個關系數據庫
- 一個設計用於聯機事務處理(OLTP)
- 實時查詢和行級更新的語言
Hiver特點
- 它存儲架構在一個數據庫中並處理數據到HDFS。
- 它是專為OLAP設計。
- 它提供SQL類型語言查詢叫HiveQL或HQL。
- 它是熟知,快速,可擴展和可擴展的。
Hive架構

該組件圖包含不同的單元。下表描述每個單元:
單元名稱 | 操作 |
用戶接口/界面 |
Hive是一個數據倉庫基礎工具軟件,可以創建用戶和HDFS之間互動。用戶界面,Hive支持是Hive的Web UI,Hive命令行,HiveHD洞察(在Windows服務器)。
|
元存儲 | Hive選擇各自的數據庫服務器,用以儲存表,數據庫,列模式或元數據表,它們的數據類型和HDFS映射。 |
HiveQL處理引擎 |
HiveQL類似於SQL的查詢上Metastore模式信息。這是傳統的方式進行MapReduce程序的替代品之一。相反,使用Java編寫的MapReduce程序,可以編寫為MapReduce工作,並處理它的查詢。
|
執行引擎 |
HiveQL處理引擎和MapReduce的結合部分是由Hive執行引擎。執行引擎處理查詢並產生結果和MapReduce的結果一樣。它采用MapReduce方法。
|
HDFS 或 HBASE | Hadoop的分布式文件系統或者HBASE數據存儲技術是用於將數據存儲到文件系統。 |
Hive工作原理
下圖描述了Hive 和Hadoop之間的工作流程。
下表定義Hive和Hadoop框架的交互方式:
Step No. | 操作 |
1 |
Execute Query
Hive接口,如命令行或Web UI發送查詢驅動程序(任何數據庫驅動程序,如JDBC,ODBC等)來執行。 |
2 |
Get Plan
在驅動程序幫助下查詢編譯器,分析查詢檢查語法和查詢計划或查詢的要求。 |
3 |
Get Metadata
編譯器發送元數據請求到Metastore(任何數據庫)。 |
4 |
Send Metadata
Metastore發送元數據,以編譯器的響應。 |
5 |
Send Plan
編譯器檢查要求,並重新發送計划給驅動程序。到此為止,查詢解析和編譯完成。 |
6 |
Execute Plan
驅動程序發送的執行計划到執行引擎。 |
7 |
Execute Job
在內部,執行作業的過程是一個MapReduce工作。執行引擎發送作業給JobTracker,在名稱節點並把它分配作業到TaskTracker,這是在數據節點。在這里,查詢執行MapReduce工作。 |
8 |
Metadata Ops
與此同時,在執行時,執行引擎可以通過Metastore執行元數據操作。 |
9 |
Fetch Result
執行引擎接收來自數據節點的結果。 |
10 |
Send Results
執行引擎發送這些結果值給驅動程序。 |
執行過程就是:
HiveQL通過CLI/web UI或者thrift 、 odbc 或 jdbc接口的外部接口提交,經過complier編譯器,運用Metastore中的元數據進行類型檢測和語法分析,生成一個邏輯方案(logical plan),然后通過簡單的優化處理,產生一個以有向無環圖DAG數據結構形式展現的map-reduce任務。
Hive構建在Hadoop之上,Hive的執行原理:
-
HQL中對查詢語句的解釋、優化、生成查詢計划是由Hive完成的
-
所有的數據都是存儲在Hadoop中
-
查詢計划被轉化為MapReduce任務,在Hadoop中執行(有些查詢沒有MR任務,如:select * from table)
-
Hadoop和Hive都是用UTF-8編碼的
查詢編譯器(query complier),用雲存儲中的元數據來生成執行計划,步驟如下:
-
解析(parse)-anlr解析其生成語法樹AST(hibernate也是這個):將HQL轉化為抽象語法樹AST
-
類型檢查和語法分析(type checking and semantic analysis):將抽象語法樹轉換此查詢塊(query block tree),並將查詢塊轉換成邏輯查詢計划(logic plan Generator);
-
優化(optimization):重寫查詢計划(logical optimizer)–>將邏輯查詢計划轉成物理計划(physical plan generator)–>選擇最佳的join策略(physical optimizer)
二、hive環境安裝
hadoop的安裝前面已經說過了,注意:Hive版本1.2以上需要Java 1.7或更高版本。 Hive版本0.14到1.1也適用於Java 1.6。 強烈建議用戶開始轉向Java 1.8。Hadoop 2.x(首選),1.x(不支持Hive 2.0.0以上版本)。
Hive版本0.13也支持Hadoop 0.20.x,0.23.x。Hive常用於生產Linux和Windows環境。 Mac是一個常用的開發環境。
Hadoop集群的搭建前面已經介紹了,鏈接如下:
https://www.cnblogs.com/xiao987334176/p/13208915.html
由於使用的是jdk1.7,我需要升級到jdk1.8。因此鏡像需要重新構建才行!
注意:hive需要運行在hadoop-master節點才可以!
環境說明
操作系統 | docker版本 | ip地址 | 配置 |
centos 7.6 | 19.03.12 | 192.168.31.229 | 4核8g |
我們采用遠程模式安裝hive,也就是將Mysql數據庫獨立出來,將元數據保存在遠端獨立的Mysql服務器中。
運行mysql
創建網橋
docker network create hadoop
創建數據目錄
mkdir -p /data/mysql/data
運行mysql
docker run -itd \ --net=hadoop \ --restart=always \ --name hadoop-mysql \ --hostname hadoop-mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=abcd@1234 \ -v /data/mysql/data:/var/lib/mysql \ mysql:5.7 \ --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
創建hive數據庫
# docker exec -it hadoop-mysql /bin/bash root@hadoop-mysql:/# mysql -u root -pabcd@1234 mysql> CREATE DATABASE `hive` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Query OK, 1 row affected (0.00 sec)
目錄結構
cd /opt/ git clone https://github.com/py3study/hadoop-hive.git
/opt/hadoop-hive 目錄結構如下:
./ ├── apache-hive-2.1.1-bin.tar.gz ├── config │ ├── core-site.xml │ ├── hadoop-env.sh │ ├── hdfs-site.xml │ ├── hive-site.xml │ ├── mapred-site.xml │ ├── run-wordcount.sh │ ├── slaves │ ├── ssh_config │ ├── start-hadoop.sh │ └── yarn-site.xml ├── Dockerfile ├── hadoop-2.7.2.tar.gz ├── mysql-connector-java-5.1.38.jar ├── README.md ├── sources.list ├── start-container1.sh └── start-container2.sh
由於軟件包比較大,需要使用迅雷下載,下載地址如下:
https://github.com/kiwenlau/compile-hadoop/releases/download/2.7.2/hadoop-2.7.2.tar.gz http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar http://mirror.bit.edu.cn/apache/hive/hive-2.1.1/apache-hive-2.1.1-bin.tar.gz
構建鏡像
docker build -t hadoop-hive:1 .
創建數據目錄
mkdir -p /data/hadoop-cluster/master/ /data/hadoop-cluster/slave1/ /data/hadoop-cluster/slave2/
運行鏡像
cd /opt/hadoop-hive bash start-container1.sh
啟動hadoop集群
bash start-hadoop.sh
注意:這一步會ssh連接到每一個節點,確保ssh信任是正常的。
Hadoop的啟動速度取決於機器性能
退出docker容器,拷貝hdfs文件到宿主機目錄
docker cp hadoop-master:/root/hdfs /data/hadoop-cluster/master/ docker cp hadoop-slave1:/root/hdfs /data/hadoop-cluster/slave1/ docker cp hadoop-slave2:/root/hdfs /data/hadoop-cluster/slave2/
重新運行容器,並掛載hdfs目錄
cd /opt/hadoop-hive bash start-container2.sh
開啟hadoop
bash start-hadoop.sh
注意:這一步會ssh連接到每一個節點,確保ssh信任是正常的。
Hadoop的啟動速度取決於機器性能
運行wordcount
bash run-wordcount.sh
此腳本會連接到fdfs,並生成幾個測試文件。
運行結果:
... input file1.txt: Hello Hadoop input file2.txt: Hello Docker wordcount output: Docker 1 Hadoop 1 Hello 2
wordcount的執行速度取決於機器性能
關閉安全模式
進入hadoop-master容器,執行命令:
hadoop dfsadmin -safemode leave
配置hive-site.xml文件
cat /usr/local/hive/conf/hive-site.xml
內容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop-mysql:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> <description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>abcd@1234</value> <description>password to use against metastore database</description> </property> </configuration>
注意:請根據實際情況修改mysql地址,用戶名和密碼。由於mysql是ip訪問的,需要關閉ssl連接。
hive元數據庫初始化
/usr/local/hive/bin/schematool -dbType mysql -initSchema
輸出:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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://hadoop-mysql:3306/hive?createDatabaseIfNotExist=true&useSSL=false Metastore Connection Driver : com.mysql.jdbc.Driver Metastore connection User: root Starting metastore schema initialization to 2.1.0 Initialization script hive-schema-2.1.0.mysql.sql Initialization script completed schemaTool completed
注意:它會連接到mysql,並寫入相關表數據。
打開navicat客戶端,查看表數據
Hive服務端的啟動
nohup /usr/local/hive/bin/hive --service metastore &
查看端口
# ss -tunlp|grep 9083 tcp LISTEN 0 50 *:9083 *:* users:(("java",1477,392))
進入hive shell測試
# /usr/local/hive/bin/hive hive> CREATE SCHEMA testdb; OK Time taken: 2.052 seconds hive> SHOW DATABASES; OK default testdb Time taken: 0.48 seconds, Fetched: 2 row(s) hive> quit;
使用hdfs 管理頁面,查看剛剛創建的數據庫
本文參考鏈接:
https://www.cnblogs.com/ggzhangxiaochao/p/9363029.html