HIVE—數據倉庫


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM