1. 程式人生 > >hive的設計思想和技術框架

hive的設計思想和技術框架

star color site _id mapreduce 方法 cdh5 www action

2019/2/20 星期三

此筆記參考2017年 優化與2019/2/20 星期三

Hive的設計思想和技術架構
Hive的基礎
Hive是一種數據倉庫工具,他的功能是講SQL語法表達的數據運算邏輯轉換為mapreduce程序在hadoop集群上對海量數據進行分析 //hive表是可以創建索引的 https://www.iteblog.com/archives/836.html //Hive創建索引
hive的設計思想
庫:sql語法表達成MapReduce的jar庫
因為,sql語法相對是一個規則的東西,我們把sql語法用MapReduce來表達出來,形成一個庫

翻譯器:可以接受sql語句,然後去翻譯,查找一個特定的mr程序。

1、翻譯器接受sql語句,然後去翻譯,
2、到sql庫中查找一個特定的mr程序。
3、提交hadoop集群上執行MR job

其實:hive就是翻譯器+庫+元數據庫 這三者封裝起來就是hive

hive中建立表語句:其實就是建立一種映射關系,這種映射關系就是表名,表裏面的字段,字段跟hdfs路徑上的字段怎麽對應起來,他要記錄這些信息,把這些信息記錄在元數據庫中

hive的技術架構 //見圖
其中最重要的是driver:包括 編譯器,優化器,執行器
metastore 元數據庫:可以是mysql,他自身攜帶了一個叫derby的數據庫

安裝hive
首先在官網下載hive,上傳到linux中 解壓到我們安裝的目錄下面,這裏我們是安裝在/usr/local/apps/下的

tar -zxvf hive(壓縮包) -C /usr/local/apps/
然後我們到安裝目錄下查看
cd /usr/local/apps/
hive 這個工具是不需要再每臺機器上安裝,他提供一個界面給我們,把SQL變成mr程序,提交給hadoop集群去執行,所以他在那邊運行都沒關系
hive
hive依賴與hadoop的集群環境,他運算所用的框架是mr所以在運行hive之前要確保hadoop的開啟
首先 start-dfs.sh
start-yarn.sh
然後在hive的安裝包下的bin目錄下有一個hive可以直接運行hive
./hive
這樣就啟動起來了
進入hive> 他是支持sql語句的,我們來執行show databases
show table

hive的4中使用方式:https://blog.csdn.net/ansiallen/article/details/79427468 //參考鏈接
1、Hive交互shell
bin/hive
2、hive啟動服務,為客戶端提供服務
bin/hiveserver2 //cdh版本安裝就是用的這種方式。分為hive的客戶端和服務端
3、Hive命令
hive -e ‘show databases’
bin/hive -e ‘use itcast; show tables;select * from emp_add_sp;‘
4、Hive JDBC服務(參考java jdbc連接mysql)
備註:在cdh中hiveserver2安裝在那臺服務器上才可以用hive shell進入到hive後臺
我們的測試都是在cdh集群上,cdh建議使用方法2 beeline方式連接hive
方法1
[root@hadoop-node01 ~]# hive shell

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/hive-log4j.properties
WARNING: Hive CLI is deprecated and migration to Beeline is recommended.
使用jar中的配置初始化日誌:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/ hive-log4j.properties
警告:不推薦使用Hive CLI,建議遷移到Beeline。
hive> show databases;
OK
default
Time taken: 1.021 seconds, Fetched: 1 row(s)

方法3
[root@hadoop-node01 ~]# beeline -u "jdbc:hive2://192.168.0.121:10000"
scan complete in 2ms
Connecting to jdbc:hive2://192.168.0.121:10000
Connected to: Apache Hive (version 1.1.0-cdh5.9.2)
Driver: Hive JDBC (version 1.1.0-cdh5.9.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.1.0-cdh5.9.2 by Apache Hive
0: jdbc:hive2://192.168.0.121:10000> show databases;
INFO : Compiling command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d): show databases
INFO : Semantic Analysis Completed
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d); Time taken: 0.171 seconds
INFO : Executing command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d): show databases
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=hive_20190220165252_c67ca92d-e023-421d-931e-a2b4e2c31f7d); Time taken: 0.067 seconds
INFO : OK
+----------------+--+
| database_name |
+----------------+--+
| default |
+----------------+--+
1 row selected (0.369 seconds)

方法3
[root@hadoop-node01 ~]# hive -e ‘show databases;‘

Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.9.2-1.cdh5.9.2.p0.3/jars/hive-common-1.1.0-cdh5.9.2.jar!/hive-log4j.properties
OK
default
Time taken: 1.659 seconds, Fetched: 1 row(s)

