1、 hive是什么?
Hive是基於 Hadoop 的一個數據倉庫工具:
1. hive本身不提供數據存儲功能,使用HDFS做數據存儲;
2. hive也不分布式計算框架,hive的核心工作就是把sql語句翻譯成MR程序;
3. hive也不提供資源調度系統,也是默認由Hadoop當中YARN集群來調度;
4. 可以將結構化的數據映射為一張數據庫表,並提供 HQL(Hive SQL)查詢功能。
2、 hive和Hadoop關系
Hive利用HDFS存儲數據,利用MapReduce查詢數據
3、 hive特點
1. 可以將結構化的數據文件映射為一張數據庫表(二維表),並提供類SQL查詢功能
2. 可以將sql語句轉換為MapReduce任務進行運行。Hive 將用戶的HiveQL 語句通過解釋器轉換為MapReduce 作業提交到Hadoop 集群上,Hadoop 監控作業執行過程,然后返回作業執行結果給用戶。
3. Hive 在加載數據過程中不會對數據進行任何的修改,只是將數據移動到HDFS 中Hive 設定的目錄下,因此,Hive 不支持對數據的改寫和添加,所有的數據都是在加載的時候確定的。
4. Hive的適應場景:只適合做海量離線數據的統計分析。
4、 hive數據的存儲
1. Hive中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)
2. 只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。
3. Hive 中包含以下數據模型:DB、Table,External Table,Partition,Bucket。
db:在hdfs中表現為${hive.metastore.warehouse.dir}目錄下一個文件夾
table:在hdfs中表現所屬db目錄下一個文件夾
external table:與table類似,不過其數據存放位置可以在任意指定路徑
partition:在hdfs中表現為table目錄下的子目錄
bucket:在hdfs中表現為同一個表目錄下根據hash散列之后的多個文件
5、 Hive 體系結構
6、 hive的架構原理
Driver是核心,Driver可以解析語法,最難的就是解析sql的語法,只要把SQL的語法解析知道怎么做了,它內部用MapReduce模板程序,它很容易把它組裝起來,比如做一個join操作,最重要的是識別語法,認識你的語法,知道你語法有什么東西,解析出來會得到一個語法樹,根據一些語法樹,去找一些MapReduce模板程序,把它組裝起來。
例如:有二個表去join,內部有一個優化機制,有一個默認值,如果小表小於默認值,就采用map—join ,如果小表大於默認值,就采用reduce——join(其中map——join是先把小表加載到內存中),組裝時候就是輸入一些參數:比如:你的輸入數據在哪里,你的表數據的分隔符是什么,你的文件格式是什么:然而這些東西是我們建表的時候就指定了,所以這些都知道了,程序就可以正常的跑起來。
Hive有了Driver之后,還需要借助Metastore,Metastore里邊記錄了hive中所建的:庫,表,分區,分桶的信息,描述信息都在Metastore,如果用了MySQL作為hive的Metastore:需要注意的是:你建的表不是直接建在MySQL里,而是把這個表的描述信息放在了MySQL里,而tables表,字段表是存在HDFS上的hive表上,hive會自動把他的目錄規划/usr/hive/warehouse/庫文件/庫目錄/表目錄,你的數據就在目錄下
7、 內外表
內部表在刪除表的時候,會刪除元數據和數據;外部表在刪除表的時候,只刪除元數據,不刪除數據
內部表和外部表使用場景:
1. 一般情況來說,如果數據只交給hive處理,那么一般直接使用內部表;
2. 如果數據需要多個不同的組件進行處理,那么最好用外部表,一個目錄的數據需要被spark、hbase等其他組件使用,並且hive也要使用,那么該份數據通過創建一張臨時表為外部表,然后通過寫HQL語句轉換該份數據到hive內部表中
8、 分桶
分桶操作:按照用戶創建表時指定的分桶字段進行hash散列,跟MapReduce中的HashPartitioner的原理一模一樣。
MapReduce中:按照key的hash值去模除以reductTask的個數;Hive中:按照分桶字段的hash值去模除以分桶的個數
hive分桶操作的效果:把一個文件按照某個特定的字段和桶數 散列成多個文件
好處:1、方便抽樣;2、提高join查詢效率
9、 Hive分區
做統計的時候少統計,把我們的數據放在多個文件夾里邊,我們統計時候,可以指定分區,這樣范圍就會小一些,這樣就減少了運行的時間。
10、 Hive 的所有跟數據相關的概念
db: myhive, table: student 元數據:hivedb
Hive的元數據指的是 myhive 和 student等等的庫和表的相關的各種定義信息,該元數據都是存儲在mysql中的:
1. myhive是hive中的一個數據庫的概念,其實就是HDFS上的一個文件夾,跟mysql沒有多大的關系;
2. myhive是hive中的一個數據庫,那么就會在元數據庫hivedb當中的DBS表中存儲一個記錄,這一條記錄就是myhive這個hive中數據的相關描述信息。
3. hive中創建一個庫,就相當於是在hivedb中DBS(數據庫)中插入一張表, 並且在HDFS上建立相應的目錄—主目錄;
4. hive中創建一個表,就相當於在hivedb中TBLS(數據庫中的表)表中插入一條記錄,並且在HDFS上項目的庫目錄下創建一個子目錄;
5. 一個hive數據倉庫就依賴於一個RDBMS(關系數據庫管理系統)中的一個數據庫,一個數據庫實例對應於一個Hive數據倉庫;
6. 存儲於該hive數據倉庫中的所有數據的描述信息,都統統存儲在元數據庫hivedb中。
11、 源數據與元數據
1. Hive元數據 :描述和管理這些block信息的數據,由namenode管理,一定指跟 hivedb相關,跟mysql相關;
2. Hive源數據-- block塊: HDFS上的對應表的目錄下的文件HDFS上的數據和元數據。
myhive 和 hivedb的區別:
1. myhive是hive中的數據庫: 用來存儲真實數據—源數據;
2. hivedb是mysql中的數據庫: 用來多個類似myhive庫的真實數據的描述數據—元數據;
1) Hive基本命令整理
創建表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
Creates a table called pokes with two columns, the first being an integer and the other a string
創建一個新表,結構與其他一樣
hive> create table new_table like records;
創建分區表:
hive> create table logs(ts bigint,line string) partitioned by (dt String,country String);
加載分區表數據:
hive> load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs partition (dt='2001-01-01',country='GB');
展示表中有多少分區:
hive> show partitions logs;
展示所有表:
hive> SHOW TABLES;
lists all the tables
hive> SHOW TABLES '.*s';
lists all the table that end with 's'. The pattern matching follows Java regular
expressions. Check out this link for documentation
顯示表的結構信息
hive> DESCRIBE invites;
shows the list of columns
更新表的名稱:
hive> ALTER TABLE source RENAME TO target;
添加新一列
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
刪除表:
hive> DROP TABLE records;
刪除表中數據,但要保持表的結構定義
hive> dfs -rmr /user/hive/warehouse/records;
從本地文件加載數據:
hive> LOAD DATA LOCAL INPATH '/home/hadoop/input/ncdc/micro-tab/sample.txt' OVERWRITE INTO TABLE records;
顯示所有函數:
hive> show functions;
查看函數用法:
hive> describe function substr;
查看數組、map、結構
hive> select col1[0],col2['b'],col3.c from complex;
其他同oracle相同
1.1.1 hive環境搭建
hive的元數據是存放在mysql中的,首先需要安裝mysql數據庫;然后修改hive配置文件,主要是數據庫用戶、密碼、hadoop文件存放的路徑等等。
1.1.1.1 mysql的安裝
1.將MySQL5.7上傳至centos7
一般搭建環境都是有相應的用戶和組,可以自己添加用戶和組,我是直接在安裝的時候就設置好了centos用戶。
tar -zxvf mysql-5.7.tar.gz -C /指定目錄 --用root用戶解壓
將解壓后的mysql文件在root下用chown命令只給你添加的用戶--chown 用戶名:組名 mysql ---這般麻煩操作,所以我在安裝系統的時候直接在界面設置好了。
2. 在添加的用戶下建立mysql數據文件目錄:mkdir home/centos/mysql/data ----~代表當前用戶目錄
3. 建立軟連接:ln -s mysql-5.7.tar.gz mysql --便於設置環境變量
4. 添加環境變量:#mysql
export MYSQL_HOME=/soft/mysql
export PATH=$PATH:$MYSQL_HOME/bin
5. mysql初始化--指定安裝目錄和數據存放目錄
./bin/mysqld --initialize --user=用戶名 --basedir=安裝目錄/mysql/data --datadir=/home/centos/mysql/data
在初始化的最下邊有一個對root賦權的密碼記錄下來
6. 復制啟動文件並賦予執行權限
cp mysql.server /etc/init.d/mysql_server
chmod +x /etc/init.d/mysql_server
7. 修改mysql_server啟動路徑(basedir 和datadir 是空的,填上就是)
basedir=安裝目錄/mysql/data
datadir=/home/centos/mysql/data
8. 刷新配置文件 source /etc/profile
9. 修改 /etc/my.cnf --如果不進行初始化,是沒有該文件的,這與之前版本是不同的
[client]
port=3306
[mysql_server]
basedir=安裝路徑
datadir=數據存放路徑
socket=/tmp/mysql.sock
user=用戶
[mysqld_safe]
log-error=錯誤日志路徑
pid-file=服務pid路徑
開始的時候配置文件不要添加太多的東西,否則不容易成功。
10. 啟動mysqld
service mysql_server start
netstat -anpt --查看端口
11. 進入mysql,修改密碼
mysql -u root -p
提示輸入密碼:前面初始化的密碼
set password for 'root'@'localhost'=password('新密碼');
授權
grant all on *.* to 用戶@'ip' identified by 密碼;
1.1.1.2 hive配置文件的修改
復制hive-default.xml.template為hive-site.xml
[hive/conf/hive-site.xml]
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://ip:3306/hive2</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
1.1.1.3 啟動hive
mysql-connector-java.jar驅動放入hive的lib目錄下。
執行初始化hive初始化命令
./soft/hive/bin/schematool -dbType mysql –initSchema
查看mysql數據庫中hive庫里是否有新的表(之前hive庫是空的)
hive>hive --version //
hive>hive --help