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