關(guān)于我們
書單推薦
新書推薦
|
Hadoop構(gòu)建數(shù)據(jù)倉庫實(shí)踐
本書內(nèi)容包括數(shù)據(jù)倉庫、Hadoop及其生態(tài)圈的相關(guān)概念, 使用Sqoop從關(guān)系數(shù)據(jù)庫全量或增量抽取數(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ù)倉庫中的漸變維 (SCD)、代理鍵、角色扮演維度、層次維度、退化維度、無事實(shí)的事實(shí)表、遲到的事實(shí)、累積的度量等常見問題在Hadoop上的處理等。
王雪迎 ,畢業(yè)于中國地質(zhì)大學(xué)計算機(jī)專業(yè),高級工程師,擁有20年數(shù)據(jù)庫、數(shù)據(jù)倉庫相關(guān)技術(shù)經(jīng)驗(yàn)。曾先后供職于北京現(xiàn)代商業(yè)信息技術(shù)有限公司、北京在線九州信息技術(shù)服務(wù)有限公司、華北計算技術(shù)研究所、北京優(yōu)貝在線網(wǎng)絡(luò)科技有限公司,擔(dān)任DBA、數(shù)據(jù)架構(gòu)師等職位。
第1章 數(shù)據(jù)倉庫簡介
1.1 什么是數(shù)據(jù)倉庫 1
1.1.1 數(shù)據(jù)倉庫的定義 1
1.1.2 建立數(shù)據(jù)倉庫的原因 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)對比 9
1.3 數(shù)據(jù)倉庫架構(gòu) 10
1.3.1 基本架構(gòu) 10
1.3.2 主要數(shù)據(jù)倉庫架構(gòu) 12
1.3.3 操作數(shù)據(jù)存儲 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 開發(fā)ETL系統(tǒng)的方法 21
1.4.5 常見ETL工具 21
1.5 數(shù)據(jù)倉庫需求 22
1.5.1 基本需求 22
1.5.2 數(shù)據(jù)需求 23
1.6 小結(jié) 24
第2章 數(shù)據(jù)倉庫設(shè)計基礎(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ù)倉庫 33
2.2 維度數(shù)據(jù)模型 34
2.2.1 維度數(shù)據(jù)模型建模過程 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模型簡介 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ù)倉庫的區(qū)別 50
2.4.3 數(shù)據(jù)集市設(shè)計 50
2.5 數(shù)據(jù)倉庫實(shí)施步驟 51
2.6 小結(jié) 54
第3章 Hadoop生態(tài)圈與數(shù)據(jù)倉庫
3.1 大數(shù)據(jù)定義 55
3.2 Hadoop簡介 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ù)倉庫 81
3.5.1 關(guān)系數(shù)據(jù)庫的可擴(kuò)展性瓶頸 82
3.5.2 CAP理論 84
3.5.3 Hadoop數(shù)據(jù)倉庫工具 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語句 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ù)倉庫示例模型
6.1 業(yè)務(wù)場景 150
6.2 Hive相關(guān)配置 152
6.2.1 選擇文件格式 152
6.2.2 支持行級更新 159
6.2.3 Hive事務(wù)支持的限制 164
6.3 Hive表分類 164
6.4 向Hive表裝載數(shù)據(jù) 169
6.5 建立數(shù)據(jù)庫表 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簡介 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簡介 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章 定期自動執(zhí)行ETL作業(yè)
9.1 crontab 256
9.2 Oozie簡介 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è)定期自動執(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 無事實(shí)的事實(shí)表 349
11.5 遲到的事實(shí) 354
11.6 累積度量 360
11.7 小結(jié) 366
第12章 聯(lián)機(jī)分析處理
12.1 聯(lián)機(jī)分析處理簡介 367
12.1.1 概念 367
12.1.2 分類 368
12.1.3 性能 371
12.2 Impala簡介 371
12.3 Hive、SparkSQL、Impala比較 377
12.3.1 Spark SQL簡介 377
12.3.2 Hive、Spark SQL、Impala比較 379
12.3.3 Hive、Spark SQL、Impala性能對比 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ù)可視化簡介 408
13.2 Hue簡介 410
13.2.1 Hue功能快速預(yù)覽 411
13.2.2 配置元數(shù)據(jù)存儲 412
13.3 Zeppelin簡介 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章
?定期自動執(zhí)行ETL作業(yè)?
一旦數(shù)據(jù)倉庫開始使用,就需要不斷從源系統(tǒng)給數(shù)據(jù)倉庫提供新數(shù)據(jù)。為了確保數(shù)據(jù)流的穩(wěn)定,需要使用所在平臺上可用的任務(wù)調(diào)度器來調(diào)度ETL定期執(zhí)行。調(diào)度模塊是ETL系統(tǒng)必不可少的組成部分,它不但是數(shù)據(jù)倉庫的基本需求,也對項(xiàng)目的成功起著舉足輕重的作用。
操作系統(tǒng)一般都為用戶提供調(diào)度作業(yè)的功能,如Windows的“計劃任務(wù)”和UNIX/Linux的cron系統(tǒng)服務(wù)。絕大多數(shù)Hadoop系統(tǒng)都運(yùn)行在Linux之上,因此本章詳細(xì)討論兩種Linux上定時自動執(zhí)行ETL作業(yè)的方案。一種是經(jīng)典的crontab,這是操作系統(tǒng)自帶的功能,二是Hadoop生態(tài)圈中的Oozie組件。為了演示Hadoop對數(shù)據(jù)倉庫的支持能力,我們的示例將使用后者實(shí)現(xiàn)ETL執(zhí)行自動化。
9.1crontab
上一章我們已經(jīng)準(zhǔn)備好用于定期裝載的regular_etl.shshell腳本文件,可以很容易地用crontab命令創(chuàng)建一個任務(wù),定期運(yùn)行此腳本。
#修改文件屬性為可執(zhí)行
chmod755/root/regular_etl.sh
#編輯crontab文件內(nèi)容
crontab-e
#添加如下一行,指定每天2點(diǎn)執(zhí)行定期裝載作業(yè),然后保存退出
02***/root/regular_etl.sh
這就可以了,需要用戶做的就是如此簡單,其他的事情交給cron系統(tǒng)服務(wù)去完成。提供cron服務(wù)的進(jìn)程名為crond,這是Linux下一個用來周期性執(zhí)行某種任務(wù)或處理某些事件的守護(hù)進(jìn)程。當(dāng)安裝完操作系統(tǒng)后,會自動啟動crond進(jìn)程,它每分鐘會定期檢查是否有要執(zhí)行的任務(wù),如果有則自動執(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目錄下有一個crontab文件,這個就是系統(tǒng)任務(wù)調(diào)度的配置文件。
?用戶任務(wù)調(diào)度:用戶要定期執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時郵件提醒等。用戶可以使用crontab命令來定制自己的計劃任務(wù)。所有用戶定義的crontab文件都被保存在/var/spool/cron目錄中,其文件名與用戶名一致。
1.crontab權(quán)限
Linux系統(tǒng)使用一對allow/deny文件組合判斷用戶是否具有執(zhí)行crontab的權(quán)限。如果用戶名出現(xiàn)在/etc/cron.allow文件中,則該用戶允許執(zhí)行crontab命令。如果此文件不存在,那么如果用戶名沒有出現(xiàn)在/etc/cron.deny文件中,則該用戶允許執(zhí)行crontab命令。如果只存在cron.deny文件,并且該文件是空的,則所有用戶都可以使用crontab命令。如果這兩個文件都不存在,那么只有root用戶可以執(zhí)行crontab命令。allow/deny文件由每行一個用戶名構(gòu)成。
2.crontab命令
通過crontab命令,我們可以在固定間隔的時間點(diǎn)執(zhí)行指定的系統(tǒng)指令或shell腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。crontab命令格式如下:
crontab[-uuser]file
crontab[-uuser][-e|-l|-r]
說明:
?-uuser:用來設(shè)定某個用戶的crontab服務(wù),此參數(shù)一般由root用戶使用。
?file:file是命令文件的名字,表示將file作為crontab的任務(wù)列表文件并載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標(biāo)準(zhǔn)輸入,通常是鍵盤上鍵入的命令,并將它們載入crontab。
?-e:編輯某個用戶的crontab文件內(nèi)容。如果不指定用戶,則表示編輯當(dāng)前用戶的crontab文件。如果文件不存在,則創(chuàng)建一個。
?-l:顯示某個用戶的crontab文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的crontab文件內(nèi)容。
?-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的crontab文件。
注意:如果不經(jīng)意地輸入了不帶任何參數(shù)的crontab命令,不要使用Control-d退出,因?yàn)檫@會刪除用戶所對應(yīng)的crontab文件中的所有條目。代替的方法是用Control-c退出。
3.crontab文件
用戶所建立的crontab文件中,每一行都代表一項(xiàng)任務(wù),每行的每個字段代表一項(xiàng)設(shè)置。它的格式共分為六個字段,前五段是時間設(shè)定段,第六段是要執(zhí)行的命令段,格式如下:
.----------------分鐘(0-59)
|.-------------小時(0-23)
||.----------日期(1-31)
|||.-------月份(1-12)
||||.----星期(0-6,代表周日到周一)
|||||
*****要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。
在以上各個時間字段中,還可以使用如下特殊字符:
?星號(*):代表所有可能的值,例如“月份”字段如果是星號,則表示在滿足其他字段的制約條件后每月都執(zhí)行該命令操作。
?逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”。
?中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”。
?正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在“分鐘”字段,表示每十分鐘執(zhí)行一次。
注意,“日期”和“星期”字段都可以指定哪天執(zhí)行,如果兩個字段都設(shè)置了,則執(zhí)行的日期是兩個字段的并集。
4.crontab示例
#每1分鐘執(zhí)行一次command
*****command
#每小時的第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
#每個星期一的上午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
#每一小時執(zhí)行一次
**/1***command
#晚上11點(diǎn)到早上7點(diǎn)之間,每隔一小時執(zhí)行一次
*23-7/1***command
#每月的4號與每周一到周三的11點(diǎn)執(zhí)行
0114*1-3command
#一月一號的4點(diǎn)執(zhí)行
0411*command
#每小時執(zhí)行/etc/cron.hourly目錄內(nèi)的腳本
01****rootrun-parts/etc/cron.hourly
說明:run-parts會遍歷目標(biāo)文件夾,執(zhí)行第一層目錄下具有可執(zhí)行權(quán)限的文件。
5.crontab環(huán)境
有時我們創(chuàng)建了一個crontab任務(wù),但是這個任務(wù)卻無法自動執(zhí)行,而手動執(zhí)行腳本卻沒有問題,這種情況一般是由于在crontab文件中沒有配置環(huán)境變量引起的。cron從用戶所在的主目錄中使用shell調(diào)用需要執(zhí)行的命令。cron為每個shell提供了一個默認(rèn)的環(huán)境,Linux下的定義如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=用戶名
HOME=用戶主目錄
在crontab文件中定義多個調(diào)度任務(wù)時,需要特別注意的一個問題就是環(huán)境變量的設(shè)置,因?yàn)槲覀兪謩訄?zhí)行某個腳本時,是在當(dāng)前shell環(huán)境下進(jìn)行的,程序能找到環(huán)境變量;而系統(tǒng)自動執(zhí)行任務(wù)調(diào)度時,除了默認(rèn)的環(huán)境,是不會加載任何其他環(huán)境變量的。因此就需要在crontab文件中指定任務(wù)運(yùn)行所需的所有環(huán)境變量。
不要假定cron知道所需要的特殊環(huán)境,它其實(shí)并不知道。所以用戶要保證在shell腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動設(shè)置的全局變量。以下三點(diǎn)需要注意:
?腳本中涉及文件路徑時寫絕對路徑;
?腳本執(zhí)行要用到環(huán)境變量時,通過source命令顯式引入,例如:
#!/bin/sh
source/etc/profile
?當(dāng)手動執(zhí)行腳本沒問題,但是crontab不執(zhí)行時,可以嘗試在crontab中直接引入環(huán)境變量解決問題,例如:
0****./etc/profile;/bin/sh/path/to/myscript.sh
6.重定向輸出郵件
默認(rèn)時,每條任務(wù)調(diào)度執(zhí)行完畢,系統(tǒng)都會將任務(wù)輸出信息通過電子郵件的形式發(fā)送給當(dāng)前系統(tǒng)用戶。這樣日積月累,日志信息會非常大,可能會影響系統(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)錯誤重定向到標(biāo)準(zhǔn)輸出。由于標(biāo)準(zhǔn)輸出已經(jīng)重定向到了/dev/null,因此標(biāo)準(zhǔn)錯誤也會重定向到/dev/null,這樣日志輸出問題就解決了。
7.生成日志文件
可以將crontab執(zhí)行任務(wù)的輸出信息重定向到一個自定義的日志文件中,例如:
8***rm/home/someuser/tmp/*>/home/someuser/cronlogs/clean_tmp_dir.log
9.2Oozie簡介
除了利用操作系統(tǒng)提供的功能以外,Hadoop生態(tài)圈的工具也可以完成同樣的調(diào)度任務(wù),而且更靈活,這個組件就是Oozie。
Oozie是一個管理Hadoop作業(yè)、可伸縮、可擴(kuò)展、可靠的工作流調(diào)度系統(tǒng),它內(nèi)部定義了三種作業(yè):工作流作業(yè)、協(xié)調(diào)器作業(yè)和Bundle作業(yè)。工作流作業(yè)是由一系列動作構(gòu)成的有向無環(huán)圖(DAGs),協(xié)調(diào)器作業(yè)是按時間頻率周期性觸發(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)歷了三個主要階段。第一版Oozie是一個基于工作流引擎的服務(wù)器,通過執(zhí)行HadoopMapReduce和Pig作業(yè)的動作運(yùn)行工作流作業(yè)。第二版Oozie是一個基于協(xié)調(diào)器引擎的服務(wù)器,按時間和數(shù)據(jù)觸發(fā)工作流執(zhí)行。它可以基于時間(如每小時執(zhí)行一次)或數(shù)據(jù)可用性(如等待輸入數(shù)據(jù)完成后再執(zhí)行)連續(xù)運(yùn)行工作流。第三版Oozie是一個基于Bundle引擎的服務(wù)器。它提供更高級別的抽象,批量處理一系列協(xié)調(diào)器應(yīng)用。用戶可以在bundle級別啟動、停止、掛起、繼續(xù)、重做協(xié)調(diào)器作業(yè),這樣可以更好地簡化操作控制。
使用Oozie主要基于以下兩點(diǎn)原因:
?在Hadoop中執(zhí)行的任務(wù)有時候需要把多個MapReduce作業(yè)連接到一起執(zhí)行,或者需要多個作業(yè)并行處理。Oozie可以把多個MapReduce作業(yè)組合到一個邏輯工作單元中,從而完成更大型的任務(wù)。
?從調(diào)度的角度看,如果使用crontab的方式調(diào)用多個工作流作業(yè),可能需要編寫大量的腳本,還要通過腳本來控制好各個工作流作業(yè)的執(zhí)行時序問題,不但不好維護(hù),而且監(jiān)控也不方便;谶@樣的背景,Oozie提出了Coordinator的概念,它能夠?qū)⒚總工作流作業(yè)作為一個動作來運(yùn)行,相當(dāng)于工作流定義中的一個執(zhí)行節(jié)點(diǎn),這樣就能夠?qū)⒍鄠工作流作業(yè)組成一個稱為CoordinatorJob的作業(yè),并指定觸發(fā)時間和頻率,還可以配置數(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ù)庫來存儲以下內(nèi)容:
?工作流定義。
?當(dāng)前運(yùn)行的工作流實(shí)例,包括實(shí)例的狀態(tài)和變量。
Oozie工作流是放置在DAG(有向無環(huán)圖DirectAcyclicGraph)中的一組動作,例如,Hadoop的Map/Reduce作業(yè)、Pig作業(yè)等。DAG控制動作的依賴關(guān)系,指定了動作執(zhí)行的順序。Oozie使用hPDL這種XML流程定義語言來描述這個圖。
hPDL是一種很簡潔的語言,它只會使用少數(shù)流程控制節(jié)點(diǎn)和動作節(jié)點(diǎn)?刂乒(jié)點(diǎn)會定義執(zhí)行的流程,并包含工作流的起點(diǎn)和終點(diǎn)(start、end和fail節(jié)點(diǎn))以及控制工作流執(zhí)行路徑的機(jī)制(decision、fork和join節(jié)點(diǎn))。動作節(jié)點(diǎn)是實(shí)際執(zhí)行操作的部分,通過它們工作流會觸發(fā)執(zhí)行計算或者處理任務(wù)。Oozie為以下類型的動作提供支持:HadoopMapReduce、HadoopHDFS、Pig、Java和Oozie的子工作流。而SSH動作已經(jīng)從Oozieschema0.2之后的版本中移除了。
所有由動作節(jié)點(diǎn)觸發(fā)的計算和處理任務(wù)都不在Oozie中運(yùn)行。它們是由Hadoop的MapReduce框架執(zhí)行的。這種低耦合的設(shè)計方法讓Oozie可以有效利用Hadoop的負(fù)載平衡、災(zāi)難恢復(fù)等機(jī)制。這些任務(wù)主要是串行執(zhí)行的,只有文件系統(tǒng)動作例外,它是并行處理的。這意味著對于大多數(shù)工作流動作觸發(fā)的計算或處理任務(wù)類型來說,在工作流操作轉(zhuǎn)換到工作流的下一個節(jié)點(diǎn)之前都需要等待,直到前面節(jié)點(diǎn)的計算或處理任務(wù)結(jié)束了之后才能夠繼續(xù)。Oozie可以通過兩種不同的方式來檢測計算或處理任務(wù)是否完成,這就是回調(diào)和輪詢。當(dāng)Oozie啟動了計算或處理任務(wù)時,它會為任務(wù)提供唯一的回調(diào)URL,然后任務(wù)會在完成的時候發(fā)送通知給這個特定的URL。在任務(wù)無法觸發(fā)回調(diào)URL的情況下(可能是因?yàn)槿魏卧,比方說網(wǎng)絡(luò)閃斷),或者當(dāng)任務(wù)的類型無法在完成時觸發(fā)回調(diào)URL的時候,Oozie有一種機(jī)制,可以對計算或處理任務(wù)進(jìn)行輪詢,從而能夠判斷任務(wù)是否完成。
Oozie工作流可以參數(shù)化,例如在工作流定義中使用像${inputDir}之類的變量等。在提交工作流操作的時候,我們必須提供參數(shù)值。如果經(jīng)過合適地參數(shù)化,比如使用不同的輸出目錄,那么多個同樣的工作流操作可以并發(fā)執(zhí)行。
一些工作流是根據(jù)需要觸發(fā)的,但是大多數(shù)情況下,我們有必要基于一定的時間段、數(shù)據(jù)可用性或外部事件來運(yùn)行它們。Oozie協(xié)調(diào)系統(tǒng)(Coordinatorsystem)讓用戶可以基于這些參數(shù)來定義工作流執(zhí)行計劃。Oozie協(xié)調(diào)程序讓我們可以用謂詞的方式對工作流執(zhí)行觸發(fā)器進(jìn)行建模,謂詞可以是時間條件、數(shù)據(jù)條件、內(nèi)部事件或外部事件。工作流作業(yè)會在謂詞得到滿足的時候啟動。不難看出,這里的謂詞,其作用和SQL語句的WHERE子句中的謂詞類似,本質(zhì)上都是在滿足某些條件時觸發(fā)某種事件。
有時,我們還需要連接定時運(yùn)行、但時間間隔不同的工作流操作。多個以不同頻率運(yùn)行的工作流的輸出會成為下一個工作流的輸入。把這些工作流連接在一起,會讓系統(tǒng)把它作為數(shù)據(jù)應(yīng)用的管道來引用。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ù)存儲使用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建立定期裝載工作流
對于剛接觸Oozie的用戶來說,前面介紹的概念過于抽象,不易理解,那么就讓我們一步步創(chuàng)建銷售訂單示例ETL的工作流,在實(shí)例中學(xué)習(xí)Oozie的特性和用法。
1.修改資源配置
Oozie運(yùn)行需要使用較高的內(nèi)存資源,因此要將以下兩個YARN參數(shù)的值調(diào)大:
?yarn.nodemanager.resource.memory-mb:NodeManage總的可用物理內(nèi)存。
?yarn.scheduler.maximum-allocation-mb:一個MapReduce任務(wù)可申請的最大內(nèi)存。
如果分配的內(nèi)存不足,在執(zhí)行工作流作業(yè)時會報類似下面的錯誤:
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)境中,每個Hadoop節(jié)點(diǎn)所在虛擬機(jī)的總物理內(nèi)存為8GB,所以把這兩個參數(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范圍里。無論使用哪種方法,修改后都需要保存更改并重啟Hadoop集群。
2.啟用OozieWebConsole
默認(rèn)安裝CDH時,OozieWebConsole是禁用的,為了后面方便監(jiān)控Oozie作業(yè)的執(zhí)行,需要將其改為啟用狀態(tài)!皢⒂肙ozie服務(wù)器Web控制臺”屬性在Oozie服務(wù)的“OozieServerDefaultGroup”里。具體的做法是:
下載ext-2.2包,解壓縮到Oozie服務(wù)器實(shí)例所在節(jié)點(diǎn)的/var/lib/oozie/目錄下。
登錄ClouderaManager管理控制臺,進(jìn)入Oozie服務(wù)頁面。
單擊“配置”標(biāo)簽。
定位“啟用Oozie服務(wù)器Web控制臺”屬性,或者在搜索框中輸入該屬性名查找。
選擇“啟用Oozie服務(wù)器Web控制臺”的復(fù)選框。
單擊“保存更改”按鈕提交所做的修改。
重啟Oozie服務(wù)。
3.啟動Sqoop的sharemetastoreservice
……
你還可能感興趣
我要評論
|