關(guān)于我們
書(shū)單推薦
新書(shū)推薦
|
Hadoop構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)實(shí)踐
本書(shū)內(nèi)容包括數(shù)據(jù)倉(cāng)庫(kù)、Hadoop及其生態(tài)圈的相關(guān)概念, 使用Sqoop從關(guān)系數(shù)據(jù)庫(kù)全量或增量抽取數(shù)據(jù), 使用Hive進(jìn)行數(shù)據(jù)轉(zhuǎn)換和裝載處理, 使用Oozie調(diào)度作業(yè)周期性執(zhí)行, 使用Impala進(jìn)行快速聯(lián)機(jī)數(shù)據(jù)分析, 使用Hue將數(shù)據(jù)可視化, 以及數(shù)據(jù)倉(cāng)庫(kù)中的漸變維 (SCD)、代理鍵、角色扮演維度、層次維度、退化維度、無(wú)事實(shí)的事實(shí)表、遲到的事實(shí)、累積的度量等常見(jiàn)問(wèn)題在Hadoop上的處理等。
王雪迎 ,畢業(yè)于中國(guó)地質(zhì)大學(xué)計(jì)算機(jī)專業(yè),高級(jí)工程師,擁有20年數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)相關(guān)技術(shù)經(jīng)驗(yàn)。曾先后供職于北京現(xiàn)代商業(yè)信息技術(shù)有限公司、北京在線九州信息技術(shù)服務(wù)有限公司、華北計(jì)算技術(shù)研究所、北京優(yōu)貝在線網(wǎng)絡(luò)科技有限公司,擔(dān)任DBA、數(shù)據(jù)架構(gòu)師等職位。
第1章 數(shù)據(jù)倉(cāng)庫(kù)簡(jiǎn)介
1.1 什么是數(shù)據(jù)倉(cāng)庫(kù) 1
1.1.1 數(shù)據(jù)倉(cāng)庫(kù)的定義 1
1.1.2 建立數(shù)據(jù)倉(cāng)庫(kù)的原因 3
1.2 操作型系統(tǒng)與分析型系統(tǒng) 5
1.2.1 操作型系統(tǒng) 5
1.2.2 分析型系統(tǒng) 8
1.2.3 操作型系統(tǒng)和分析型系統(tǒng)對(duì)比 9
1.3 數(shù)據(jù)倉(cāng)庫(kù)架構(gòu) 10
1.3.1 基本架構(gòu) 10
1.3.2 主要數(shù)據(jù)倉(cāng)庫(kù)架構(gòu) 12
1.3.3 操作數(shù)據(jù)存儲(chǔ) 16
1.4 抽取-轉(zhuǎn)換-裝載 17
1.4.1 數(shù)據(jù)抽取 17
1.4.2 數(shù)據(jù)轉(zhuǎn)換 19
1.4.3 數(shù)據(jù)裝載 20
1.4.4 開(kāi)發(fā)ETL系統(tǒng)的方法 21
1.4.5 常見(jiàn)ETL工具 21
1.5 數(shù)據(jù)倉(cāng)庫(kù)需求 22
1.5.1 基本需求 22
1.5.2 數(shù)據(jù)需求 23
1.6 小結(jié) 24
第2章 數(shù)據(jù)倉(cāng)庫(kù)設(shè)計(jì)基礎(chǔ)
2.1 關(guān)系數(shù)據(jù)模型 25
2.1.1 關(guān)系數(shù)據(jù)模型中的結(jié)構(gòu) 25
2.1.2 關(guān)系完整性 28
2.1.3 規(guī)范化 30
2.1.4 關(guān)系數(shù)據(jù)模型與數(shù)據(jù)倉(cāng)庫(kù) 33
2.2 維度數(shù)據(jù)模型 34
2.2.1 維度數(shù)據(jù)模型建模過(guò)程 35
2.2.2 維度規(guī)范化 36
2.2.3 維度數(shù)據(jù)模型的特點(diǎn) 37
2.2.4 星型模式 38
2.2.5 雪花模式 40
2.3 Data Vault模型 42
2.3.1 Data Vault模型簡(jiǎn)介 42
2.3.2 Data Vault模型的組成部分 43
2.3.3 Data Vault模型的特點(diǎn) 44
2.3.4 Data Vault模型的構(gòu)建 44
2.3.5 Data Vault模型實(shí)例 46
2.4 數(shù)據(jù)集市 49
2.4.1 數(shù)據(jù)集市的概念 50
2.4.2 數(shù)據(jù)集市與數(shù)據(jù)倉(cāng)庫(kù)的區(qū)別 50
2.4.3 數(shù)據(jù)集市設(shè)計(jì) 50
2.5 數(shù)據(jù)倉(cāng)庫(kù)實(shí)施步驟 51
2.6 小結(jié) 54
第3章 Hadoop生態(tài)圈與數(shù)據(jù)倉(cāng)庫(kù)
3.1 大數(shù)據(jù)定義 55
3.2 Hadoop簡(jiǎn)介 56
3.2.1 Hadoop的構(gòu)成 57
3.2.2 Hadoop的主要特點(diǎn) 58
3.2.3 Hadoop架構(gòu) 58
3.3 Hadoop基本組件 59
3.3.1 HDFS 60
3.3.2 MapReduce 65
3.3.3 YARN 72
3.4 Hadoop生態(tài)圈的其他組件 77
3.5 Hadoop與數(shù)據(jù)倉(cāng)庫(kù) 81
3.5.1 關(guān)系數(shù)據(jù)庫(kù)的可擴(kuò)展性瓶頸 82
3.5.2 CAP理論 84
3.5.3 Hadoop數(shù)據(jù)倉(cāng)庫(kù)工具 85
3.6 小結(jié) 88
第4章 安裝Hadoop
4.1 Hadoop主要發(fā)行版本 89
4.1.1 Cloudera Distribution for Hadoop(CDH) 89
4.1.2 Hortonworks Data Platform(HDP) 90
4.1.3 MapR Hadoop 90
4.2 安裝Apache Hadoop 91
4.2.1 安裝環(huán)境 91
4.2.2 安裝前準(zhǔn)備 92
4.2.3 安裝配置Hadoop 93
4.2.4 安裝后配置 97
4.2.5 初始化及運(yùn)行 97
4.3 配置HDFS Federation 99
4.4 離線安裝CDH及其所需的服務(wù) 104
4.4.1 CDH安裝概述 104
4.4.2 安裝環(huán)境 106
4.4.3 安裝配置 106
4.4.4 Cloudera Manager許可證管理 114
4.5 小結(jié) 115
第5章 Kettle與Hadoop
5.1 Kettle概述 117
5.2 Kettle連接Hadoop 119
5.2.1 連接HDFS 119
5.2.2 連接Hive 124
5.3 導(dǎo)出導(dǎo)入Hadoop集群數(shù)據(jù) 128
5.3.1 把數(shù)據(jù)從HDFS抽取到RDBMS 128
5.3.2 向Hive表導(dǎo)入數(shù)據(jù) 132
5.4 執(zhí)行Hive的HiveQL語(yǔ)句 134
5.5 MapReduce轉(zhuǎn)換示例 135
5.6 Kettle提交Spark作業(yè) 143
5.6.1 安裝Spark 143
5.6.2 配置Kettle向Spark集群提交作業(yè) 146
5.7 小結(jié) 149
第6章 建立數(shù)據(jù)倉(cāng)庫(kù)示例模型
6.1 業(yè)務(wù)場(chǎng)景 150
6.2 Hive相關(guān)配置 152
6.2.1 選擇文件格式 152
6.2.2 支持行級(jí)更新 159
6.2.3 Hive事務(wù)支持的限制 164
6.3 Hive表分類 164
6.4 向Hive表裝載數(shù)據(jù) 169
6.5 建立數(shù)據(jù)庫(kù)表 174
6.6 裝載日期維度數(shù)據(jù) 179
6.7 小結(jié) 180
第7章 數(shù)據(jù)抽取
7.1 邏輯數(shù)據(jù)映射 182
7.2 數(shù)據(jù)抽取方式 185
7.3 導(dǎo)出成文本文件 191
7.4 分布式查詢 196
7.5 使用Sqoop抽取數(shù)據(jù) 200
7.5.1 Sqoop簡(jiǎn)介 200
7.5.2 CDH 5.7.0中的Sqoop 203
7.5.3 使用Sqoop抽取數(shù)據(jù) 203
7.5.4 Sqoop優(yōu)化 207
7.6 小結(jié) 208
第8章 數(shù)據(jù)轉(zhuǎn)換與裝載
8.1 數(shù)據(jù)清洗 210
8.2 Hive簡(jiǎn)介 214
8.2.1 Hive的體系結(jié)構(gòu) 215
8.2.2 Hive的工作流程 216
8.2.3 Hive服務(wù)器 218
8.2.4 Hive客戶端 221
8.3 初始裝載 231
8.4 定期裝載 236
8.5 Hive優(yōu)化 246
8.6 小結(jié) 254
第9章 定期自動(dòng)執(zhí)行ETL作業(yè)
9.1 crontab 256
9.2 Oozie簡(jiǎn)介 260
9.2.1 Oozie的體系結(jié)構(gòu) 260
9.2.2 CDH 5.7.0中的Oozie 262
9.3 建立定期裝載工作流 262
9.4 建立協(xié)調(diào)器作業(yè)定期自動(dòng)執(zhí)行工作流 271
9.5 Oozie優(yōu)化 275
9.6 小結(jié) 276
第10章 維度表技術(shù)
10.1 增加列 278
10.2 維度子集 285
10.3 角色扮演維度 292
10.4 層次維度 298
10.4.1 固定深度的層次 299
10.4.2 遞歸 302
10.4.3 多路徑層次 310
10.4.4 參差不齊的層次 312
10.5 退化維度 313
10.6 雜項(xiàng)維度 316
10.7 維度合并 323
10.8 分段維度 329
10.9 小結(jié) 335
第11章 事實(shí)表技術(shù)
11.1 事實(shí)表概述 336
11.2 周期快照 337
11.3 累積快照 343
11.4 無(wú)事實(shí)的事實(shí)表 349
11.5 遲到的事實(shí) 354
11.6 累積度量 360
11.7 小結(jié) 366
第12章 聯(lián)機(jī)分析處理
12.1 聯(lián)機(jī)分析處理簡(jiǎn)介 367
12.1.1 概念 367
12.1.2 分類 368
12.1.3 性能 371
12.2 Impala簡(jiǎn)介 371
12.3 Hive、SparkSQL、Impala比較 377
12.3.1 Spark SQL簡(jiǎn)介 377
12.3.2 Hive、Spark SQL、Impala比較 379
12.3.3 Hive、Spark SQL、Impala性能對(duì)比 382
12.4 聯(lián)機(jī)分析處理實(shí)例 387
12.5 Apache Kylin與OLAP 399
12.5.1 Apache Kylin架構(gòu) 399
12.5.2 Apache Kylin安裝 401
12.6 小結(jié) 407
第13章 數(shù)據(jù)可視化
13.1 數(shù)據(jù)可視化簡(jiǎn)介 408
13.2 Hue簡(jiǎn)介 410
13.2.1 Hue功能快速預(yù)覽 411
13.2.2 配置元數(shù)據(jù)存儲(chǔ) 412
13.3 Zeppelin簡(jiǎn)介 415
13.3.1 Zeppelin架構(gòu) 415
13.3.2 Zeppelin安裝配置 416
13.3.3 在Zeppelin中添加MySQL翻譯器 421
13.4 Hue、Zeppelin比較 425
13.5 數(shù)據(jù)可視化實(shí)例 426
13.6 小結(jié) 434
第9章
?定期自動(dòng)執(zhí)行ETL作業(yè)?
一旦數(shù)據(jù)倉(cāng)庫(kù)開(kāi)始使用,就需要不斷從源系統(tǒng)給數(shù)據(jù)倉(cāng)庫(kù)提供新數(shù)據(jù)。為了確保數(shù)據(jù)流的穩(wěn)定,需要使用所在平臺(tái)上可用的任務(wù)調(diào)度器來(lái)調(diào)度ETL定期執(zhí)行。調(diào)度模塊是ETL系統(tǒng)必不可少的組成部分,它不但是數(shù)據(jù)倉(cāng)庫(kù)的基本需求,也對(duì)項(xiàng)目的成功起著舉足輕重的作用。
操作系統(tǒng)一般都為用戶提供調(diào)度作業(yè)的功能,如Windows的“計(jì)劃任務(wù)”和UNIX/Linux的cron系統(tǒng)服務(wù)。絕大多數(shù)Hadoop系統(tǒng)都運(yùn)行在Linux之上,因此本章詳細(xì)討論兩種Linux上定時(shí)自動(dòng)執(zhí)行ETL作業(yè)的方案。一種是經(jīng)典的crontab,這是操作系統(tǒng)自帶的功能,二是Hadoop生態(tài)圈中的Oozie組件。為了演示Hadoop對(duì)數(shù)據(jù)倉(cāng)庫(kù)的支持能力,我們的示例將使用后者實(shí)現(xiàn)ETL執(zhí)行自動(dòng)化。
9.1crontab
上一章我們已經(jīng)準(zhǔn)備好用于定期裝載的regular_etl.shshell腳本文件,可以很容易地用crontab命令創(chuàng)建一個(gè)任務(wù),定期運(yùn)行此腳本。
#修改文件屬性為可執(zhí)行
chmod755/root/regular_etl.sh
#編輯crontab文件內(nèi)容
crontab-e
#添加如下一行,指定每天2點(diǎn)執(zhí)行定期裝載作業(yè),然后保存退出
02***/root/regular_etl.sh
這就可以了,需要用戶做的就是如此簡(jiǎn)單,其他的事情交給cron系統(tǒng)服務(wù)去完成。提供cron服務(wù)的進(jìn)程名為crond,這是Linux下一個(gè)用來(lái)周期性執(zhí)行某種任務(wù)或處理某些事件的守護(hù)進(jìn)程。當(dāng)安裝完操作系統(tǒng)后,會(huì)自動(dòng)啟動(dòng)crond進(jìn)程,它每分鐘會(huì)定期檢查是否有要執(zhí)行的任務(wù),如果有則自動(dòng)執(zhí)行該任務(wù)。
Linux下的任務(wù)調(diào)度分為兩類,系統(tǒng)任務(wù)調(diào)度和用戶任務(wù)調(diào)度。
?系統(tǒng)任務(wù)調(diào)度:系統(tǒng)需要周期性執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤、日志清理等。在/etc目錄下有一個(gè)crontab文件,這個(gè)就是系統(tǒng)任務(wù)調(diào)度的配置文件。
?用戶任務(wù)調(diào)度:用戶要定期執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時(shí)郵件提醒等。用戶可以使用crontab命令來(lái)定制自己的計(jì)劃任務(wù)。所有用戶定義的crontab文件都被保存在/var/spool/cron目錄中,其文件名與用戶名一致。
1.crontab權(quán)限
Linux系統(tǒng)使用一對(duì)allow/deny文件組合判斷用戶是否具有執(zhí)行crontab的權(quán)限。如果用戶名出現(xiàn)在/etc/cron.allow文件中,則該用戶允許執(zhí)行crontab命令。如果此文件不存在,那么如果用戶名沒(méi)有出現(xiàn)在/etc/cron.deny文件中,則該用戶允許執(zhí)行crontab命令。如果只存在cron.deny文件,并且該文件是空的,則所有用戶都可以使用crontab命令。如果這兩個(gè)文件都不存在,那么只有root用戶可以執(zhí)行crontab命令。allow/deny文件由每行一個(gè)用戶名構(gòu)成。
2.crontab命令
通過(guò)crontab命令,我們可以在固定間隔的時(shí)間點(diǎn)執(zhí)行指定的系統(tǒng)指令或shell腳本。時(shí)間間隔的單位可以是分鐘、小時(shí)、日、月、周及以上的任意組合。crontab命令格式如下:
crontab[-uuser]file
crontab[-uuser][-e|-l|-r]
說(shuō)明:
?-uuser:用來(lái)設(shè)定某個(gè)用戶的crontab服務(wù),此參數(shù)一般由root用戶使用。
?file:file是命令文件的名字,表示將file作為crontab的任務(wù)列表文件并載入crontab。如果在命令行中沒(méi)有指定這個(gè)文件,crontab命令將接受標(biāo)準(zhǔn)輸入,通常是鍵盤上鍵入的命令,并將它們載入crontab。
?-e:編輯某個(gè)用戶的crontab文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的crontab文件。如果文件不存在,則創(chuàng)建一個(gè)。
?-l:顯示某個(gè)用戶的crontab文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的crontab文件內(nèi)容。
?-r:從/var/spool/cron目錄中刪除某個(gè)用戶的crontab文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的crontab文件。
注意:如果不經(jīng)意地輸入了不帶任何參數(shù)的crontab命令,不要使用Control-d退出,因?yàn)檫@會(huì)刪除用戶所對(duì)應(yīng)的crontab文件中的所有條目。代替的方法是用Control-c退出。
3.crontab文件
用戶所建立的crontab文件中,每一行都代表一項(xiàng)任務(wù),每行的每個(gè)字段代表一項(xiàng)設(shè)置。它的格式共分為六個(gè)字段,前五段是時(shí)間設(shè)定段,第六段是要執(zhí)行的命令段,格式如下:
.----------------分鐘(0-59)
|.-------------小時(shí)(0-23)
||.----------日期(1-31)
|||.-------月份(1-12)
||||.----星期(0-6,代表周日到周一)
|||||
*****要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。
在以上各個(gè)時(shí)間字段中,還可以使用如下特殊字符:
?星號(hào)(*):代表所有可能的值,例如“月份”字段如果是星號(hào),則表示在滿足其他字段的制約條件后每月都執(zhí)行該命令操作。
?逗號(hào)(,):可以用逗號(hào)隔開(kāi)的值指定一個(gè)列表范圍,例如,“1,2,5,7,8,9”。
?中杠(-):可以用整數(shù)之間的中杠表示一個(gè)整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”。
?正斜線(/):可以用正斜線指定時(shí)間的間隔頻率,例如“0-23/2”表示每?jī)尚r(shí)執(zhí)行一次。同時(shí)正斜線可以和星號(hào)一起使用,例如*/10,如果用在“分鐘”字段,表示每十分鐘執(zhí)行一次。
注意,“日期”和“星期”字段都可以指定哪天執(zhí)行,如果兩個(gè)字段都設(shè)置了,則執(zhí)行的日期是兩個(gè)字段的并集。
4.crontab示例
#每1分鐘執(zhí)行一次command
*****command
#每小時(shí)的第3和第15分鐘執(zhí)行
3,15****command
#在上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行
3,158-11***command
#每隔兩天的上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行
3,158-11*/2**command
#每個(gè)星期一的上午8點(diǎn)到11點(diǎn)的第3和第15分鐘執(zhí)行
3,158-11**1command
#每晚的21:30執(zhí)行
3021***command
#每月1、10、22日的4:45執(zhí)行
4541,10,22**command
#每周六、周日的1:10執(zhí)行
101**6,0command
#每天18:00至23:00之間每隔30分鐘執(zhí)行
0,3018-23***command
#每星期六的晚上11:00執(zhí)行
023**6command
#每一小時(shí)執(zhí)行一次
**/1***command
#晚上11點(diǎn)到早上7點(diǎn)之間,每隔一小時(shí)執(zhí)行一次
*23-7/1***command
#每月的4號(hào)與每周一到周三的11點(diǎn)執(zhí)行
0114*1-3command
#一月一號(hào)的4點(diǎn)執(zhí)行
0411*command
#每小時(shí)執(zhí)行/etc/cron.hourly目錄內(nèi)的腳本
01****rootrun-parts/etc/cron.hourly
說(shuō)明:run-parts會(huì)遍歷目標(biāo)文件夾,執(zhí)行第一層目錄下具有可執(zhí)行權(quán)限的文件。
5.crontab環(huán)境
有時(shí)我們創(chuàng)建了一個(gè)crontab任務(wù),但是這個(gè)任務(wù)卻無(wú)法自動(dòng)執(zhí)行,而手動(dòng)執(zhí)行腳本卻沒(méi)有問(wèn)題,這種情況一般是由于在crontab文件中沒(méi)有配置環(huán)境變量引起的。cron從用戶所在的主目錄中使用shell調(diào)用需要執(zhí)行的命令。cron為每個(gè)shell提供了一個(gè)默認(rèn)的環(huán)境,Linux下的定義如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=用戶名
HOME=用戶主目錄
在crontab文件中定義多個(gè)調(diào)度任務(wù)時(shí),需要特別注意的一個(gè)問(wèn)題就是環(huán)境變量的設(shè)置,因?yàn)槲覀兪謩?dòng)執(zhí)行某個(gè)腳本時(shí),是在當(dāng)前shell環(huán)境下進(jìn)行的,程序能找到環(huán)境變量;而系統(tǒng)自動(dòng)執(zhí)行任務(wù)調(diào)度時(shí),除了默認(rèn)的環(huán)境,是不會(huì)加載任何其他環(huán)境變量的。因此就需要在crontab文件中指定任務(wù)運(yùn)行所需的所有環(huán)境變量。
不要假定cron知道所需要的特殊環(huán)境,它其實(shí)并不知道。所以用戶要保證在shell腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動(dòng)設(shè)置的全局變量。以下三點(diǎn)需要注意:
?腳本中涉及文件路徑時(shí)寫絕對(duì)路徑;
?腳本執(zhí)行要用到環(huán)境變量時(shí),通過(guò)source命令顯式引入,例如:
#!/bin/sh
source/etc/profile
?當(dāng)手動(dòng)執(zhí)行腳本沒(méi)問(wèn)題,但是crontab不執(zhí)行時(shí),可以嘗試在crontab中直接引入環(huán)境變量解決問(wèn)題,例如:
0****./etc/profile;/bin/sh/path/to/myscript.sh
6.重定向輸出郵件
默認(rèn)時(shí),每條任務(wù)調(diào)度執(zhí)行完畢,系統(tǒng)都會(huì)將任務(wù)輸出信息通過(guò)電子郵件的形式發(fā)送給當(dāng)前系統(tǒng)用戶。這樣日積月累,日志信息會(huì)非常大,可能會(huì)影響系統(tǒng)的正常運(yùn)行。因此,將每條任務(wù)進(jìn)行重定向處理非常重要?梢栽赾rontab文件中設(shè)置如下形式,忽略日志輸出:
0*/3***/usr/local/myscript.sh>/dev/null2>&1
“>/dev/null2>&1”表示先將標(biāo)準(zhǔn)輸出重定向到/dev/null,然后將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出。由于標(biāo)準(zhǔn)輸出已經(jīng)重定向到了/dev/null,因此標(biāo)準(zhǔn)錯(cuò)誤也會(huì)重定向到/dev/null,這樣日志輸出問(wèn)題就解決了。
7.生成日志文件
可以將crontab執(zhí)行任務(wù)的輸出信息重定向到一個(gè)自定義的日志文件中,例如:
8***rm/home/someuser/tmp/*>/home/someuser/cronlogs/clean_tmp_dir.log
9.2Oozie簡(jiǎn)介
除了利用操作系統(tǒng)提供的功能以外,Hadoop生態(tài)圈的工具也可以完成同樣的調(diào)度任務(wù),而且更靈活,這個(gè)組件就是Oozie。
Oozie是一個(gè)管理Hadoop作業(yè)、可伸縮、可擴(kuò)展、可靠的工作流調(diào)度系統(tǒng),它內(nèi)部定義了三種作業(yè):工作流作業(yè)、協(xié)調(diào)器作業(yè)和Bundle作業(yè)。工作流作業(yè)是由一系列動(dòng)作構(gòu)成的有向無(wú)環(huán)圖(DAGs),協(xié)調(diào)器作業(yè)是按時(shí)間頻率周期性觸發(fā)Oozie工作流的作業(yè),Bundle管理協(xié)調(diào)器作業(yè)。Oozie支持的用戶作業(yè)類型有Javamap-reduce、Streamingmap-reduce、Pig、Hive、Sqoop和Distcp,及其Java程序和shell腳本或命令等特定的系統(tǒng)作業(yè)。
Oozie項(xiàng)目經(jīng)歷了三個(gè)主要階段。第一版Oozie是一個(gè)基于工作流引擎的服務(wù)器,通過(guò)執(zhí)行HadoopMapReduce和Pig作業(yè)的動(dòng)作運(yùn)行工作流作業(yè)。第二版Oozie是一個(gè)基于協(xié)調(diào)器引擎的服務(wù)器,按時(shí)間和數(shù)據(jù)觸發(fā)工作流執(zhí)行。它可以基于時(shí)間(如每小時(shí)執(zhí)行一次)或數(shù)據(jù)可用性(如等待輸入數(shù)據(jù)完成后再執(zhí)行)連續(xù)運(yùn)行工作流。第三版Oozie是一個(gè)基于Bundle引擎的服務(wù)器。它提供更高級(jí)別的抽象,批量處理一系列協(xié)調(diào)器應(yīng)用。用戶可以在bundle級(jí)別啟動(dòng)、停止、掛起、繼續(xù)、重做協(xié)調(diào)器作業(yè),這樣可以更好地簡(jiǎn)化操作控制。
使用Oozie主要基于以下兩點(diǎn)原因:
?在Hadoop中執(zhí)行的任務(wù)有時(shí)候需要把多個(gè)MapReduce作業(yè)連接到一起執(zhí)行,或者需要多個(gè)作業(yè)并行處理。Oozie可以把多個(gè)MapReduce作業(yè)組合到一個(gè)邏輯工作單元中,從而完成更大型的任務(wù)。
?從調(diào)度的角度看,如果使用crontab的方式調(diào)用多個(gè)工作流作業(yè),可能需要編寫大量的腳本,還要通過(guò)腳本來(lái)控制好各個(gè)工作流作業(yè)的執(zhí)行時(shí)序問(wèn)題,不但不好維護(hù),而且監(jiān)控也不方便;谶@樣的背景,Oozie提出了Coordinator的概念,它能夠?qū)⒚總(gè)工作流作業(yè)作為一個(gè)動(dòng)作來(lái)運(yùn)行,相當(dāng)于工作流定義中的一個(gè)執(zhí)行節(jié)點(diǎn),這樣就能夠?qū)⒍鄠(gè)工作流作業(yè)組成一個(gè)稱為CoordinatorJob的作業(yè),并指定觸發(fā)時(shí)間和頻率,還可以配置數(shù)據(jù)集、并發(fā)數(shù)等。
9.2.1Oozie的體系結(jié)構(gòu)
Oozie的體系結(jié)構(gòu)如圖9-1所示。
圖9-1Oozie體系結(jié)構(gòu)
Oozie是一種JavaWeb應(yīng)用程序,它運(yùn)行在JavaServlet容器,即Tomcat中,并使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)以下內(nèi)容:
?工作流定義。
?當(dāng)前運(yùn)行的工作流實(shí)例,包括實(shí)例的狀態(tài)和變量。
Oozie工作流是放置在DAG(有向無(wú)環(huán)圖DirectAcyclicGraph)中的一組動(dòng)作,例如,Hadoop的Map/Reduce作業(yè)、Pig作業(yè)等。DAG控制動(dòng)作的依賴關(guān)系,指定了動(dòng)作執(zhí)行的順序。Oozie使用hPDL這種XML流程定義語(yǔ)言來(lái)描述這個(gè)圖。
hPDL是一種很簡(jiǎn)潔的語(yǔ)言,它只會(huì)使用少數(shù)流程控制節(jié)點(diǎn)和動(dòng)作節(jié)點(diǎn)?刂乒(jié)點(diǎn)會(huì)定義執(zhí)行的流程,并包含工作流的起點(diǎn)和終點(diǎn)(start、end和fail節(jié)點(diǎn))以及控制工作流執(zhí)行路徑的機(jī)制(decision、fork和join節(jié)點(diǎn))。動(dòng)作節(jié)點(diǎn)是實(shí)際執(zhí)行操作的部分,通過(guò)它們工作流會(huì)觸發(fā)執(zhí)行計(jì)算或者處理任務(wù)。Oozie為以下類型的動(dòng)作提供支持:HadoopMapReduce、HadoopHDFS、Pig、Java和Oozie的子工作流。而SSH動(dòng)作已經(jīng)從Oozieschema0.2之后的版本中移除了。
所有由動(dòng)作節(jié)點(diǎn)觸發(fā)的計(jì)算和處理任務(wù)都不在Oozie中運(yùn)行。它們是由Hadoop的MapReduce框架執(zhí)行的。這種低耦合的設(shè)計(jì)方法讓Oozie可以有效利用Hadoop的負(fù)載平衡、災(zāi)難恢復(fù)等機(jī)制。這些任務(wù)主要是串行執(zhí)行的,只有文件系統(tǒng)動(dòng)作例外,它是并行處理的。這意味著對(duì)于大多數(shù)工作流動(dòng)作觸發(fā)的計(jì)算或處理任務(wù)類型來(lái)說(shuō),在工作流操作轉(zhuǎn)換到工作流的下一個(gè)節(jié)點(diǎn)之前都需要等待,直到前面節(jié)點(diǎn)的計(jì)算或處理任務(wù)結(jié)束了之后才能夠繼續(xù)。Oozie可以通過(guò)兩種不同的方式來(lái)檢測(cè)計(jì)算或處理任務(wù)是否完成,這就是回調(diào)和輪詢。當(dāng)Oozie啟動(dòng)了計(jì)算或處理任務(wù)時(shí),它會(huì)為任務(wù)提供唯一的回調(diào)URL,然后任務(wù)會(huì)在完成的時(shí)候發(fā)送通知給這個(gè)特定的URL。在任務(wù)無(wú)法觸發(fā)回調(diào)URL的情況下(可能是因?yàn)槿魏卧,比方說(shuō)網(wǎng)絡(luò)閃斷),或者當(dāng)任務(wù)的類型無(wú)法在完成時(shí)觸發(fā)回調(diào)URL的時(shí)候,Oozie有一種機(jī)制,可以對(duì)計(jì)算或處理任務(wù)進(jìn)行輪詢,從而能夠判斷任務(wù)是否完成。
Oozie工作流可以參數(shù)化,例如在工作流定義中使用像${inputDir}之類的變量等。在提交工作流操作的時(shí)候,我們必須提供參數(shù)值。如果經(jīng)過(guò)合適地參數(shù)化,比如使用不同的輸出目錄,那么多個(gè)同樣的工作流操作可以并發(fā)執(zhí)行。
一些工作流是根據(jù)需要觸發(fā)的,但是大多數(shù)情況下,我們有必要基于一定的時(shí)間段、數(shù)據(jù)可用性或外部事件來(lái)運(yùn)行它們。Oozie協(xié)調(diào)系統(tǒng)(Coordinatorsystem)讓用戶可以基于這些參數(shù)來(lái)定義工作流執(zhí)行計(jì)劃。Oozie協(xié)調(diào)程序讓我們可以用謂詞的方式對(duì)工作流執(zhí)行觸發(fā)器進(jìn)行建模,謂詞可以是時(shí)間條件、數(shù)據(jù)條件、內(nèi)部事件或外部事件。工作流作業(yè)會(huì)在謂詞得到滿足的時(shí)候啟動(dòng)。不難看出,這里的謂詞,其作用和SQL語(yǔ)句的WHERE子句中的謂詞類似,本質(zhì)上都是在滿足某些條件時(shí)觸發(fā)某種事件。
有時(shí),我們還需要連接定時(shí)運(yùn)行、但時(shí)間間隔不同的工作流操作。多個(gè)以不同頻率運(yùn)行的工作流的輸出會(huì)成為下一個(gè)工作流的輸入。把這些工作流連接在一起,會(huì)讓系統(tǒng)把它作為數(shù)據(jù)應(yīng)用的管道來(lái)引用。Oozie協(xié)調(diào)程序支持創(chuàng)建這樣的數(shù)據(jù)應(yīng)用管道。
9.2.2CDH5.7.0中的Oozie
CDH5.7.0中,Oozie的版本是4.1.0,其元數(shù)據(jù)存儲(chǔ)使用MySQL(4.4節(jié)CDH安裝中有相關(guān)配置)。關(guān)于CDH5.7.0中Oozie的屬性,參考以下鏈接:
https://www.cloudera.com/documentation/enterprise/latest/topics/cm_props_cdh570_oozie.html
9.3建立定期裝載工作流
對(duì)于剛接觸Oozie的用戶來(lái)說(shuō),前面介紹的概念過(guò)于抽象,不易理解,那么就讓我們一步步創(chuàng)建銷售訂單示例ETL的工作流,在實(shí)例中學(xué)習(xí)Oozie的特性和用法。
1.修改資源配置
Oozie運(yùn)行需要使用較高的內(nèi)存資源,因此要將以下兩個(gè)YARN參數(shù)的值調(diào)大:
?yarn.nodemanager.resource.memory-mb:NodeManage總的可用物理內(nèi)存。
?yarn.scheduler.maximum-allocation-mb:一個(gè)MapReduce任務(wù)可申請(qǐng)的最大內(nèi)存。
如果分配的內(nèi)存不足,在執(zhí)行工作流作業(yè)時(shí)會(huì)報(bào)類似下面的錯(cuò)誤:
org.apache.oozie.action.ActionExecutorException:JA009:org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException:Invalidresourcerequest,requestedmemory<0,orrequestedmemory>maxconfigured,requestedMemory=1536,maxMemory=1500
我們的實(shí)驗(yàn)環(huán)境中,每個(gè)Hadoop節(jié)點(diǎn)所在虛擬機(jī)的總物理內(nèi)存為8GB,所以把這兩個(gè)參數(shù)都設(shè)置為2GB。修改的方法有兩種,可以編輯yarn-site.xml文件里的屬性,如:
yarn.nodemanager.resource.memory-mb
2000
yarn.scheduler.maximum-allocation-mb
2000
或者在ClouderaManager中修改,yarn.nodemanager.resource.memory-mb參數(shù)在YARN服務(wù)的NodeManager范圍里,yarn.scheduler.maximum-allocation-mb參數(shù)在YARN服務(wù)的ResourceManager范圍里。無(wú)論使用哪種方法,修改后都需要保存更改并重啟Hadoop集群。
2.啟用OozieWebConsole
默認(rèn)安裝CDH時(shí),OozieWebConsole是禁用的,為了后面方便監(jiān)控Oozie作業(yè)的執(zhí)行,需要將其改為啟用狀態(tài)。“啟用Oozie服務(wù)器Web控制臺(tái)”屬性在Oozie服務(wù)的“OozieServerDefaultGroup”里。具體的做法是:
下載ext-2.2包,解壓縮到Oozie服務(wù)器實(shí)例所在節(jié)點(diǎn)的/var/lib/oozie/目錄下。
登錄ClouderaManager管理控制臺(tái),進(jìn)入Oozie服務(wù)頁(yè)面。
單擊“配置”標(biāo)簽。
定位“啟用Oozie服務(wù)器Web控制臺(tái)”屬性,或者在搜索框中輸入該屬性名查找。
選擇“啟用Oozie服務(wù)器Web控制臺(tái)”的復(fù)選框。
單擊“保存更改”按鈕提交所做的修改。
重啟Oozie服務(wù)。
3.啟動(dòng)Sqoop的sharemetastoreservice
……
你還可能感興趣
我要評(píng)論
|