大數據Hadoop之——數據倉庫Hive


一、概述

Hive是基於Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。是用於存儲、分析、報告的數據系統

在Hadoop生態系統中,HDFS用於存儲數據,Yarn用於資源管理,MapReduce用於數據處理,而Hive是構建在Hadoop之上的數據倉庫,包括以下方面:

  • 使用HQL作為查詢接口;
  • 使用HDFS存儲;
  • 使用MapReduce或其它計算框架計算;
  • 執行程序運行在Yarn上。

Hive的本質是:將Hive SQL轉化成MapReduce程序,其靈活性和擴展性比較好,支持UDF,自定義存儲格式等;適合離線數據處理。

Hive相關網站

官網:http://hive.apache.org
文檔:https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://cwiki.apache.org/confluence/display/Hive/Home
下載:http://archive.apache.org/dist/hive
Github地址:https://github.com/apache/hive

二、Hive優點與使用場景

1)優點

  • 操作接口采用類SQL語法,提供快速開發的能力(簡單、容易上手);
  • 避免了去寫MapReduce,減少開發人員的學習成本;
  • 統一的元數據管理,可與impala/spark等共享元數據;
  • 易擴展(HDFS+MapReduce:可以擴展集群規模;支持自定義函數);
  • 數據的離線處理;比如:日志分析,海量結構化數據離線分析。

2)使用場景

  • Hive的執行延遲比較高,因此hive常用於數據分析的,對實時性要求 不高的場合;
  • Hive優勢在於處理大數據,對於處理小數據沒有優勢,因為Hive的執 行延遲比較高。

三、Hive架構

由上圖可知,hadoop和mapreduce是hive架構的根基。Hive架構包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、metastore和Driver(Complier、Optimizer和Executor),這些組件我可以分為兩大類:服務端組件和客戶端組件。

1)服務端組件

1、Driver組件

該組件包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優化,生成執行計划,然后調用底層的mapreduce計算框架。

2、Metastore組件

Metastore是元數據服務組件,這個組件存儲hive的元數據,hive的元數據存儲在關系數據庫里,hive支持的關系數據庫有derby、mysql。元數據對於hive十分重要,因此hive支持把metastore服務獨立出來,安裝到遠程的服務器集群里,從而解耦hive服務和metastore服務,保證hive運行的健壯性。

3、Thrift服務

Thrift是facebook開發的一個軟件框架,它用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的接口。

2)客戶端組件

1、CLI

command line interface,命令行接口。

2、Thrift客戶端

上面的架構圖里沒有寫上Thrift客戶端,但是hive架構的許多客戶端接口是建立在Thrift客戶端之上,包括JDBC和ODBC接口。

3、WEBGUI

hive客戶端提供了一種通過網頁的方式訪問hive所提供的服務。這個接口對應hive的hwi組件(hive web interface),使用前要啟動hwi服務。

3)Metastore詳解

  • Hive的metastore組件是hive元數據集中存放地。
  • Metastore組件包括兩個部分:metastore服務和后台數據的存儲。
  • 后台數據存儲的介質就是關系數據庫,例如hive默認的嵌入式磁盤數據庫derby,還有mysql數據庫。
  • Metastore服務是建立在后台數據存儲介質之上,並且可以和hive服務進行交互的服務組件,默認情況下,metastore服務和hive服務是安裝在一起的,運行在同一個進程當中。
  • 我也可以把metastore服務從hive服務里剝離出來,metastore獨立安裝在一個集群里,hive遠程調用metastore服務,這樣我們可以把元數據這一層放到防火牆之后,客戶端訪問hive服務,就可以連接到元數據這一層,從而提供了更好的管理性和安全保障。
  • 使用遠程的metastore服務,可以讓metastore服務和hive服務運行在不同的進程里,這樣也保證了hive的穩定性,提升了hive服務的效率。

四、Hive的工作原理

簡單的將就是說sql或者HQL(Hive SQL)會被Hive解釋,編譯,優化並生成查詢計划,一般情況而言查詢計划會被轉化為MapReduce任務進而執行。

具體工作過程如下:

  • 詞法分析/語法分析

