Hadoop資料讀寫原理

2021-09-20 09:23:18 字數 3175 閱讀 2643

資料流

mapreduce作業(job)是客戶端執行的單位:它包括輸入資料、mapreduce程式和配置資訊。hadoop把輸入資料劃分成等長的小資料傳送到mapreduce,稱之為輸入分片。hadoop為每個分片建立乙個map任務,由它來執行使用者自定義的map函式來分析每個分片中的記錄。

這裡分片的大小,如果分片太小,那麼管理分片的總時間和map任務建立的總時間將決定作業的執行的總時間。對於大資料作業來說,乙個理想的分片大小往往是乙個hdfs塊的大小,預設是64mb(可以通過配置檔案指定)

map任務的執行節點和輸入資料的儲存節點是同一節點時,hadoop的效能達到最佳。這就是為什麼最佳分片的大小與塊大小相同,它是最大的可保證儲存在單個節點上的資料量如果分割槽跨越兩個塊,那麼對於任何乙個hdfs節點而言,基本不可能同時儲存著兩資料塊,因此此分布的某部分必須通過網路傳輸到節點,這與使用本地資料執行map任務相比,顯然效率很低。

hadoop流

hdfs的設計

hdfs是為以流式資料訪問模式儲存超大檔案而設計的檔案系統,在商用硬體的集群上執行。

流式資料訪問:一次寫入、多次讀取模式是最高效的,乙個資料集通常由資料來源生成或複製,接著在此基礎上進行各種各樣的分析。

低延遲資料訪問:需要低延遲訪問資料在毫秒範圍內的應用不適用於hdfs,hdfs是為達到高資料吞吐量而優化的,這有可能會以延遲為代價。(低延遲訪問可以參考hbase)

大量的小檔案:namenode儲存著檔案系統的元資料,檔案數量的限制也由namenode的記憶體量決定。每個檔案,索引目錄以及塊佔大約150個位元組,因此,如果有一百萬檔案,每個檔案佔乙個塊,就至少需要300mb的記憶體。

多使用者寫入,任意修改檔案:hdfs中的檔案只有乙個寫入者。

hdfs的塊比磁碟的塊大,目的是為了減少定址的開銷。通過讓乙個塊足夠大,從磁碟轉移資料的時間能夠遠遠大於定位這個開始端的時間。因此,傳送乙個由多個塊組成的檔案的時間就取決於磁碟傳送率。

檔案讀取與寫入

hdfs中讀取資料

客戶端是通過呼叫filesystem物件的open()來讀取希望開啟的檔案的。對於hdfs,這個物件是分布式檔案系統的乙個例項。

(1)distributedfilesystem通過使用rpc來呼叫namenode,以確定檔案開頭部分的塊的位置,對於每乙個塊,namenode返回具有該塊副本的資料節點位址。隨後這些資料節點根據它們與客戶端的距離來排序,如果該客戶端本身就是乙個資料節點,便從本地資料節點讀取。(distributed filesystem返回乙個fsdata inputstream轉而包裝了乙個dfsinputstream物件)

(2)儲存著檔案開頭部分的塊的資料節點位址的dfsinputstream隨機與這些塊的最近的資料節點相連線,通過在資料流中重複呼叫read(),資料就會從資料節點返回客戶端。到達塊的末端時,dfsinputsteam會關閉與資料節點間的連線,然後為下乙個塊找到最佳的資料節點。

(3)客戶端從流中讀取資料時,塊是按照dfsinputstream開啟與資料節點的新連線的順序讀取的。它也會呼叫namenode來檢索下一組需要的塊的資料節點的位置。一旦客戶端完成讀取,就對檔案系統資料輸入呼叫close()。

這個設計的重點是,客戶端直接聯絡資料節點去檢索資料,通過namenode指引到每個塊中最好的資料節點。因為資料流動在此集群中是在所有資料節點分散進行的,因此這種設計能使hdfs可擴充套件到最大的併發客戶端數量。namenode提供塊位置請求,其資料是儲存在記憶體,非常的高效。

檔案寫入

客戶端是通過在distributedfilesystem中呼叫create()來建立檔案,distributedfilesystem乙個rpc去呼叫namenode,在檔案系統的命名空間中建立乙個新檔案。namenode執行各種不同的檢查以確保這個檔案不會已經存在,並且客戶端有建立檔案的許可權。檔案系統資料輸出流控制乙個dfsoutputstream,負責datanode與namenode之間的通訊。

客戶端完成資料的寫入後,會在流中呼叫clouse(),在向namenode傳送完資訊之前,此方法會將餘下的所有包放入datanode管線並等待確認,namenode節點已經知道檔案由哪些塊組成(通過data streamer詢問塊分配),所以它值需在返回成功前等待塊進行最小量的複製。

一旦寫入的資料超過乙個塊的資料,新的讀取者就能看見第乙個塊,對於之後的塊也是這樣。總之,它始終是當前正在被寫入的塊,其他讀取者是看不見的。hdfs提供乙個方法來強制所有的快取與datanode同步,即在檔案系統資料輸出流呼叫sync()方法,在syno()返回成功後,hdfs能保證檔案中直至寫入的最後的資料對所有新的讀取者而言,都是可見且一致的。萬一發生衝突(與客戶端或hdfs),也不會造成資料丟失。

應用設計的重要性:如果不呼叫sync(),那麼一旦客戶端或系統發生故障,就可能失去乙個塊的資料,應該在適當的地方呼叫sync().

通過distcp進行並行複製:hadoop有乙個叫distcp(分布式複製)的有用程式,能從hadoop的檔案系統並行複製大量資料。如果集群在hadoop的同一版本上執行,就適合使用hdfs方案:

hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar

將從第乙個集群中複製/foo目錄到第二個集群中的/bar目錄下

參考:《hadoop權威指南-第四版》

Hadoop資料讀寫原理

資料流 mapreduce作業 job 是客戶端執行的單位 它包括輸入資料 mapreduce程式和配置資訊。hadoop把輸入資料劃分成等長的小資料傳送到mapreduce,稱之為輸入分片。hadoop為每個分片建立乙個map任務,由它來執行使用者自定義的map函式來分析每個分片中的記錄。這裡分片...

hadoop原理記錄 HDFS讀寫資料

2.返回目標檔案的元資料 挑選一台datanode 就近原則,然後隨機 伺服器,請求讀取資料。3.客戶端請求讀資料block1 datanode開始傳輸資料給客戶端 從磁碟裡面讀取資料輸入流,以packet為單位來做校驗 4.傳輸資料 客戶端以packet為單位接收,先在本地快取,然後寫入目標檔案。...

Python讀寫hadoop檔案

這裡總結一下使用方法 首先需要借助三方庫pyhdfs 建立乙個hadoop連線物件 hdfs client pyhdfs.hdfsclient hdfs ip,hdfs port,hdfs user 假設hadoop現有目錄 home data 下有乙個檔案2018 06 28.out 那麼我們如何...