免費(fèi)空間網(wǎng)站怎么做出來的上海關(guān)鍵詞自動排名
一.SQL,Hive和MapReduce的關(guān)系
?用戶在hive上編寫sql語句,hive把sql語句轉(zhuǎn)化為MapReduce程序去執(zhí)行
?二.Hive架構(gòu)映射流程
用戶接口:
? ? ? ? 包括CLI、JDBC/ODBC、WebGUI,CLI(command line interface)為shell命令行;Hive中的Thrift服務(wù)器允許外部客戶端通過網(wǎng)絡(luò)與Hive進(jìn)行交互,類似于JDBC或ODBC協(xié)議。WebGUI是通過瀏覽器訪問Hive。
? ? ? ? --Hive提供了Hive Shell、ThriftServer等服務(wù)進(jìn)程向用戶提供操作接口
Driver:包括語法解析器、計(jì)劃編譯器、優(yōu)化器、執(zhí)行器
? ? ? ? 作用:完成HQL查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃存儲在HDFS中,并在隨后有MapReduce調(diào)用執(zhí)行。
? ? ? ? 注意:這部分內(nèi)容不是具體的服務(wù)進(jìn)程,而是封裝在Hive所依賴的Jar包中的Java代碼中。
元數(shù)據(jù)包含:用Hive創(chuàng)建的database、table、表的字段等元信息、
元數(shù)據(jù)存儲:存在關(guān)系型數(shù)據(jù)庫中,如hive內(nèi)置的Derby數(shù)據(jù)庫或者第三方MySQL數(shù)據(jù)庫等,一般用MySQL數(shù)據(jù)庫。
Metastore:即元數(shù)據(jù)存儲服務(wù)
作用是:客戶端連接Metastore服務(wù),Metastore再去連接MySQL等數(shù)據(jù)庫來存儲元數(shù)據(jù)。
特點(diǎn):有了Metastore服務(wù),就可以有多個客戶端同時(shí)連接,而且這些客戶端不需要知道MySQL等數(shù)據(jù)庫的用戶名和密碼,只需要Metastore服務(wù)即可。
三.MetaStore元數(shù)據(jù)管理三種模式
metastore服務(wù)配置有3中模式:內(nèi)嵌模式、本地模式、遠(yuǎn)程模式
推薦使用:遠(yuǎn)程模式
?內(nèi)嵌模式:
? ? ? ? 優(yōu)點(diǎn):配置簡單,hive命令直接可以使用
? ? ? ? 缺點(diǎn):不適用于生產(chǎn)環(huán)境,derby和Metastore服務(wù)都嵌入在Hive server進(jìn)程中,一個服務(wù)只能被一個客戶端連接:如果兩個客戶端以上就非常浪費(fèi)資源),且元數(shù)據(jù)不能共享
本地模式:
? ? ? ? 優(yōu)點(diǎn):可以單獨(dú)使用外部的數(shù)據(jù)庫(MySQL),元數(shù)據(jù)共享
? ? ? ? 缺點(diǎn):相對浪費(fèi)資源,Metastore嵌入到了hive進(jìn)程中,每啟動一次hive服務(wù),都內(nèi)置啟動了一個metastore。
遠(yuǎn)程模式:
????????優(yōu)點(diǎn):可以單獨(dú)使用外部庫(MySQL),可以共性元數(shù)據(jù),本地可以連接metastore服務(wù)也可以連接hiveserver2服務(wù),增加了擴(kuò)展性(其他依賴hive的軟件都可以通過metastore訪問hive)
? ? ? ? 缺點(diǎn):需要注意的是如果要啟動hiveserver2服務(wù)需要先啟動metastore服務(wù)
四.hive服務(wù)操作[重點(diǎn)]
啟動hive服務(wù)
[root@node1 /]# nohup hive --service metastore &
[1] 10693
[root@node1 /]nohup: 忽略輸入并把輸出追加到"nohup.out"[root@node1 /]# nohup hive --service hiveserver2 &
[2] 10829
您在 /var/spool/mail/root 中有新郵件
[root@node1 /]nohup: 忽略輸入并把輸出追加到"nohup.out"[root@node1 /]# jps
2704 NodeManager
2209 DataNode
10946 Jps
10693 RunJar
3208 JobHistoryServer
2075 NameNode
2557 ResourceManager
10829 RunJar[root@node1 /]# lsof -i:10000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 10829 root 522u IPv6 244847 0t0 TCP *:ndmp (LISTEN)
關(guān)閉hive服務(wù)
[root@node1 /]# jps
2704 NodeManager
2209 DataNode
10946 Jps
10693 RunJar
3208 JobHistoryServer
2075 NameNode
2557 ResourceManager
10829 RunJar
您在 /var/spool/mail/root 中有新郵件
[root@node1 /]# kill -9 10693 10829
[root@node1 /]# jps
2704 NodeManager
2209 DataNode
10946 Jps
3208 JobHistoryServer
2075 NameNode
2557 ResourceManager
[1]- 已殺死 nohup hive --service metastore
[2]+ 已殺死 nohup hive --service hiveserver2
五.客戶端連接[重點(diǎn)]
datagrip連接hive服務(wù)
創(chuàng)建datagrip項(xiàng)目
連接hive
?
配置驅(qū)動jar包?
?datagrip連接MySQL
六.數(shù)據(jù)倉庫和數(shù)據(jù)庫
數(shù)據(jù)倉庫和數(shù)據(jù)庫的區(qū)別?
數(shù)據(jù)庫與數(shù)據(jù)倉庫的區(qū)別:實(shí)際講的是OLTP與OLAP的區(qū)別
OLTP(On-Line Transaction Processin):叫聯(lián)機(jī)事務(wù)處理,也可以稱面向用戶交易的處理系統(tǒng), ?主要面向用戶進(jìn)行增刪改查OLAP(On-Line Analytical Processing):叫聯(lián)機(jī)分析處理,一般針對某些主題的歷史數(shù)據(jù)進(jìn)行分析 主要面向分析,支持管理決策。
數(shù)據(jù)倉庫主要特征:面向主題的(Subject-Oriented )、集成的(Integrated)、非易失的(Non-Volatile)和時(shí)變的(Time-Variant)
數(shù)據(jù)倉庫的出現(xiàn),并不是要取代數(shù)據(jù)庫,主要區(qū)別如下:
? ? 數(shù)據(jù)庫是面向事務(wù)的設(shè)計(jì),數(shù)據(jù)倉庫是面向主題設(shè)計(jì)的。
? ? 數(shù)據(jù)庫是為捕獲數(shù)據(jù)而設(shè)計(jì),數(shù)據(jù)倉庫是為分析數(shù)據(jù)而設(shè)計(jì)
?? ?數(shù)據(jù)庫一般存儲業(yè)務(wù)數(shù)據(jù),數(shù)據(jù)倉庫存儲的一般是歷史數(shù)據(jù)。
? ? 數(shù)據(jù)庫設(shè)計(jì)是盡量避免冗余,一般針對某一業(yè)務(wù)應(yīng)用進(jìn)行設(shè)計(jì),比如一張簡單的User表,記錄用戶名、密碼等簡單數(shù)據(jù)即可,符合業(yè)務(wù)應(yīng)用,但是不符合分析。
?? ?數(shù)據(jù)倉庫在設(shè)計(jì)是有意引入冗余,依照分析需求,分析維度、分析指標(biāo)進(jìn)行設(shè)計(jì)。
數(shù)據(jù)倉庫基礎(chǔ)三層結(jié)構(gòu)
?
?源數(shù)據(jù)層(ODS):此層數(shù)據(jù)無任何更改,直接沿用外圍系統(tǒng)數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù),不對外開放;為臨時(shí)存儲層,是接口數(shù)據(jù)的臨時(shí)存儲區(qū)域,為后一步的數(shù)據(jù)處理做準(zhǔn)備。
數(shù)據(jù)倉庫層(DW):也稱為細(xì)節(jié)層,DW層的數(shù)據(jù)應(yīng)該是一致的、準(zhǔn)確的、干凈的數(shù)據(jù),即對源系統(tǒng)數(shù)據(jù)進(jìn)行了清洗(去除了雜質(zhì))后的數(shù)據(jù)。
數(shù)據(jù)應(yīng)用層(DA或APP):前端應(yīng)用直接讀取的數(shù)據(jù)源;根據(jù)報(bào)表、專題分析需求而計(jì)算生成的數(shù)據(jù)。
?ETL和ELT
廣義上ETL:數(shù)據(jù)倉庫從各數(shù)據(jù)源獲取數(shù)據(jù)及在數(shù)據(jù)倉庫內(nèi)的數(shù)據(jù)轉(zhuǎn)換和流動都可以認(rèn)為是ETL(抽取Extract, 轉(zhuǎn)化Transform , 裝載Load)的過程。
但是在實(shí)際操作中將數(shù)據(jù)加載到倉庫卻產(chǎn)生了兩種不同做法:ETL和ELT。
狹義上ETL: 先從數(shù)據(jù)源池中抽取數(shù)據(jù),數(shù)據(jù)保存在臨時(shí)暫存數(shù)據(jù)庫中(ODS)。然后執(zhí)行轉(zhuǎn)換操作,將數(shù)據(jù)結(jié)構(gòu)化并轉(zhuǎn)換為適合目標(biāo)數(shù)據(jù)倉庫系統(tǒng)的形式,然后將結(jié)構(gòu)化數(shù)據(jù)加載到數(shù)據(jù)倉庫中進(jìn)行分析。
ELT: 從數(shù)據(jù)源中抽取后立即加載。沒有專門的臨時(shí)數(shù)據(jù)庫(ODS),這意味著數(shù)據(jù)會立即加載到單一的集中存儲庫中,數(shù)據(jù)在數(shù)據(jù)倉庫系統(tǒng)中直接進(jìn)行轉(zhuǎn)換,然后進(jìn)行分析
?七.hive數(shù)據(jù)庫操作
基本操作[掌握]
創(chuàng)建數(shù)據(jù)庫: create database [if not exists] 庫名 [location '路徑'];
使用數(shù)據(jù)庫: use 庫名;
注意: location路徑默認(rèn)是: ?hdfs://node1:8020/user/hive/warehouse/庫名.db
刪除數(shù)據(jù)庫: drop database 數(shù)據(jù)庫名 [cascade];
-- hive庫的核心操作
-- 創(chuàng)建數(shù)據(jù)庫
-- 注意: 默認(rèn)location路徑是/user/hive/warehouse/庫名.db
-- 庫路徑: /user/hive/warehouse/hive1.db
create database hive1;
-- 庫路徑: /user/hive/warehouse/test.db
create database test;
-- 使用庫
use hive1;
-- 注意: 建庫的時(shí)候可以使用location修改數(shù)據(jù)庫路徑
-- 庫路徑: /test1
create database test1 location '/test1';-- 為了方便演示location效果,可以先去分別創(chuàng)建一個簡單的表
-- 表路徑:/user/hive/warehouse/hive1.db/stu
create table hive1.stu(id int,name string);
-- 表路徑:/test1/stu
create table test1.stu(id int,name string);-- 演示刪除空數(shù)據(jù)庫
drop database test;
-- 鹽水刪除非空數(shù)據(jù)庫
drop database test1; -- 報(bào)錯,hive比較特殊,drop不能直接刪除有表的庫
-- drop+cascade能夠刪除有表的庫
drop database test1 cascade ;
其他操作[了解]
創(chuàng)建數(shù)據(jù)庫: create database [if not exists] 庫名 [comment '注釋'] [location '路徑'] [with dbproperties ('k'='v')];
修改數(shù)據(jù)庫路徑: alter database 庫名 set location 'hdfs://node1.itcast.cn:8020/路徑'
修改數(shù)據(jù)庫屬性: alter database 庫名 set dbproperties ('k'='v');查看所有的數(shù)據(jù)庫: show databases;
查看某庫建庫語句: show create database 庫名;
查看指定數(shù)據(jù)庫信息: desc database 庫名;
查看指定數(shù)據(jù)庫擴(kuò)展信息: desc database extended 庫名;
查看當(dāng)前使用的數(shù)據(jù)庫: select current_database();
-- hive庫的其他操作
-- schema在hive/mysql中相當(dāng)于database關(guān)鍵字
create schema demo1;
-- comment: 建庫的時(shí)候可以添加注釋,建議不要中文,因?yàn)閬y碼
-- location: 建表的時(shí)候可以指定hdfs上庫目錄路徑,建議使用默認(rèn)路徑/user/hive/warehouse/庫名.db
-- with dbproperties: 建表的時(shí)候可以設(shè)置屬性,格式是k=v,了解即可
create database demo2comment 'database'location '/user/hive/warehouse/demo2.db'with dbproperties ('name' = 'bz666');
create database demo3;-- 查看指定庫的建庫語句
show create database demo2;
show create database demo3;
-- 查看所有的數(shù)據(jù)庫
show databases;
-- 查看當(dāng)前使用數(shù)據(jù)庫
select current_database();
-- 查看指定庫的基本信息
desc database demo2;
-- 查看指定庫的擴(kuò)展信息
desc database extended demo2;-- 修改location路徑
-- 注意: 必須是絕對路徑,而且修改后的路徑如果不存在,不會直接創(chuàng)建
alter database demo2 set location 'hdfs://node1.itcast.cn:8020/demo2.db';
-- 以后建表的時(shí)候自動創(chuàng)建
create table demo2.stu(id int,name string);
-- 再次查看指定庫的擴(kuò)展信息
desc database extended demo2;-- 修改dbproperties
alter database demo2 set dbproperties('name'='binzi');
-- 再次查看指定庫的擴(kuò)展信息
desc database extended demo2;
八.Hive表概述
建表語法
create [external] table [if not exists] 表名(字段名 字段類型 , 字段名 字段類型 , ... )
[partitioned by (分區(qū)字段名 分區(qū)字段類型)] # 分區(qū)表固定格式
[clustered by (分桶字段名) ?into 桶個數(shù) buckets] ?# 分桶表固定格式 注意: 可以排序[sorted by (排序字段名 asc|desc)]
[row format delimited fields terminated by '字段分隔符'] # 自定義字段分隔符固定格式
[stored as textfile] ?# 默認(rèn)即可
[location 'hdfs://node1.itcast.cn:8020/user/hive/warehouse/庫名.db/表名'] # 默認(rèn)即可
; # 注意: 最后一定加分號結(jié)尾注意: 關(guān)鍵字順序是從上到下從左到右,否則報(bào)錯
數(shù)據(jù)類型
?基本數(shù)據(jù)類型: ?整數(shù): int ?小數(shù): float double ?字符串: string varchar(長度) ?日期: date timestamp
復(fù)雜數(shù)據(jù)類型: ?集合: array ?映射: map ? 結(jié)構(gòu)體: struct ?聯(lián)合體: union?
表分類?
?Hive中可以創(chuàng)建的表有好幾種類型, 分別是:
內(nèi)部表(管理表): MANAGED_TABLE
? ? 分區(qū)表
? ? 分桶表
外部表(非管理表): EXTERNAL_TABLE
? ? 分區(qū)表
? ? 分桶表
? ??
default默認(rèn)庫存儲路徑: hdfs://node1.itcast.cn:8020/user/hive/warehouse ??
自定義庫在HDFS的默認(rèn)存儲路徑: hdfs://node1.itcast.cn:8020/user/hive/warehouse/庫名.db
自定義表在HDFS的默認(rèn)存儲路徑: hdfs://node1.itcast.cn:8020/user/hive/warehouse/庫名.db/表名
業(yè)務(wù)數(shù)據(jù)文件在HDFS的默認(rèn)存儲路徑: hdfs://node1.itcast.cn:8020/user/hive/warehouse/庫名.db/表名/業(yè)務(wù)數(shù)據(jù)文件內(nèi)部表和外部表區(qū)別?
內(nèi)部表: 未被external關(guān)鍵字修飾的即是內(nèi)部表, 即普通表。 內(nèi)部表又稱管理表,還可以叫托管表
?? ?刪除內(nèi)部表:直接刪除元數(shù)據(jù)(metadata)和存儲數(shù)據(jù)本身
外部表: 被external關(guān)鍵字修飾的即是外部表, 即關(guān)聯(lián)表。 還可以叫非管理表或非托管表
?? ?刪除外部表:僅僅是刪除元數(shù)據(jù)(metadata),不會刪除存儲數(shù)據(jù)本身
-- 內(nèi)部表(又叫管理表或者托管表)
create table stu1(id int,name string
);
-- 外部表(又叫非管理表,非托管表)
create external table stu2(id int,name string
);
-- 查看表結(jié)構(gòu)
desc stu1;
desc stu2;
-- 查看表格式化信息
desc formatted stu1; -- 內(nèi)部表類型: managed_table
desc formatted stu2; -- 外部表類型: external_table-- 演示內(nèi)外部表的重點(diǎn)區(qū)別
-- 刪除內(nèi)部表(管理表/托管表),會刪除表相關(guān)的所有數(shù)據(jù)
insert into stu1 values(1,'張三');
drop table stu1;
-- 刪除外部表,只刪除了元數(shù)據(jù),hdfs中業(yè)務(wù)數(shù)據(jù)保留
insert into stu2 values(1,'張三');
drop table stu2;
-- 再次建表后,可以使用location重新關(guān)聯(lián)原來hdfs保留的業(yè)務(wù)數(shù)據(jù)
create external table stu22(id int,name string
)location '/user/hive/warehouse/hive1.db/stu2';
-- 驗(yàn)證數(shù)據(jù)
select * from stu22 limit 10;