使用antlr將SQL語句解析成抽象語法樹(AST)

  • 語義分析

從Megastore獲取模式信息,驗證SQL語句中隊表名,列名,以及數據類型的檢查和隱式轉換,以及Hive提供的函數和用戶自定義的函數(UDF/UAF)

  • 邏輯計划生成

生成邏輯計划--算子樹

  • 邏輯計划優化

對算子樹進行優化,包括列剪枝,分區剪枝,謂詞下推等

  • 物理計划生成

將生成包含由MapReduce任務組成的DAG(Directed acyclic graph:有向無環圖)的物理計划

  • 物理計划執行

將DAG發送到Hadoop集群進行執行

  • 最后把查詢結果返回

【溫馨提示】新版本的Hive也支持使用Tez或Spark等作為執行引擎。

五、安裝

1)local模式(內嵌derby)

內嵌derby數據庫(一個會話連接,常用於簡單測試)derby是個in-memory的數據庫。

安裝方法如下:

1、下載hive

地址:http://archive.apache.org/dist/hive

$ cd /opt/bigdata/hadoop/software
# 下載
$ wget http://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
# 解壓
$ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/bigdata/hadoop/server/

2、配置環境變量

$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf/
# 把模板文件復制一份
$ cp hive-env.sh.template hive-env.sh
  • 在/etc/profile文件中追加如下內容:
export HIVE_HOME=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH

source 加載生效

$ source /etc/profile

  • hive-site.xml,這個文件不存在,創建文件,內容如下:
# 創建在hdfs存儲目錄,下面配置文件會用到
$ hadoop fs -mkdir -p /user/hive/warehouse
# 切到hive conf目錄
$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/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:derby:;databaseName=metastore_db;create=true</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionDriverName</name>  
  <value>org.apache.derby.jdbc.EmbeddedDriver</value>  
</property>  
   
<property>  
  <name>hive.metastore.local</name>  
  <value>true</value>  
</property>  

<property>  
  <name>hive.metastore.schema.verification</name>  
  <value>false</value>  
</property>  

<!-- 數據在hdfs中的存儲位置 -->
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive/warehouse</value>  
</property>  
<property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
</property>
</configuration>

  • hive-env.sh #底部追加兩行
export HADOOP_HOME=/opt/bigdata/hadoop/server/hadoop-3.3.1
export HIVE_CONF_DIR=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf
export HIV_AUX_JARS_PATH=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/lib

3、啟動驗證

$ hive
# 查看數據庫
hive> show databases;
# 查看當前庫(默認是default庫)的表
hive> show tables;
# 查看當前庫
hive> select current_database();

查看當前目錄,發現多了derby文件和一個metastore_db目錄

【注意】使用derby存儲方式時,運行hive會在當前目錄生成一個derby文件和一個metastore_db目錄。這種存儲方式的弊端是在同一個目錄下同時只能有一個hive客戶端能使用數據庫,否則會提示如下錯誤:

2)單用戶模式(mysql)

該模式下就是客戶端和服務端在一個節點上,使用關系型數據庫(mysql、oracle等帶jdbc驅動的數據庫)來對元數據進行存儲。這里使用mysql,mysql可以在安裝同一台機器上,也可以在遠程機器上。

hive包上面已經下載了,這里就不重復了。

1、安裝mysql數據庫

  • yum源安裝
$ yum -y install mysql-server
# 啟動數據庫
$ systemctl start mysqld
$ systemctl status mysqld
# 開機自啟動
$ systemctl enable mysqld
  • 連接mysql8.x授權(無密碼,直接進入)
$ mysql
# 創建可遠程連接用戶
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
#  修改用戶密碼
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授權給用戶
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'  WITH GRANT OPTION;
# 查看
select user,host from mysql.user;
show grants for 'root'@'%';
# 權限撤回,這里不執行,了解即可
revoke all privileges on *.* from 'root'@'%';

通過密碼登錄mysql

$ mysql -uroot -h 192.168.0.113 -p
輸入密碼:123456

2、解決Hive與Hadoop之間guava版本的差異

