Hive是什么?
- Hive是基於Hadoop之上的數據倉庫;
- Hive是一種可以存儲、查詢、分析存儲在hadoop中的大規模數據
- Hive定義了簡單的類SQL查詢語言,成為HQL,它允許熟悉SQL的用戶查詢數據
- 允許熟悉MapReduce開發者的開發自定義的mapper和reducer來處理內建的mapper和reducer無法完成的復雜的分析工作
- Hive沒有專門的數據格式
- Hive:數據倉庫。
- Hive:解釋器,編譯器,優化器等。
- Hive運行時,元數據存儲在關系型數據庫里面。
1. 為什么選擇Hive
- 基於Hadoop的大數據的計算/擴展能力
- 支持SQL like查詢語言
- 統一的元數據管理
- 簡單編程
2.Hive內部是什么
Hive是建立在Hadoop上的數據倉庫基礎架構。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。Hive定義了簡單的類SQL查詢語言,稱為QL,它允許熟悉SQL的用戶查詢數據。同時,這個語言也允許熟悉MapReduce開發者的開發自定義的mapper和reducer來處理內建的mapper和reducer無法完成的復雜的分析工作。
本質上講,Hive是一個SQL解析引擎,Hive可以把SQL查詢轉換為MapReduce中的job來運行。Hive有一套映射工具,可以把SQL轉換為MapReduce中的job,可以把SQL中的表、字段轉換為HDFS中的文件(夾)以及文件中的列。這套映射工具稱之為metastore,一般存放在derby、mysql中。
Hive是SQL解析引擎,它將SQL語句轉譯成M/R Job然后在Hadoop執行。
Hive的表其實就是HDFS的目錄/文件,按表名把文件夾分開。如果是分區表,則分區值是子文件夾,可以直接在M/R Job里使用這些數據。
Hive在hdfs中的默認位置是/user/hive/warehouse
3. Hive的系統架構
- 用戶接口
主要有3個:包括CLI,JDBC/ODBC,WebUI。
CLI,即Shell命令行;
JDBC/ODBC是Hive的Java,與使用傳統數據庫JDBC的方式類似
WebGUI是通過瀏覽器訪問Hive
- 元數據存儲
通常是存儲在關系數據庫如mysql,derby中。Hive將元數據存儲在數據庫中(metastore),目前只支持mysql,derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
- 解釋器、編譯器、優化器、執行器
完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在HDFS中,並在隨后有MapReduce調用執行。Hive的數據存儲在HDFS中,大部分的查詢由MapReduce完成(包含*的查詢,比如select * from table不會生成MapReduce任務)
- Hadoop
用HDFS進行存儲,利用MapReduce進行計算。
- HIVE的架構
Hive的架構:
——編譯器(compiler)將一個Hive QL轉換操作符
——操作符是Hive的最小的處理單元
——每個操作符代表HDFS的一個操作或者一道MapReduce作業
Hive的三種模式:
——local模式,此模式連接到一個In-memory的數據塊Derby,一般用於Unit Test.
——單用戶模式,通過網絡連接到一個數據庫中,是最經常使用到的模式
——多用戶模式,或者遠程服務器模式。 用於非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。
local模式:
單用戶模式:
多用戶模式:(遠程服務器模式)
HIVE的Metastore:
Metastore:hive元數據的集中存放地,metastore默認使用內嵌的derby數據庫作為存儲引擎。
Derby引擎的缺點,一次只能打開一個會話。
使用Mysql作為外置存儲引擎,多用戶同時訪問。
4. 配置MySql的metastore
PS:metastore默認使用derby數據庫作為存儲引擎,但是一次只能打開一個會話,修改成Mysql作為外置存儲引擎,進行多用戶同時訪問。
前提:已經安裝MYSQL
未安裝mysql,可參考文章:https://www.cnblogs.com/wendyw/p/11389741.html
- 1.上傳mysql-connector-java-5.1.10.jar到$HIVE_HOME/lib
- 2.登錄MYSQL,創建數據庫hive
#mysql -uroot -pitcast mysql>create database hive; mysql>GRANT all ON hive.* TO root@'%' IDENTIFIED BY 'itcast'; mysql>flush privileges; mysql>set global binlog_format='MIXED';
- 3.把mysql的數據庫字符類型改為latin1
修改$HIVE_HOME/conf/hive-site.xml,其中hadoop表示自己當前虛擬機的主機名,用戶名和密碼都是mysql登錄的用戶名、密碼,hive-site.xml配置文件如下:
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>itcast</value> </property>