大資料迅速發展,但是Hadoop的基礎地位一直沒有改變。了解并掌握Hadoop相關知識對于之後的相關元件學習有着地基的作用。本文整理了Hadoop基礎理論知識與常用元件介紹,雖然有一些元件已經不太常用。但是了解第一批元件的相關知識對于以後的學習很有幫助,未來的很多元件也借鑒了之前的設計理念。
文章較長,建議收藏後閱讀。
相關學習資料可以通過下面的方式下載下傳,本文隻是整理了大資料Hadoop基本知識,有精力的同學可以通過相關書籍進行更深入的學習。
本文通過以下章節由淺入深學習,建議閱讀前有一定的Linux基礎和Java基礎,并搭建好大資料環境。相關知識可以在大資料流動中擷取。
一個最簡單的大資料系統就是通過,zookeeper進行協調服務,并通過任務排程對hive或者mr進行計算任務執行,通過資料傳輸與外部系統建立聯系。當然架構在不變化,最新的大資料架構遠不止于此。但這些基本的元件對于了解大資料的原理非常的有幫助。
這些元件互相配合,最終形成了Hadoop的生态體系。
正文開始~
資訊時代資料量的爆炸性增長,讓大資料的發展異常迅速。簡單來說大資料是:
1、有海量的資料
2、有對海量資料進行挖掘的需求
3、有對海量資料進行挖掘的軟體工具(hadoop、spark、flink......)
HADOOP最早起源于Nutch項目。Nutch的設計目标是建構一個大型的全網搜尋引擎,包括網頁抓取、索引、查詢等功能,但随着抓取網頁數量的增加,遇到了嚴重的可擴充性問題——如何解決數十億網頁的存儲和索引問題。
2003年、2004年谷歌發表的兩篇論文為該問題提供了可行的解決方案。
——分布式檔案系統(GFS),可用于處理海量網頁的存儲。
——分布式計算架構MAPREDUCE,可用于處理海量網頁的索引計算問題。
Nutch的開發人員完成了相應的開源實作HDFS和MAPREDUCE,并從Nutch中剝離成為獨立項目HADOOP,到2008年1月,HADOOP成為Apache頂級項目,迎來了它的快速發展期。
在大資料的發展中,元件化一直都是一個非常大的趨勢。屏蔽複雜的底層研發,隻關注資料工程與資料分析本身,讓大資料得以迅速地發展。而開源的技術發展更是讓大資料的發展得到了長足的進步,大量的公司及個人貢獻了很多的開源方案。這也讓資料采集,清洗,分析,應用都變得輕而易舉。
Hadoop,Hive,Spark,Flink等等開源架構不斷的發展出現。
這些元件互相配合,共同建構起了大資料的平台體系。是以學習好大資料的相關元件知識就非常的重要,也是做好大資料應用的基礎。
大資料的技術與應用的發展同步進行,催生着架構的不斷演變。
從離線到實時,從資料倉庫到資料湖,從大資料平台到資料中台。有人會說大資料有點誇大,大屏泛濫沒有實際應用。但是事物的發展正是經過了從概念到實踐到落地的過程。不得不承認,大資料的架構在不斷的向更好的方向演變。
大資料的應用範圍在逐漸的擴大,使用者畫像,推薦系統等等領域都是大資料在支撐。而資料治理的發展讓資料安全,資料品質也得到了重視。
未來的大資料,将是大資料+資料分析+人工智能的結合體,架構和技術都将不斷的演進,越來越影響并改變我們的生活。
大資料的發展讓大資料相關崗位的需求猛增,大資料工程師,架構師,資料分析師,大資料運維等等都是非常不錯的職業選擇。不過要提醒的是大資料的技術發展迅速,要保持學習,不斷的擷取新的知識。
在學習hadoop元件之前,要先了解下zookeeper。zookeeper是一個分布式協調服務;就是為使用者的分布式應用程式提供協調服務。
簡單的說zk解決了分布式系統的一緻性問題,可以将需要一緻性的資料放在zk中,同時zk也提供了監聽等機制。zk為hadoop分布式的實作提供了保證,是以大家之後不用糾結hadoop很多的操作是如何實作的,很多都依賴了zk。
1、Zookeeper是為别的分布式程式服務的
2、Zookeeper本身就是一個分布式程式(隻要有半數以上節點存活,zk就能正常服務)
3、Zookeeper所提供的服務涵蓋:主從協調、伺服器節點動态上下線、統一配置管理、分布式共享鎖、統一名稱服務……
4、雖然說可以提供各種服務,但是zookeeper在底層其實隻提供了兩個功能:
a、管理(存儲,讀取)使用者程式送出的資料;
b、并為使用者程式提供資料節點監聽服務;
不僅是大資料領域,在很多分布式系統中,zk都有着非常大的應用。
1、Zookeeper:一個leader,多個follower組成的叢集
2、全局資料一緻:每個server儲存一份相同的資料副本,client無論連接配接到哪個server,資料都是一緻的
3、分布式讀寫,更新請求轉發,由leader實施
4、更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
5、資料更新原子性,一次資料更新要麼成功(半數以上節點成功),要麼失敗
6、實時性,在一定時間範圍内,client能讀到最新資料
1、階層化的目錄結構,命名符合正常檔案系統規範(見下圖)
2、每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑辨別
3、節點Znode可以包含資料(隻能存儲很小量的資料,<1M;最好是1k位元組以内)和子節點
4、用戶端應用可以在節點上設定螢幕
(1)Zookeeper叢集中隻有超過半數以上的伺服器啟動,叢集才能正常工作;
(2)在叢集正常工作之前,myid小的伺服器給myid大的伺服器投票,直到叢集正常工作,選出Leader;
(3)選出Leader之後,之前的伺服器狀态由Looking改變為Following,以後的伺服器都是Follower。
運作 zkCli.sh –server 進入指令行工具
檢視znode路徑 ls /aaa
擷取znode資料 get /aaa
org.apache.zookeeper.Zookeeper是用戶端入口主類,負責建立與server的會話
它提供以下幾類主要方法 :
功能
描述
create
在本地目錄樹中建立一個節點
delete
删除一個節點
exists
測試本地是否存在目标節點
get/set data
從目标節點上讀取 / 寫資料
get/set ACL
擷取 / 設定目标節點通路控制清單資訊
get children
檢索一個子節點上的清單
sync
等待要被傳送的資料
分而治之:将大檔案、大批量檔案,分布式存放在大量伺服器上,以便于采取分而治之的方式對海量資料進行運算分析;
HDFS是一個檔案系統,用于存儲檔案,通過統一的命名空間——目錄樹來定位檔案;
HDFS是分布式的,由很多伺服器聯合起來實作其功能,叢集中的伺服器有各自的角色;
重要特性:
HDFS中的檔案在實體上是分塊存儲(block),塊的大小可以配置;
HDFS檔案系統會給用戶端提供一個統一的抽象目錄樹,用戶端通過路徑來通路檔案,形如:hdfs://namenode:port/dir/file;
目錄結構及檔案分塊位置資訊(中繼資料)的管理由namenode節點承擔——namenode是HDFS叢集主節點,負責維護整個hdfs檔案系統的目錄樹,以及每一個路徑(檔案)所對應的block塊資訊;
檔案的各個block的存儲管理由datanode節點承擔——datanode是HDFS叢集從節點,每一個block都可以在多個datanode上存儲多個副本;
HDFS是設計成适應一次寫入,多次讀出的場景,且不支援檔案的修改(适合用來做資料分析,并不适合用來做網盤應用,因為,不便修改,延遲大,網絡開銷大,成本太高)
不同的hadoop版本,hdfs操作指令不同。下面是hadoop3的操作指令,如果是其他版本要查詢對應的操作指令,可以使用-help 來檢視幫助。
1、查詢指令
hdfs dfs -ls / 查詢/目錄下的所有檔案和檔案夾
hdfs dfs -ls -R 以遞歸的方式查詢/目錄下的所有檔案
2、建立檔案夾
hdfs dfs -mkdir /test 建立test檔案夾
3、建立新的空檔案
hdfs dfs -touchz /aa.txt 在/目錄下建立一個空檔案aa.txt
4、增加檔案
hdfs dfs -put aa.txt /test 将目前目錄下的aa.txt檔案複制到/test目錄下(把-put換成-copyFromLocal效果一樣-moveFromLocal會移除本地檔案)
5、檢視檔案内容
hdfs dfs -cat /test/aa.txt 檢視/test目錄下檔案aa.txt的内容(将-cat 換成-text效果一樣)
6、複制檔案
hdfs dfs -copyToLocal /test/aa.txt . 将/test/aa.txt檔案複制到目前目錄(.是指目前目錄,也可指定其他的目錄)
7、删除檔案或檔案夾
hdfs dfs -rm -r /test/aa.txt 删除/test/aa.txt檔案(/test/aa.txt可以替換成檔案夾就是删除檔案夾)
8、重命名檔案
hdfs dfs -mv /aa.txt /bb.txt 将/aa.txt檔案重命名為/bb.txt
9、将源目錄中的所有檔案排序合并到一個本地檔案
hdfs dfs -getmerge / local-file 将/目錄下的所有檔案合并到本地檔案local-file中
可以通路web端對檔案操作有一個直覺的認識。通路NameNode Web UI進行檢視。
我們可以了解為我們通過指令對檔案及檔案夾進行了操作,但這都是hdfs給我們提供的服務,而hdfs底層會将我們的檔案分布式存儲。
可以通過hdfs的工作機制來了解一下原理。來了解一下hdfs是如何通過指令完成檔案存取工作的。
HDFS叢集分為兩大角色:NameNode、DataNode (Secondary Namenode)
NameNode負責管理整個檔案系統的中繼資料
DataNode 負責管理使用者的檔案資料塊
檔案會按照固定的大小(blocksize)切成若幹塊後分布式存儲在若幹台datanode上
每一個檔案塊可以有多個副本,并存放在不同的datanode上
Datanode會定期向Namenode彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量
HDFS的内部工作機制對用戶端保持透明,用戶端請求通路HDFS都是通過向namenode申請來進行
寫資料
用戶端要向HDFS寫資料,首先要跟namenode通信以确認可以寫檔案并獲得接收檔案block的datanode,然後,用戶端按順序将檔案逐個block傳遞給相應datanode,并由接收到block的datanode負責向其他datanode複制block的副本。
讀資料
用戶端将要讀取的檔案路徑發送給namenode,namenode擷取檔案的元資訊(主要是block的存放位置資訊)傳回給用戶端,用戶端根據傳回的資訊找到相應datanode逐個擷取檔案的block并在用戶端本地進行資料追加合并進而獲得整個檔案。
我們要了解的是namenode的工作機制尤其是中繼資料管理機制,這對于以後做資料治理也非常的有幫助。
Namenode的工作機制
1、namenode職責:負責用戶端請求的響應,中繼資料的管理(查詢,修改)。
2、namenode對資料的管理采用了三種存儲形式:
記憶體中繼資料(NameSystem)
磁盤中繼資料鏡像檔案
資料記錄檔檔案(可通過日志運算出中繼資料)
3、中繼資料存儲方式:
記憶體中有一份完整的中繼資料(記憶體meta data)
磁盤有一個“準完整”的中繼資料鏡像(fsimage)檔案(在namenode的工作目錄中)
用于銜接記憶體metadata和持久化中繼資料鏡像fsimage之間的記錄檔(edits檔案)
4、checkpoint:每隔一段時間,會由secondary namenode将namenode上積累的所有edits和一個最新的fsimage下載下傳到本地,并加載到記憶體進行merge(這個過程稱為checkpoint)
Datanode工作機制
1、Datanode工作職責:
存儲管理使用者的檔案塊資料
定期向namenode彙報自身所持有的block資訊(通過心跳資訊上報)
2、Datanode掉線判斷
datanode程序死亡或者網絡故障造成datanode無法與namenode通信,namenode不會立即把該節點判定為死亡,要經過一段時間。
hdfs提供了對外的api,可以進行用戶端的操作。我們隻需要引入相關依賴就可以進行操作了。
這裡是java示例,也有其他語言的操作。這種基本的操作後期的新元件也都有替代的方案,這裡主要是熟悉為主。
如果是windows下研發,要指定hadoop安裝包位置,才能引入相關包操作,安裝包可以去資料中檢視。
示例代碼如下:
Mapreduce是一個分布式運算程式的程式設計架構。大概的意思可以了解為對于hdfs中的分布式資料,可以通過Mapreduce這種分布式的架構方式來進行複雜的運算。試想一下,如果手寫分布式運算,要進行任務配置設定,分批執行,再彙總。這是非常複雜的工程,分布式運算架構的作用就是簡化這個過程。
Mapreduce是偏底層的技術,後期的Hive架構将sql語句轉化成Mapreduce語句進行執行,來簡化操作。後期的spark,flink也都是支援sql語句的。不過這種分布式預算的思想還是非常的重要,也影響了後來很多架構的運算原理。實際工作中不會遇到,但是要對原理有一個了解。
一個完整的mapreduce程式在分布式運作時有三類執行個體程序:
1、MRAppMaster:負責整個程式的過程排程及狀态協調
2、mapTask:負責map階段的整個資料處理流程
3、ReduceTask:負責reduce階段的整個資料處理流程
執行流程
1、 一個mr程式啟動的時候,最先啟動的是MRAppMaster,MRAppMaster啟動後根據本次job的描述資訊,計算出需要的maptask執行個體數量,然後向叢集申請機器啟動相應數量的maptask程序
2、 maptask程序啟動之後,根據給定的資料切片(哪個檔案的哪個偏移量範圍)範圍進行資料處理,主體流程為:
a) 利用客戶指定的inputformat來擷取RecordReader讀取資料,形成輸入KV對
b) 将輸入KV對傳遞給客戶定義的map()方法,做邏輯運算,并将map()方法輸出的KV對收集到緩存
c) 将緩存中的KV對按照K分區排序後不斷溢寫到磁盤檔案
3、 MRAppMaster監控到所有maptask程序任務完成之後(真實情況是,某些maptask程序處理完成後,就會開始啟動reducetask去已完成的maptask處fetch資料),會根據客戶指定的參數啟動相應數量的reducetask程序,并告知reducetask程序要處理的資料範圍(資料分區)
4、Reducetask程序啟動之後,根據MRAppMaster告知的待處理資料所在位置,從若幹台maptask運作所在機器上擷取到若幹個maptask輸出結果檔案,并在本地進行重新歸并排序,然後按照相同key的KV為一個組,調用客戶定義的reduce()方法進行邏輯運算,并收集運算輸出的結果KV,然後調用客戶指定的outputformat将結果資料輸出到外部存儲。
mapreduce的shuffle機制
mapreduce中,map階段處理的資料如何傳遞給reduce階段,是mapreduce架構中最關鍵的一個流程,這個流程就叫shuffle;
具體來說:就是将maptask輸出的處理結果資料,分發給reducetask,并在分發的過程中,對資料按key進行了分區和排序;
Shuffle中的緩沖區大小會影響到mapreduce程式的執行效率,原則上說,緩沖區越大,磁盤io的次數越少,執行速度就越快。
随後将mr的程式開發好,并運作即可,這就涉及到一個問題。如何運作。
在hadoop最開始的版本中,mapreduce的程式要想運作必須自己進行排程,調配資源。這就導緻管理越老越混亂,Yarn就出現了。
Apache Hadoop YARN:Yet Another Resource Negotiator,另一種資源協調者。
Yarn是一個資源排程平台,負責為運算程式提供伺服器運算資源,相當于一個分布式的作業系統平台,而mapreduce等運算程式則相當于運作于作業系統之上的應用程式。随着hadoop的發展,yarn一直是最核心的資源排程中心,未來我們寫的spark,flink程式都可以通過Yarn來進行排程。
YARN的重要概念
1、 yarn并不清楚使用者送出的程式的運作機制
2、 yarn隻提供運算資源的排程(使用者程式向yarn申請資源,yarn就負責配置設定資源)
3、 yarn中的主管角色叫ResourceManager
4、 yarn中具體提供運算資源的角色叫NodeManager
5、 這樣一來,yarn其實就與運作的使用者程式完全解耦,就意味着yarn上可以運作各種類型的分布式運算程式(mapreduce隻是其中的一種),比如mapreduce、spark,flink……
6、 是以,spark等運算架構都可以整合在yarn上運作,隻要他們各自的架構中有符合yarn規範的資源請求機制即可
Yarn就成為一個通用的資源排程平台,從此,企業中以前存在的各種運算叢集都可以整合在一個實體叢集上,提高資源使用率,友善資料共享。
ResourceManager是YARN中的主節點服務,它負責叢集中所有資源的統一管理和作業排程。
簡單來講,ResourceManager主要完成的功能包括:
與用戶端互動,處理來自用戶端的請求;
啟動和管理ApplicationMaster,并在它運作失敗時重新啟動它;
管理NodeManager,接收來自NodeManager的資源彙報資訊,并向NodeManager下達管理指令(比如殺死container等);
資源管理與排程,接收來自ApplicationMaster的資源申請請求,并為之配置設定資源。
NodeManager是YARN叢集中的每個具體節點的資源和任務管理者。NodeManager的主要功能包括:
定時向ResourceManager彙報本節點上的資源使用情況和各個Container的運作狀态;
接收并處理ApplicationMaster對container的啟動、停止等各種請求;
管理Container的生命周期,監控Container的資源使用;
管理任務日志和不同應用程式用到的附屬服務(auxiliary service)。
使用者送出的每個應用程式均包含一個ApplicationMaster,主要功能包括:
與ResourceManager排程器協商以擷取資源;
将得到的資源進一步配置設定給内部的任務;
與NodeManager通信以啟動或停止任務;
監控所有任務的運作狀态,并在任務運作失敗時負責進行容錯處理。
Container是YARN中的資源抽象,它封裝了某個節點上的多個次元的資源,如CPU、記憶體、磁盤、網絡等。當ApplicationMaster向ResourceManager申請資源時,ResourceManager為ApplicationMaster 傳回的資源是用Container表示的。
當使用者向YARN中送出一個應用程式後,YARN将分兩個階段運作該應用程式:
第一階段:啟動ApplicationMaster;
第二階段:由ApplicationMaster建立應用程式;為它申請資源,并監控它的整個運作過程,直到運作完成。
第1步:
client 讀取作業配置資訊并建立Job的環境,調用job.waitForCompletion 方法,向叢集送出一個MapReduce 作業 。
第2步:
資料總管給任務配置設定一個新的作業ID 。
第3步:
作業的client核實作業的輸出路徑,計算輸入檔案的分片,将作業的資源 (包括:Jar包、配置檔案,split資訊等) 拷貝到HDFS叢集上的作業送出目錄。
第4步:
通過調用資料總管的submitApplication()來送出作業。
第5步:
當資料總管收到submitApplciation()的請求時,就将該請求發給排程器 (scheduler),排程器向NodeManager發送一個啟動container的請求。
第6步:
節點管理器NodeManager啟動container,内部運作着一個主類為 MRAppMaster的Java應用。其通過創造一些對象來監控作業的進度,得到各個task的進度和完成報告 。
第7步:
然後其通過分布式檔案系統HDFS來擷取由用戶端提前計算好的輸入split,然後為每個輸入split建立一個map任務,根據mapreduce.job.reduces建立 reduce任務對象。
第8步:
如果不是小作業,那應用管理器向資料總管請求container來運作所有的map和reduce任務 。
這些請求是通過心跳來傳輸的,包括每個map任務的資料位置。比如:存放輸入split的主機名和機架(rack),排程器利用這些資訊來排程任務,盡量将任務配置設定給存儲資料的節點或相同機架的節點。
第9步:
當一個任務由資料總管的排程器配置設定給一個container後,AppMaster通過聯系NodeManager來啟動container。
第10步:
任務由一個主類為YarnChild的Java應用執行,在運作任務之前首先本地化任務需要的資源。比如:作業配置、JAR檔案以及分布式緩存的所有依賴檔案 。
第11步:
最後,啟動并運作map或reduce任務 。
同理在向yarn送出spark程式時也會按這種方式進行。這就讓資源的排程與程式本身分離。
Hive是基于Hadoop的一個資料倉庫工具(離線),可以将結構化的資料檔案映射為一張資料庫表,并提供類SQL查詢功能。
Hive解決了MapReduce的複雜研發問題,采用類SQL文法學習成本低。
Hive需要有一個存儲中繼資料的資料庫,可以用mysql等等。
簡單來說,通過Hive就可以與hdfs檔案建立映射關系。我們隻需要通過開發hivesql語句,就可以對hdfs上的檔案進行操作了。
hive中有一個預設的庫:
庫名: default
庫目錄:hdfs://ip:9000/user/hive/warehouse
建立庫:
create database db_order;
庫建好後,在hdfs中會生成一個庫目錄:
hdfs://hdp20-01:9000/user/hive/warehouse/db_order.db
建表:
use db_order;
create table t_order(id string,create_time string,amount float,uid string);
表建好後,會在所屬的庫目錄中生成一個表目錄
/user/hive/warehouse/db_order.db/t_order
隻是,這樣建表的話,hive會認為表資料檔案中的字段分隔符為 ^A
正确的建表語句為:
create table t_order(id string,create_time string,amount float,uid string)
row format delimited
fields terminated by ',';
這樣就指定了,我們的表資料檔案中的字段分隔符為 ","
删除表:
drop table t_order;
删除表的效果是:
hive會從中繼資料庫中清除關于這個表的資訊;
hive還會從hdfs中删除這個表的表目錄;
内部表與外部表
内部表(MANAGED_TABLE):表目錄按照hive的規範來部署,位于hive的倉庫目錄/user/hive/warehouse中
外部表(EXTERNAL_TABLE):表目錄由建表使用者自己指定
create external table t_access(ip string,url string,access_time string)
fields terminated by ','
location '/access/log';
外部表和内部表的特性差别:
1、内部表的目錄在hive的倉庫目錄中 VS 外部表的目錄由使用者指定
2、drop一個内部表時:hive會清除相關中繼資料,并删除表資料目錄
3、drop一個外部表時:hive隻會清除相關中繼資料;
一個hive的資料倉庫,最底層的表,一定是來自于外部系統,為了不影響外部系統的工作邏輯,在hive中可建external表來映射這些外部系統産生的資料目錄;
然後,後續的etl操作,産生的各種表建議用managed_table
分區表
分區表的實質是:在表目錄中為資料檔案建立分區子目錄,以便于在查詢時,MR程式可以針對分區子目錄中的資料進行處理,縮減讀取資料的範圍。
比如,網站每天産生的浏覽記錄,浏覽記錄應該建一個表來存放,但是,有時候,我們可能隻需要對某一天的浏覽記錄進行分析
這時,就可以将這個表建為分區表,每天的資料導入其中的一個分區;
當然,每日的分區目錄,應該有一個目錄名(分區字段)
示例:
資料導入導出
方式1:導入資料的一種方式:
手動用hdfs指令,将檔案放入表目錄;
方式2:在hive的互動式shell中用hive指令來導入本地資料到表目錄
hive>load data local inpath '/root/order.data.2' into table t_order;
方式3:用hive指令導入hdfs中的資料檔案到表目錄
hive>load data inpath '/access.log' into table t_access partition(dt='20210806');
檔案格式
HIVE支援很多種檔案格式: SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE
create table t_pq(movie string,rate int) stored as textfile;
create table t_pq(movie string,rate int) stored as sequencefile;
create table t_pq(movie string,rate int) stored as parquetfile;
azkaban是一個工作流排程系統。與之類似的還有oozie,airflow等等。
一個完整的資料分析系統通常都是由大量任務單元組成:
shell腳本程式,java程式,mapreduce程式、hive腳本等;
各任務單元之間存在時間先後及前後依賴關系;
為了很好地組織起這樣的複雜執行計劃,需要一個工作流排程系統來排程執行。
在實際工作中,絕不是一個程式就能搞定一切的。需要分為多個程式運作,還有前後順序,是以任務排程系統一直存在。也在不斷的發展。
簡單的任務排程:直接使用linux的crontab來定義;
複雜的任務排程:開發排程平台
或使用現成的開源排程系統,比如ooize、azkaban等。
Azkaban是由Linkedin開源的一個批量工作流任務排程器。用于在一個工作流内以一個特定的順序運作一組工作和流程。Azkaban定義了一種KV檔案格式來建立任務之間的依賴關系,并提供一個易于使用的web使用者界面維護和跟蹤你的工作流。
位址:https://github.com/azkaban/azkaban
Azkaba内置的任務類型支援command、java
1、建立job描述檔案
vi command.job
command.jobtype=command command=echo 'hello'
2、将job資源檔案打包成zip檔案
zip command.job
3、通過azkaban的web管理平台建立project并上傳job壓縮包
首先建立project
上傳zip包
4、啟動執行該job
Command類型多job工作流flow
1、建立有依賴關系的多個job描述
第一個job:foo.job
foo.jobtype=commandcommand=echo foo
第二個job:bar.job依賴foo.job
bar.jobtype=commanddependencies=foocommand=echo bar
2、将所有job資源檔案打到一個zip包中
3、在azkaban的web管理界面建立工程并上傳zip包
4、啟動工作流flow
HDFS操作任務
fs.jobtype=commandcommand=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz
Sqoop是一個用于在Hadoop\和關系型資料庫之間流轉資料的一個工具。可以使用Sqoop将資料從關系型資料庫系統(RDBMS)比如MySQL或者Oracle導入到hadoop分布式檔案系統(HDFS)上,然後資料在Hadoop MapReduce上轉換,以及将資料導出到RDBMS中。
Sqoop自動實作了上面提到的很多過程,Sqoop使用MapReduce來導入和導出資料,這樣既可以提供并行化操作又可以提高容錯能力。
Sqoop是Apache軟體基金會的一個開源項目。可以通路http://Sqoop.apache.org擷取,sqoop目前已經趨于穩定,從apache退休了。
在每天定時定時排程把mysql資料傳到大資料叢集中,或者把hive中資料傳走時會用到。不過随時資料實時化的要求變高,sqoop的作用小了很多。但是一些曆史資料的導入還是需要的。
Sqoop提供了一系列的操作工具,使用Sqoop需要指定你想要使用的具體工具,以及提供對應的一些參數,使用方式如下。
可以使用sqoop help指令檢視幫助資訊
可以看到,sqoop提供的操作工具有10個。具體工具的使用幫助可以sqoop help (tool-name)或者sqoop tool-name --help進行檢視。
import工具可以用于從RDBMS中導入一張表到HDFS。表中的每一條記錄對應生成HDFS檔案中的每一行。這些記錄可以以text files或者Avro或者SequenceFiles格式進行存儲。
使用方法如下
參數清單-import基本參數
參數
–connect < jdbc-uri >
JDBC連接配接串
–connection-manager < class-name >
連接配接管理類
–driver < class-name >
手動指定JDBC驅動類
–hadoop-mapred-home < dir >
可以覆寫$HADOOP_MAPRED_HOME
–help
使用幫助
–password-file
指定包含密碼的檔案
-P
執行import時會暫停,等待使用者手動輸入密碼
–password < password >
直接将密碼寫在指令行中
–username < username >
指定使用者名
–verbose
顯示Sqoop任務更多執行資訊
–connection-param-file < filename >
可選的參數,用于提供連接配接參數
–relaxed-isolation
設定每個mapmer的連接配接事務隔離
Hive參數
以下是導入到 Hive 中時可選的參數:
Sqoop的export工具可以從HDFS同步一系列檔案資料到RDBMS中。使用這個工具的前提是導出目标表在資料庫必須存在。導出檔案根據使用者指定的分隔符轉化成一系列的輸出記錄。
預設的導出操作會将這些記錄轉化成一系列的INSERT語句,根據這些語句将記錄插入到關系型資料庫中。而在update模式下,Sqoop會生成一系列的UPDATE語句,将資料庫中已經存在的記錄進行更新。在call模式下,Sqoop會為每一條記錄調用一個存儲過程來處理。
基本參數
*參數*
*描述*
Flume是一個分布式、可靠、和高可用的海量日志采集、聚合和傳輸的系統
支援在日志系統中定制各類資料發送方,用于收集資料
Flume提供對資料進行簡單處理,并寫到各種資料接收方
Flume是成熟的開源日志采集系統,且本身就是hadoop生态體系中的一員,與hadoop體系中的各種架構元件具有天生的親和力,可擴充性強。
相對于用Shell腳本和Java的收集方式,規避了對日志采集過程中的容錯處理不便控制,減少了開發工作量。
例如對于實時的日志分析這種場景中,對資料采集部分的可靠性、容錯能力要求通常不會非常嚴苛,是以使用通用的flume日志采集架構完全可以滿足需求。
Flume的配置
安裝好flume以後需要對其進行配置。
flume通過事件(agent)進行運作,事件下包含如下的概念。
Source: 用來定義采集系統的源頭
Channel: 把Source采集到的日志進行傳輸,處理
Sink:定義資料的目的地
下面是一個示例。
有一個概念就是,我們定義了agent1這個agent。
定義了agent1.sources的系列設定去執行tail -F實時的采集日志資料。
通過Channel傳輸,最後指定Sink将日志存入hdfs。
随後将flume用指定的配置檔案啟動即可。
目前市面針對日志采集的有 Flume,Logstash,Filebeat,Fluentd ,rsyslog 很多種。但基本的原理是相同的,要根據公司的情況進行選擇。
本文從大資料理論到常用的基礎元件進行的筆記的整理,更深入的hadoop理論知識建議通過書籍進行深入的閱讀學習。而Spark,Flink等元件的學習将會通過單獨的文章進行筆記整理。希望對大家有所幫助,更多大資料相關知識,請關注 大資料流動~
大資料流動 專注于大資料實時計算,資料治理,資料可視化等技術分享與實踐。
請在背景回複關鍵字下載下傳相關資料。相關學習交流群已經成立,歡迎加入~