$ cd /opt/bigdata/hadoop/server
$ ls -l apache-hive-3.1.2-bin/lib/guava-*.jar
$ ls -l hadoop-3.3.1/share/hadoop/common/lib/guava-*.jar
# 刪除hive中guava低版本
$ rm -f apache-hive-3.1.2-bin/lib/guava-*.jar
# copy hadoop中的guava到hive
$ cp hadoop-3.3.1/share/hadoop/common/lib/guava-*.jar apache-hive-3.1.2-bin/lib/
$ ls -l apache-hive-3.1.2-bin/lib/guava-*.jar

3、下載對應版本的mysql驅動包

# 查看mysql版本
$ mysql --version

這里的mysql版本是8.0.26,所以就得下載對應版本的驅動包
官網下載地址:https://dev.mysql.com/downloads/

如果小伙伴的mysql版本(8.0.26)跟我的一樣,也可以使用百度的地址下載:

鏈接:https://pan.baidu.com/s/1uczpnH0PHxbq258vMoYlgA
提取碼:8888

# 包放在這個目錄下
$ cd /opt/bigdata/hadoop/software
# 解壓
$ unzip mysql-connector-java-8.0.26.zip

把對應的驅動包copy到hive lib目錄下

$ cp mysql-connector-java-8.0.26/mysql-connector-java-8.0.26.jar ../server/apache-hive-3.1.2-bin/lib/

4、配置

$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf
# 先備份一下
$ mv hive-site.xml local-derby-hive-site.xml 
# 復制一份
$ cp hive-default.xml.template hive-site.xml

hive-site.xml內容如下:

<?xml version="1.0"?>  
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
<configuration>

<!-- 配置hdfs存儲目錄 -->
<property>  
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive_remote/warehouse</value>  
</property>  

<!-- 本地模式 -->
<property>
  <name>hive.metastore.local</name>
  <value>true</value>
</property>

<!-- 所連接的 MySQL 數據庫的地址,hive_local是數據庫,程序會自動創建,自定義就行 -->
<property>  
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://hadoop-node1:3306/hive_local?createDatabaseIfNotExist=true&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai</value>
</property>

<!-- MySQL 驅動 -->
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>

<!-- mysql連接用戶 -->
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
</property>  

<!-- mysql連接密碼 -->
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123456</value>
</property>

<!--元數據是否校驗-->
<property>
  <name>hive.metastore.schema.verification</name>
  <value>false</value>
</property>

<property>
  <name>system:user.name</name>
  <value>root</value>
  <description>user name</description>
</property>

</configuration>

5、初始化元數據

# 初始化,--verbose:查詢詳情,可以不加
$ schematool -initSchema -dbType mysql --verbose

出現上圖Initialization script completed和schemaTool completed,就初始化完成了。

通過mysql 客戶端工具取連接數據,發現新增量了hive_local,這個庫里有74張表。

6、啟動驗證

# 進入hive
$ hive
# 查看數據庫
hive> show databases;
# 查看當前庫(默認是default庫)的表
hive> show tables;
# 查看當前庫
hive> select current_database();

3)多用戶模式(mysql)

該模式下就是客戶端和服務端在不同的節點上,因此需要單獨啟動metastore服務。該模式需要hive.metastore.local設置為false,並將hive.metastore.uris設置為metastore服務器URI,如有多個metastore服務器,URI之間用逗號分隔。

  • 客戶端hadoop-node2和服務端hadoop-node1分布在不同的節點上,客戶端通過遠程的方式連接。
  • 客戶端hadoop-node2節點操作,基本和服務端差不多操作,區別是他不需要初始化

在hadoop-node2部署客戶端

1、copy hive包到客戶端hadoop-node2(在hadoop-node1服務端執行)

$ cd /opt/bigdata/hadoop/server
$ scp -r apache-hive-3.1.2-bin hadoop-node2:/opt/bigdata/hadoop/server/

2、在客戶端添加環境變量(hadoop-node2)

  • 在/etc/profile文件中追加如下內容:
export HIVE_HOME=/opt/bigdata/hadoop/server/apache-hive-3.1.2-bin
export PATH=$HIVE_HOME/bin:$PATH

source 加載生效

$ source /etc/profile

3、配置hive-site.xml(hadoop-node2)

