主頁 > 資料庫 > 大資料Hadoop之——資料倉庫Hive

大資料Hadoop之——資料倉庫Hive

2022-04-06 07:51:49 資料庫

目錄
  • 一、概述
  • 二、Hive優點與使用場景
    • 1)優點
    • 2)使用場景
  • 三、Hive架構
    • 1)服務端組件
      • 1、Driver組件
      • 2、Metastore組件
      • 3、Thrift服務
    • 2)客戶端組件
      • 1、CLI
      • 2、Thrift客戶端
      • 3、WEBGUI
    • 3)Metastore詳解
  • 四、Hive的作業原理
  • 五、安裝
    • 1)local模式(內嵌derby)
      • 1、下載hive
      • 2、配置環境變數
      • 3、啟動驗證
    • 2)單用戶模式(mysql)
      • 1、安裝mysql資料庫
      • 2、解決Hive與Hadoop之間guava版本的差異
      • 3、下載對應版本的mysql驅動包
      • 4、配置
      • 5、初始化元資料
      • 6、啟動驗證
    • 3)多用戶模式(mysql)
      • 在hadoop-node2部署客戶端
  • 五、Hive客戶端
    • 1)Hive CLI
      • 1、查看幫助
      • 2、互動式命令列
      • 3、非互動式
      • 4、接SQL檔案非互動式執行SQL腳本
      • 5、配置Hive變數
    • 2)Beeline CLI(推薦)
      • 1、查看幫助
      • 2、常用引數
      • 3、通過代理用戶連接 Hive(不需要配置用戶名和密碼)
    • 3)DataGrip客戶端
  • 六、實戰操作
    • 1)建庫,建表
    • 2)查看
    • 3)注釋COMMENT中文亂碼解決
    • 4)Load加載資料(推薦)
    • 5)Insert添加資料(特別慢,不推薦)

一、概述

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="https://www.cnblogs.com/liugp/archive/2022/04/05/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="https://www.cnblogs.com/liugp/archive/2022/04/05/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="https://www.cnblogs.com/liugp/archive/2022/04/05/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/

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456210.html

標籤:其他

上一篇:大資料Hadoop之——資料倉庫Hive

下一篇:CSS中的反向查找

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more