作者:duktig
博客:https://duktig.cn (文章首發)
優秀還努力,愿你付出甘之如飴,所得歸于歡喜,
更多文章參看github知識庫:https://github.com/duktig666/knowledge
背景
學習完Hadoop,有沒有感到撰寫一個MapReduce程式非常復雜,想要進行一次分析和統計需要很大的開發成本,那么不如就來了解了解Hadoop生態圈的另一名成員——Hive,讓我們一起來了解,如何使用類SQL語言進行快速查詢和分析資料吧,
Hive系列文章如下:
- 大資料基礎之Hive(一)—— Hive概述
- 大資料基礎之Hive(二)—— DDL陳述句和DML陳述句
- 大資料基礎之Hive(三)—— 磁區表和分桶表
- 大資料基礎之Hive(四)—— 常用函式和壓縮存盤
- 大資料基礎之Hive(五)——Hive實戰(統計電影排名的各種問題)
Hive概述
什么是 Hive ?
Hive簡介
Hive:由Facebook 開源用于解決 海量結構化日志的資料統計 的工具,
Hive 是基于 Hadoop 的一個 資料倉庫工具,可以 將結構化的資料檔案映射為一張表,并提供類 SQL 查詢功能,
Hive本質
將 HQL 轉化成MapReduce 程式 ,主要如下:
- Hive 處理的資料存盤在 HDFS
- Hive 分析資料底層的實作是 MapReduce
- 執行程式運行在 Yarn 上

Hive 的優缺點
優點
- 操作介面采用 類 SQL 語法,提供快速開發的能力(簡單、容易上手),
- 避免了去寫 MapReduce,減少開發人員的學習成本,
- Hive可以處理大資料量,
- Hive 支持用戶自定義函式,用戶可以根據自己的需求來實作自己的函式,
缺點
- Hive 的 HQL 表達能力有限
- 迭代式演算法無法表達
- 資料挖掘方面不擅長,由于 MapReduce 資料處理流程的限制,效率更高的演算法卻無法實作,
- Hive 的效率比較低
- Hive 自動生成的 MapReduce 作業,通常情況下不夠智能化
- Hive 調優比較困難,粒度較粗
- Hive的執行延遲比較高,
Hive 的使用場景
因為Hive 的執行延遲比較高,所以
- Hive 常用于資料分析,對實時性要求不高的場合,
- Hive 優勢在于處理大資料,對于處理小資料沒有優勢,
Hive的架構

- 用戶介面Client: CLI(command-line interface)、JDBC/ODBC(jdbc 訪問 hive)、WEBUI(瀏覽器訪問hive)
- 元資料Metastore:元資料包括:表名、表所屬的資料庫(默認是 default)、表的擁有者、列/磁區欄位、
表的型別(是否是外部表)、表的資料所在目錄等; (默認存盤在自帶的 derby 資料庫中,推薦使用 MySQL 存盤Metastore ) - Hadoop:使用HDFS 進行存盤,使用 MapReduce 進行計算,運行在Yarn上,
- 驅動器Driver
- 決議器(SQL Parser):將SQL 字串轉換成抽象語法樹 AST,這一步一般都用第三方工具庫完成,比如 antlr;對AST 進行語法分析,比如表是否存在、欄位是否存在、SQL語意是否有誤,
- 編譯器(Physical Plan):將AST 編譯生成邏輯執行計劃,
- 優化器(Query Optimizer):對邏輯執行計劃進行優化,
- 執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃,對于Hive來說,就是MR/Spark,
Hive運行機制:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ixi0lOEd-1635823143449)(C:\Users\rsw\AppData\Roaming\Typora\typora-user-images\image-20211102105231171.png)]
Hive 通過給用戶提供的一系列互動介面,接收到用戶的指令(SQL),使用自己的 Driver,結合元資料(MetaStore),將這些指令翻譯成 MapReduce,提交到Hadoop 中執行,最后,將執行回傳的結果輸出到用戶互動介面,
Hive 和資料庫比較
由于 Hive 采用了類似 SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解為資料庫,從結構上來看,Hive 和資料庫除了擁有類似的查詢語言,再無類似之處,資料庫可以用在 Online 的應用中,但是Hive 是為資料倉庫而設計的,
查詢語言
由于 SQL 被廣泛的應用在資料倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言HQL,熟悉 SQL 開發的開發者可以很方便的使用Hive 進行開發,
資料更新
由于Hive 是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的,因此,Hive 中不建議對資料的改寫,所有的資料都是在加載的時候確定好的,
而資料庫中的資料通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加資料,使用 UPDATE … SET 修改資料,
執行延遲
Hive 在查詢資料的時候,由于沒有索引,需要掃描整個表,因此延遲較高,
另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架,由于MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive 查詢時,也會有較高的延遲,
相對的,資料庫的執行延遲較低,
當資料規模大到超過資料庫的處理能力的時候,Hive 的并行計算顯然能體現出優勢,
資料規模
由于Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支持很大規模的資料;對應的,資料庫可以支持的資料規模較小,
win10安裝Hive3.x
win10安裝Hive
參看:win10安裝Hive3.0.0
注意:在修改 hive-site.xml 時有問題,
官網給出的檔案如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<configuration>
</configuration>
注意將 property 屬性添加到 configuration 標簽內,
jdbc連接屬性參考:
jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true&characterEncoding=latin1&useSSL=false&serverTimezone=Asia/Shanghai
hive的啟動
# 啟動 Hive 元資料
hive --service metastore
# 啟動 Hive server2 服務
hive --service hiveserver2
# 啟動 hive 命令列
hive
問題
Hive進行drop時終端卡死?
hive洗掉表時直接卡死
hive show locks例外問題
報錯:
ERROR exec.DDLTask: Failed
org.apache.hadoop.hive.ql.metadata.HiveException: show Locks LockManager not specified
解決:
$HIVE_HOME/conf/hive-site.xml中加入:
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
然后重啟metastore和hiveserver2,
卡死hive的metastore報錯:
<!--元資料存盤授權-->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
Hive中文亂碼問題
在mysql的hive元資料庫中執行如下代碼:
-- 修改表欄位注釋字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8;
-- 修改表欄位名字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COLUMN_NAME` varchar(767) CHARACTER SET utf8;
-- 修改表屬性Key和Value字符集
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
-- 修改磁區屬性Key和Value字符集
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
-- 修改磁區欄位Key和Value字符集
ALTER TABLE PARTITION_KEYS MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8;
ALTER TABLE PARTITION_KEY_VALS MODIFY COLUMN `PART_KEY_VAL` varchar(256) CHARACTER SET utf8;
-- 修改磁區的磁區名字符集
ALTER TABLE `PARTITIONS` MODIFY COLUMN `PART_NAME` varchar(767) CHARACTER SET utf8;
-- 修改索引屬性Key和Value字符集
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
修改hive-site.xml中JDBC的連接編碼為utf8
Hive實戰
建表:
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
表的資料test.txt:
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long
guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
上傳表的資料:
load data local inpath './test.txt' overwrite into table test;
查詢資料:
select friends[1],children['xiao song'],address.city from
test
where name="songsong";
具體的DDL和DML陳述句將在下篇文章分析,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/345687.html
標籤:其他
下一篇:基于Linux安裝kafka