$ cd /opt/bigdata/hadoop/server/apache-hive-3.1.2-bin/conf/

hive-site.xml內容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>  
  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/user/hive/warehouse</value>  
</property>  
   
<property>  
  <name>hive.metastore.local</name>  
  <value>false</value>  
</property>  
<property>  
  <name>hive.metastore.schema.verification</name>  
   <value>false</value>  
</property>
  
<property>  
  <name>hive.metastore.uris</name>  
  <value>thrift://hadoop-node1:9083</value>  
</property>  
  
</configuration>

4、服務端后台開啟metastore(hadoop-node1)

$ nohup hive --service metastore &
$ ss -atnlp|grep 9083

5、在客戶端執行hive操作(hadoop-node2)

# 這里使用新命令beeline,跟hive命令差不多
$ hive
$ show databases;
$ show tables;
$ create table users(id int,name string);
$ insert into users values(1,'zhangsan');


通過上面數據的插入操作,發現hive的操作最終會變成一個mapreduce任務在運行,也正驗證了之前所述。

五、Hive客戶端

Hive發展至今,總共歷經了兩代客戶端工具:

  • 第一代客戶端(deprecated不推薦使用):$HIVE_HOME/bin/hive,是一個shellUtil。主要功能:一是可用於以交互或批處理運行Hive查詢;二是用於Hive相關服務的啟動,比如metastore服務。
  • 第二代客戶端(recommend 推薦使用):$HIVE_HOME/bin/beeline,是一個JDBC客戶端,是官方強烈推薦使用的Hive命令行工具,和第一代客戶端相比,性能加強安全性提高。

1)Hive CLI

1、查看幫助

使用 hive -H 或者 hive --help 命令可以查看所有命令的幫助,顯示如下:

usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive 
                                  commands. e.g. -d A=B or --define A=B  --定義用戶自定義變量
    --database <databasename>     Specify the database to use  -- 指定使用的數據庫
 -e <quoted-query-string>         SQL from command line   -- 執行指定的 SQL
 -f <filename>                    SQL from files   --執行 SQL 腳本
 -H,--help                        Print help information  -- 打印幫助信息
    --hiveconf <property=value>   Use value for given property    --自定義配置
    --hivevar <key=value>         Variable subsitution to apply to hive  --自定義變量
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file  --在進入交互模式之前運行初始化腳本
 -S,--silent                      Silent mode in interactive shell    --靜默模式
 -v,--verbose                     Verbose mode (echo executed SQL to the  console)  --詳細模式

2、交互式命令行

直接使用 hive 命令,不加任何參數,即可進入交互式命令行。

3、非交互式

在不進入交互式命令行的情況下,可以使用 hive -e 執行 SQL 命令。

示例:

$ hive -e 'show databases';

4、接SQL文件非交互式執行SQL腳本

用於執行的 sql 腳本可以在本地文件系統,也可以在 HDFS 上。

准備一個sql文件test001.sql

$ cat test001.sql
show databases;
show tables;

本地文件系統執行

hive -f ./test001.sql

HDFS文件系統執行

# 先把sql文件傳到hdfs上
$ hadoop fs -put test001.sql /
$ hadoop fs -ls hdfs://hadoop-node1:8082/test001.sql
$ hive -f hdfs://hadoop-node1:8082/test001.sql

5、配置Hive變量

$ hadoop fs -mkdir -p /user/hive/warehouse/test
$ hive -e 'select * from users' \
--hiveconf hive.exec.scratchdir=/user/hive/warehouse/test  \
--hiveconf mapred.reduce.tasks=4;

發現hdfs的目錄沒有寫權限

添加權限再執行

$ hadoop fs -chmod -R 777 /user/hive/warehouse/test
$ hive -e 'select * from users' \
--hiveconf hive.exec.scratchdir=/user/hive/warehouse/test  \
--hiveconf mapred.reduce.tasks=4;

2)Beeline CLI(推薦)

