Hive入門

weixin_33727510發表於2018-03-01

介紹

Hive 是一個基於 Hadoop 的資料倉儲工具,它可以將結構化資料檔案對映成一張表,然後通過類似 SQL 的查詢語句來執行查詢。這些查詢語句在Hive中被稱作HQL,這些 HQL 會被翻譯成 MapReduce 作業來執行。

Hive 把表和欄位轉換成 HDFS 中的資料夾和檔案,並將這些後設資料保持在關係型資料庫中,如 derby 或 mysql。

Hive 查詢的資料儲存在HDFS上,執行在Yarn上。

Hive 適合做離線資料分析,如:批量處理和延時要求不高場景。

安裝

安裝 Hadoop

由於 Hive 是基於 Hadoop 的,所以需要先準備一個 Hadoop 環境。Hadoop 的安裝參考我前面的文章。

安裝 Hive

首先從下面地址下載最新版本的 Hive,這裡我們使用 2.3.2 版。

下載並解壓安裝包

$ wget -c https://dist.apache.org/repos/dist/release/hive/hive-2.3.2/apache-hive-2.3.2-bin.tar.gz
$ tar zxvf apache-hive-2.3.2-bin.tar.gz
$ cd apache-hive-2.3.2-bin

設定環境變數

$ export JAVA_HOME=/opt/jdk8
$ export HADOOP_HOME=/apps/hadoop-3.0.0
$ export HIVE_HOME=/apps/apache-hive-2.3.2-bin

初始化 Derby 資料庫,Hive 預設使用 Derby 資料庫來儲存後設資料。生產環境建議使用 Mysql。

$ bin/schematool -dbType derby -initSchema

執行 Hive

啟動 Shell

通常我們使用 Hive 都是使用命令列工具來執行一些資料的更新和查詢,下面命令就會啟動 Hive 的命令列終端。

$ bin/hive
> hive

檢視錶

hive> show tables;

建立表

hive> CREATE TABLE users(id int, username string, password string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

插入查詢資料

這裡我們先準備一個資料檔案 users.dat,內容如下:

1,user1,password1
2,user2,password2
3,user3,password3
4,user4,password4
5,user5,password5

向資料表匯入資料

# 從本地檔案系統匯入
hive> LOAD DATA LOCAL INPATH '/tmp/users.dat' INTO TABLE users;

# 從 HDFS 匯入
hive> LOAD DATA INPATH '/tmp/users.dat' INTO TABLE users;

匯入資料後,使用 HQL 來查詢結果

hive> select * from users;
OK
1       user1   password1
2       user2   password2
3       user3   password3
4       user4   password4
5       user5   password5

此時,我們檢視一下這些資料在 HDFS 上是怎樣儲存的,我在檢視

hive> dfs -ls /user/hive/warehouse/users
Found 1 items
-rwxr-xr-x   2 jhadmin supergroup         54 2018-02-05 00:14 /user/hive/warehouse/users/users.dat

hive> dfs -cat /user/hive/warehouse/users/users.dat
1,user1,password1
2,user2,password2
3,user3,password3
4,user4,password4
5,user5,password5

下面我們再插入一條記錄看看,此時終端會出現MapReduce作業的相關資訊。

hive> INSERT INTO TABLE users(id, username, password) values (6, 'user6', 'password6');
... (MapReduce Job output)
hive> select * from users;
OK
6       user6   password6
1       user1   password1
2       user2   password2
3       user3   password3
4       user4   password4
5       user5   password5

檢視一下 HDFS 的檔案資訊,可以看到新新增了一個檔案000000_0,其中儲存著上面插入語句儲存的資料。

hive> dfs -ls /user/hive/warehouse/users
Found 2 items
-rwxr-xr-x   2 jhadmin supergroup         22 2018-02-05 00:26 /user/hive/warehouse/users/000000_0
-rwxr-xr-x   2 jhadmin supergroup         54 2018-02-05 00:14 /user/hive/warehouse/users/users.dat

hive> dfs -cat /user/hive/warehouse/users/000000_0
6,username6,password6

從上面的結果可以看到,每次單獨的 INSERT 語句都會至少產生一個檔案,因此在生產環境下還是要避免這樣的插入操作,而應該使用批量匯入來寫入資料。

上面的查詢語句 “select * from users;” 太簡單,以至於看不出他是不是使用的 MapReduce 作業來執行查詢的,下面我們把查詢語句稍微修改一下,就可以看出 Hive 會把 HQL 轉換成 MapReduce 作業來執行了。

hive> select * from users order by id;
... (MapReduce Job output)
OK
1       user1   password1
2       user2   password2
3       user3   password3
4       user4   password4
5       user5   password5
6       user6   password6

相關文章