方法4:略
——————————————————————————————————————————————————————————————————————————————————————————————
這樣其實hive就可以用了
hive>create table t_order(

id int,produce_id string,numble int,amount double)
row format delimited(這句話的意思是,文件裏的一行就是我們這個表中的一條記錄)
fields terminated by ‘,‘;(這句話的意思是:我們用‘,‘作為分隔符)
然後show table 看表在不在
隨後我們在表中導入數據
首先我們要在集群中創建一個文件(隨便那臺機器上去做)
mkdir hivedata
cd hivedata/
vi order.data.1
在這裏面我們存入我們的數據
我們linux本地會有這個文件,我們需要上傳到hdfs文件中
hadoop fs -put order.data.1 /user/hive/warehouse/t_order
網頁中刷新一下,就可以找到order.data.1這個文件
然後我們就可以再hive這邊查詢這個文件了
hive >select from t_order;(就會查看到我們剛剛在order.data.1中所寫的數據)
hive >select count(
) from t_order;(計數)
用mapreduce程序去跑,計數出有多少個數據值。
hive >select distinct(priduce_id) from t_order;(查詢一下訂單中不重復是商品id)

其實上傳的時候我們可以再hive中使用命令去從本地上傳到hive中
hive >load data local inpath ‘/root/order.data.1‘ into table t_order;
在這之前,我們是在另外的機器上去建order.data.1 所以我們需要拷貝到主機00 的機器上去
scp order.data.1 hadoop-server-00:/root/

hive >select * from t_order;(只有這個語句不需要轉換為mr語句)

hive >select id,product_id from t_order;(只查詢id,prdcuct_id 需要轉換為mr語句去執行)

hive的內部表和外部表的區別(對hive來說內部表和外部表的區別也就是文件存放的位置不同,但是對於hive的管理來說,就有區別 當我們刪除內部表的時候[dorp table t_order] 在 show tables 的時候就沒有了,同時在/user/hive/warehouse/的表都刪除了,hdfs裏面是數據都沒有了。而外部表[dorp table t_product] 然後show tables hive裏面也把對 t_product這個表的描述信息也刪除了,但是在hdfs裏面的數據還是存在的)
內部表是創建的表必須放在/user/hive/warehouse 這個目錄下
而外部表不需要必須放在/user/hive/warehouse下面 可以放在hdfs文件系統的任何位置
創建外部表的語句:
hive>create external table t_product(

id int,produce_id string,numble int,amount double)
row format delimited(這句話的意思是,文件裏的一行就是我們這個表中的一條記錄)
fields terminated by ‘\t‘(這句話的意思是:我們用‘tab‘作為分隔符)
location ‘/diangshang/product‘;(指定這個表放在哪裏 放在hdfs的根目錄下的diangshang/product)
然後show table
到網頁上去看看

有兩個表之後接下來我們做個鏈表查詢
hive >select o.id,o.produce_id,p.typeid,p.color,o.numble,o.amount

from t_order o join t_product p (這裏的o p 分別代表著兩個表的別名)
on o.produce_id=p.id;

linux中mysql數據庫的安裝
首先查詢一下,你的linux系統中是否安裝了mysql
rpm -qa mysql
如果出來mysql那就說明安裝過了,接下來我們就需要卸載原來安裝的
rpm -e mysql  // 普通刪除模式
rpm -e --nodeps mysql  // 強力刪除模式,如果使用上面命令刪除時,提示有依賴的其它文件,則用該命令可以對其進行強力刪除(這裏我們推薦強力刪除)
刪除後我們再查詢一下有沒有卸載幹凈
rpm -qa mysql
進入到mysql的文件夾中
cd mysql文件夾
初始化數據庫
scripts/mysql_install_db --user=mysql
[這些命令都不是必須的
chown -R root .(修改 文件的 所有者)(.代表當前目錄)
chown -R mysql data(也就是把data從root用戶改成mysql)(修改data文件夾的所有者)
chgrp -R mysql .(改變用戶組)]

啟動mysql
bin/mysqld_safe --user=mysql &(&表示:以後臺的方式啟動)
沒有錯誤就代表啟動成功
netstart -anp |more (查看mysql的端口號3306)
使用mysql
在bin目錄下面有一個mysql
./mysql -u root -p
系統提示你輸入密碼
一開始密碼為空

如果希望在任何一個目錄下都可以進入mysql,則需要在/root/etc/profile添加路徑

hive元數據庫配置
hive自身也帶了一個元數據庫叫derby數據庫 derby這個數據庫系統產生的信息放在merastoer_db裏面 利用derby這個數據庫只是保存了表的描述信息,並不會用這個數據庫去保存hive表裏面的內容,hive表裏面的內容是海量的巨大的,我們把他放在hdfs文件裏面的
hive自帶的元數據量derby有一個巨大的弊端 弊端是:derby這個數據庫只能是單實例的去訪問,也就是說,只能是一個人去操作,不支持多人操作
所以我們要修改hive所默認的berby元數據庫,我們只需要在conf目錄下加一個hive-site.xml
cd conf/
vi hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-server-00: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>root</value>
</property>
</configuration>

保存退出

mysql -uroot -proot (連接mysql數據量,用戶名是root 密碼是root)

接下來要把jdbc的驅動com.mysql.jdbc.Driver放到hive/lib 裏面
首先,我們在CRT中的sftp中切換到hive/lib
cd /root/usr/local/apps/hive- /lib
put 驅動在windows的位置
就上傳到了lib中
這樣就可以用了,不管在哪裏啟動hive都可以多人訪問hive了

hive的設計思想和技術框架