HiveServer2

  • Hive 內置了 HiveServer 和 HiveServer2 服務,兩者都允許客戶端使用多種編程語言進行連接,但是 HiveServer 不能處理多個客戶端的並發請求,所以產生了 HiveServer2。
  • HiveServer2(HS2)允許遠程客戶端可以使用各種編程語言向 Hive 提交請求並檢索結果,支持多客戶端並發訪問和身份驗證。HS2 是由多個服務組成的單個進程,其包括基於 Thrift 的 Hive 服務(TCP 或 HTTP)和用於 Web UI 的 Jetty Web 服務器。
  • HiveServer2 擁有自己的 CLI(Beeline),Beeline 是一個基於 SQLLine 的 JDBC 客戶端。由於 HiveServer2 是 Hive 開發維護的重點 (Hive0.15 后就不再支持 hiveserver),所以 Hive CLI 已經不推薦使用了,官方更加推薦使用 Beeline。

1、查看幫助

Beeline 擁有更多可使用參數,可以使用 beeline --help 查看,完整參數如下:

$ beeline --help
Usage: java org.apache.hive.cli.beeline.BeeLine
   -u <database url>               the JDBC URL to connect to
   -r                              reconnect to last saved connect url (in conjunction with !save)
   -n <username>                   the username to connect as
   -p <password>                   the password to connect as
   -d <driver class>               the driver class to use
   -i <init file>                  script file for initialization
   -e <query>                      query that should be executed
   -f <exec file>                  script file that should be executed
   -w (or) --password-file <password file>  the password file to read password from
   --hiveconf property=value       Use value for given property
   --hivevar name=value            hive variable name and value
                                   This is Hive specific settings in which variables
                                   can be set at session level and referenced in Hive
                                   commands or queries.
   --property-file=<property-file> the file to read connection properties (url, driver, user, password) from
   --color=[true/false]            control whether color is used for display
   --showHeader=[true/false]       show column names in query results
   --headerInterval=ROWS;          the interval between which heades are displayed
   --fastConnect=[true/false]      skip building table/column list for tab-completion
   --autoCommit=[true/false]       enable/disable automatic transaction commit
   --verbose=[true/false]          show verbose error messages and debug info
   --showWarnings=[true/false]     display connection warnings
   --showNestedErrs=[true/false]   display nested errors
   --numberFormat=[pattern]        format numbers using DecimalFormat pattern
   --force=[true/false]            continue running script even after errors
   --maxWidth=MAXWIDTH             the maximum width of the terminal
   --maxColumnWidth=MAXCOLWIDTH    the maximum width to use when displaying columns
   --silent=[true/false]           be more silent
   --autosave=[true/false]         automatically save preferences
   --outputformat=[table/vertical/csv2/tsv2/dsv/csv/tsv]  format mode for result display
   --incrementalBufferRows=NUMROWS the number of rows to buffer when printing rows on stdout,
                                   defaults to 1000; only applicable if --incremental=true
                                   and --outputformat=table
   --truncateTable=[true/false]    truncate table column when it exceeds length
   --delimiterForDSV=DELIMITER     specify the delimiter for delimiter-separated values output format (default: |)
   --isolation=LEVEL               set the transaction isolation level
   --nullemptystring=[true/false]  set to true to get historic behavior of printing null as empty string
   --maxHistoryRows=MAXHISTORYROWS The maximum number of rows to store beeline history.
   --convertBinaryArrayToString=[true/false]    display binary column data as string or as byte array
   --help                          display this message

2、常用參數

在 Hive CLI 中支持的參數,Beeline 都支持,常用的參數如下。更多參數說明可以參見官方文檔 Beeline Command Options

參數 說明
-u 數據庫地址
-n 用戶名
-p 密碼
-d
-e 執行 SQL 命令
-f 執行 SQL 腳本
-i (or)–init 在進入交互模式之前運行初始化腳本
–property-file 指定配置文件
–hiveconf property=value 指定配置屬性
–hivevar name=value 用戶自定義屬性,在會話級別有效

3、通過代理用戶連接 Hive(不需要配置用戶名和密碼)

1)在hive服務的安裝節點的hive-site.xml配置文件中添加以下配置

<!-- host -->
<property>
  <name>hive.server2.thrift.bind.host</name>
  <value>hadoop-node1</value>
  <description>Bind host on which to run the HiveServer2 Thrift service.</description>
</property>

<!-- hs2端口 默認是1000,為了區別,我這里不使用默認端口-->
<property>
  <name>hive.server2.thrift.port</name>
  <value>11000</value>
</property>

2)修改hadoop配置文件core-site.xml,表示設置可訪問的用戶及用戶組

配置hadoop core-site.xml,再core-site.xml文件中追加如下內容

<property>
  <name>hadoop.proxyuser.root.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>

【注意】hadoop.proxyuser.root.hosts和hadoop.proxyuser.root.hosts,其中“root”是連接beeline的用戶,將“root”替換成自己的用戶名即可。,這個用戶是什么不重要,它就是個超級代理。

改完hadoop-node1后,把配置也推送到其它節點上,然后重啟hadoop就行

$ /opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop
$ scp core-site.xml hadoop-node2:/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/
$ scp core-site.xml hadoop-node2:/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop/
# 重啟hadoop
$ stop-all.sh
$ start-all.sh

3)啟動hiveserver2(hs2)

$ nohup hiveserver2 > /dev/null 2>&1 &
$ jobs -l
# 啟動有點慢,可以稍等一段時間再查看端口
$ ss -antlp|grep 11000

4)連接,這里root就是上面core-site.xml配置的代理用戶

【第一種方式】

$ beeline
beeline> !connect jdbc:hive2://hadoop-node1:11000
Enter username for jdbc:hive2://hadoop-node1:11000: root
# 密碼直接回車就行
Enter password for jdbc:hive2://hadoop-node1:11000:
0: jdbc:hive2://hadoop-node1:11000> show databases;

【第二種方式】

$ beeline -u jdbc:hive2://hadoop-node1:11000  -n root

5)在~/.bashrc中添加alias

$ alias beeline="beeline -u jdbc:hive2://hadoop-node1:11000  -n root"
$ beeline


除了上面那種連接方式,還有以下幾種方式

默認配置如下:

<!-- hs2端口 -->
<property>
  <name>hive.server2.thrift.port</name>
  <value>10000</value>
</property>
<!-- hs2用戶登錄方式,NONE表示不登錄 -->
<property>
  <name>hive.server2.authentication</name>
  <value>NONE</value>
</property>

這里需要稍微講一下hive.server2.authentication的這種類型,連接方式如下:

  • NONE:這種類型就是默認值,hive沒有啟用用戶安全認證,任何登錄者都擁有超級權限,可以對hive進行任意操作。
  • NOSASL:需要任意一個用戶名,不需要密碼,不填寫或者填寫錯誤用戶名會導致報錯。
  • KERBEROS:用戶需要擁有hive的keytab文件(類似於ssh-key等密鑰),有了keytab就相當於擁有了永久的憑證,不需要提供密碼,因此只要linux的系統用戶對於該keytab文件有讀寫權限,就能冒充指定用戶訪問hadoop,因此keytab文件需要確保只對owner有讀寫權限。
  • LDAP:hive采用ldap統一認證服務,連接訪問時需要提供username和password。
  • PAM:hive采用pam認證模塊,同樣需要提供username和password,只是原理大不相同。

PAM(Pluggable Authentication Modules)即可插拔式認證模塊,它是一種高效而且靈活的用戶級別的認證方式,它也是當前Linux服務器普遍使用 的認證方式。PAM可以根據用戶的網段、時間、用戶名、密碼等實現認證。並不是所有需要驗證的服務都使用PAM來驗證,如MySQL-Server就沒有安 裝相應的PAM文件。

  • CUSTOM:可以根據自身需求對用戶登錄認證進行一定客制,比如將密碼通過md5進行加密等。

3)DataGrip客戶端

這里提供一個別人破解安裝DataGrip的教程,如果沒安裝DataGrip,可以參考一下:http://www.32r.com/soft/70050.html

1、創建工程

2、關聯本地目錄到工程

3、配置連接hive


六、實戰操作

Hive SQL跟mysql等關系型數據庫的操作非常相似,如果了解過或學習過關系型數據庫,使用Hive SQL就非常簡單,學習成本也非常低。

1)建庫,建表

hive有個默認的數據庫default

