基於docker快速搭建hive環境


一、概述

Hive是什么?

Hive是一個數據倉庫基礎工具在Hadoop中用來處理結構化數據。它架構在Hadoop之上,總歸為大數據,並使得查詢和分析方便。

最初,Hive是由Facebook開發,后來由Apache軟件基金會開發,並作為進一步將它作為名義下Apache Hive為一個開源項目。它用在好多不同的公司。例如,亞馬遜使用它在 Amazon Elastic MapReduce。

Hive 不是

  • 一個關系數據庫
  • 一個設計用於聯機事務處理(OLTP)
  • 實時查詢和行級更新的語言

 

Hiver特點

  • 它存儲架構在一個數據庫中並處理數據到HDFS。
  • 它是專為OLAP設計。
  • 它提供SQL類型語言查詢叫HiveQL或HQL。
  • 它是熟知,快速,可擴展和可擴展的。

Hive架構

下面的組件圖描繪了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的執行原理:

  1. HQL中對查詢語句的解釋、優化、生成查詢計划是由Hive完成的

  2. 所有的數據都是存儲在Hadoop中

  3. 查詢計划被轉化為MapReduce任務,在Hadoop中執行(有些查詢沒有MR任務,如:select * from table)

  4. Hadoop和Hive都是用UTF-8編碼的

查詢編譯器(query complier),用雲存儲中的元數據來生成執行計划,步驟如下:

  1. 解析(parse)-anlr解析其生成語法樹AST(hibernate也是這個):將HQL轉化為抽象語法樹AST

  2. 類型檢查和語法分析(type checking and semantic analysis):將抽象語法樹轉換此查詢塊(query block tree),並將查詢塊轉換成邏輯查詢計划(logic plan Generator);

  3. 優化(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&amp;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.yiibai.com/hive/

https://www.cnblogs.com/ggzhangxiaochao/p/9363029.html

https://caidao.gitbooks.io/reading-notes/content/you-yi-si-de-jing-li/ji-yu-docker-kuai-su-da-jian-hive-huan-jing.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM