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

来源:https://www.cnblogs.com/liugp/archive/2022/04/05/16104516.html
-Advertisement-
Play Games

一、概述 Hive是基於Hadoop的一個數據倉庫(Data Aarehouse,簡稱數倉、DW),可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。是用於存儲、分析、報告的數據系統。 在Hadoop生態系統中,HDFS用於存儲數據,Yarn用於資源管理,MapReduce用於數據處 ...


目錄

一、概述

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/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • * Properties:屬性集合類。是一個可以和IO流相結合使用的集合類。 * Properties 可保存在流中或從流中載入。屬性列表中每個鍵及其對應值都是一個字元串。 package cn.itcast_08; import java.util.Properties; import java. ...
  • 1.環境準備 1.雲伺服器或者虛擬機 2.Centos 系統 3.下載XFtp 和 XShell 2.安裝Docker 1.首先刪除系統中舊版本Docker或者殘留文件 #卸載所有 yum remove docker \ docker-client \ docker-client-latest \ ...
  • 1.環境準備 環境準備的統一資源提取碼為:1234 1.下載 VMware14中文版 14.1.3 VM14虛擬機 2.下載CentOs系統,建議版本最低7.0+ 3.安裝虛擬機,如果有雲伺服器,就不需要安裝虛擬機了 4.下載XFtp 和 XShell 5.下載Redis在Linux系統下的安裝包, ...
  • 痞子衡嵌入式半月刊: 第 52 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • (一)任務刪除函數詳解 直接上代碼! void vTaskDelete( TaskHandle_t xTaskToDelete ){ TCB_t *pxTCB; taskENTER_CRITICAL(); { /* 獲取要刪除任務的任務控制塊,參數是任務句柄,如果參數為當前正在執行的任務句柄,那麼返 ...
  • 開局一張圖。一步一步分析就好。 (一)什麼是任務? 在多任務系統中,我們按照功能不同,把整個系統分割成一個個獨立的,且無法返回的函數,這個函數我們稱為任務;任務包含幾個屬性:任務堆棧,任務函數、任務控制塊、任務優先順序;下麵主要介紹一下任務控制塊,其他都比較容易理解。 (二)什麼是任務控制塊? 任務控 ...
  • 1. 安裝 jdk8.0 下載jdk8.0 https://ftp-new-pc.pconline.com.cn/pub/download/201903/pconline1552198052014.zip?md5=Dv6EA6OPkM2TLsDT27GYXw&expires=1646537688 下 ...
  • 系統調用 系統調用: 操作系統提供給用戶程式調用的一組“特殊”介面,用戶程式可以通過這組“特殊”介面來獲得操作系統內核提供的服務 為什麼用戶程式不能直接訪問系統內核提供的服務為了更好地保護內核空間,將程式的運行空間分為 內核空間 和 用戶空間(也就是常稱的內核態和用戶態),它們分別運行在不同的級別上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...