1、建庫

# 建庫
create datatabse test1218
# 查庫
show databases;
# 查看當前所在庫
select current_database();
# 切庫
use test1218;
select current_database();

2、建表

分隔符

Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數據的方法。

\n    每行記錄分隔符
^A    分隔列(八進制 \001),對應ascii碼SOH;
^B    分隔ARRAY或者STRUCT中的元素,或者MAP中多個鍵值對之間分隔(八進制 \002)
^C    分隔MAP中鍵值對的“鍵”和“值”(八進制 \003)

對應sql設置

row format delimited 
fields terminated by '\001' 
collection items terminated by '\002' 
map keys terminated by '\003'
lines terminated by '\n' 
stored as textfile; 

創建表

-- 創建表時指定庫,默認分隔符
CREATE TABLE  IF NOT EXISTS test1218.person (
id INT,
name STRING,
age INT,
likes ARRAY<STRING>,
address MAP<STRING,STRING>
);
-- 創建表時指定庫,指定分隔符
CREATE TABLE  IF NOT EXISTS test1218.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年齡',
likes ARRAY<STRING> COMMENT '愛好',
address MAP<STRING,STRING> COMMENT '地址'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';

show tables;


在HDFS頁面上查看對應的文件

3、上傳表數據到HDFS
person_1表數據

1,t1,18,lol-book-movie,地址:廣東.深圳.南山
2,t2,20,lol-book-movie,地址:廣東.深圳.南山
3,t3,21,lol-book-movie,地址:廣東.深圳.南山
4,t4,21,lol-book-movie,地址:廣東.深圳.南山
5,t5,21,lol-book-movie,地址:廣東.深圳.南山
6,t6,21,lol-book-movie,地址:廣東.深圳.南山

通過命令上傳數據

$ hadoop fs -put person_1-data.txt /user/hive_remote/warehouse/test1218.db/person_1/
$ hadoop fs -ls /user/hive_remote/warehouse/test1218.db/person_1/

查看數據

select * from test1218.person_1;

2)查看

# 顯示所有庫
show databases ;
# 查看當前庫
select current_database();
# 查看default庫里的表
show tables in default;
# 查看當前數據里的表
show tables ;
# 查詢顯示一張表的元數據信息
desc formatted person_1;

3)注釋COMMENT中文亂碼解決

【原因】元數據保存在mysql中,默認不支持中文,默認的編碼是latin1

desc formatted person_1;

【解決】修改Hive存儲的元數據信息(metastore),下面語句是在mysql中執行,數據庫記得換成自己的。

use hive_local;
show tables;

alter table hive_local.COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table hive_local.TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive_local.PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table hive_local.PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table hive_local.INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

再查看還是沒改過來,是因為對已經創建的表是不生效的,得刪除表重新創建表才會顯示正常。

# 刪表
drop table test1218.person_1;
# 創建表
-- 創建表時指定庫,指定分隔符
CREATE TABLE  IF NOT EXISTS test1218.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年齡',
likes ARRAY<STRING> COMMENT '愛好',
address MAP<STRING,STRING> COMMENT '地址'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';

再查看表的元數據信息,中文注釋信息顯示正常了

desc formatted person_1;

4)Load加載數據(推薦)

# 創建表
create table person_local_1(id int,name string,age int) row format delimited fields terminated by ',';
create table person_hdfs_1(id int,name string,age int) row format delimited fields terminated by ',';
show tables;
# 從local加載數據,這里的local是指hs2服務所在機器的本地linux文件系統
load data local inpath '/opt/bigdata/hadoop/data/hive-data' into table person_local_1;
# 查詢
select * from person_local_1;
# 從hdfs中加載數據,這里是移動,會把hdfs上的文件mv到對應的hive的目錄下
load data inpath '/person_hdfs.txt'  into table person_hdfs_1;
# 查詢
select * from person_hdfs_1;

5)Insert添加數據(特別慢,不推薦)

insert into table person_hdfs_1 values (4,'p4',21);

上面那條插入語句會啟動一個MR任務

更多Hive SQL操作,可以參考官方文檔:https://hive.apache.org/


免責聲明!

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



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