天天看點

萬字長文|Hadoop入門筆記(附資料)

大資料迅速發展,但是hadoop的基礎地位一直沒有改變。了解并掌握hadoop相關知識對于之後的相關元件學習有着地基的作用。本文整理了hadoop基礎理論知識與常用元件介紹,雖然有一些元件已經不太常用。但是了解第一批元件的相關知識對于以後的學習很有幫助,未來的很多元件也借鑒了之前的設計理念。

文章較長,建議收藏後閱讀。

相關學習資料可以通過下面的方式下載下傳,本文隻是整理了大資料hadoop基本知識,有精力的同學可以通過相關書籍進行更深入的學習。

萬字長文|Hadoop入門筆記(附資料)

本文通過以下章節由淺入深學習,建議閱讀前有一定的linux基礎和java基礎,并搭建好大資料環境。相關知識可以在大資料流動中擷取。

萬字長文|Hadoop入門筆記(附資料)

一個最簡單的大資料系統就是通過,zookeeper進行協調服務,并通過任務排程對hive或者mr進行計算任務執行,通過資料傳輸與外部系統建立聯系。當然架構在不變化,最新的大資料架構遠不止于此。但這些基本的元件對于了解大資料的原理非常的有幫助。

萬字長文|Hadoop入門筆記(附資料)

這些元件互相配合,最終形成了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、用戶端應用可以在節點上設定螢幕

萬字長文|Hadoop入門筆記(附資料)

(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進行檢視。

萬字長文|Hadoop入門筆記(附資料)

我們可以了解為我們通過指令對檔案及檔案夾進行了操作,但這都是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進行了分區和排序;

萬字長文|Hadoop入門筆記(附資料)

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建立應用程式;為它申請資源,并監控它的整個運作過程,直到運作完成。

萬字長文|Hadoop入門筆記(附資料)

第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

萬字長文|Hadoop入門筆記(附資料)

上傳zip包

萬字長文|Hadoop入門筆記(附資料)

4、啟動執行該job

萬字長文|Hadoop入門筆記(附資料)

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包中

萬字長文|Hadoop入門筆記(附資料)

3、在azkaban的web管理界面建立工程并上傳zip包

4、啟動工作流flow

hdfs操作任務

fs.jobtype=commandcommand=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz

萬字長文|Hadoop入門筆記(附資料)

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等元件的學習将會通過單獨的文章進行筆記整理。希望對大家有所幫助,更多大資料相關知識,請關注 大資料流動~

萬字長文|Hadoop入門筆記(附資料)

大資料流動 專注于大資料實時計算,資料治理,資料可視化等技術分享與實踐。

請在背景回複關鍵字下載下傳相關資料。相關學習交流群已經成立,歡迎加入~