-
講述HDFS上傳文件和讀文件的流程
- HDFS 上傳流程
過程解析:詳解
這里描述的 是一個256M的文件上傳過程
① 由客戶端 向 NameNode節點節點 發出請求
②NameNode 向Client返回可以可以存數據的 DataNode 這里遵循 機架感應 原則
③客戶端 首先 根據返回的信息 先將 文件分塊(Hadoop2.X版本 每一個block為 128M 而之前的版本為 64M)
④然后通過那么Node返回的DataNode信息 直接發送給DataNode 並且是 流式寫入 同時 會復制到其他兩台機器
⑤dataNode 向 Client通信 表示已經傳完 數據塊 同時向NameNode報告
⑥依照上面(④到⑤)的原理將 所有的數據塊都上傳結束 向 NameNode 報告 表明 已經傳完所有的數據塊 -
HDFS在上傳文件的時候,如果其中一個塊突然損壞了怎么辦
其中一個塊壞了,只要有其它塊存在,會自動檢測還原。 -
NameNode的作用
namenode總體來說是管理和記錄恢復功能。
比如管理datanode,保持心跳,如果超時則排除。
對於上傳文件都有鏡像images和edits,這些可以用來恢復 -
NameNode在啟動的時候會做哪些操作
NameNode啟動的時候,會加載fsimage,NameNode啟動過程fsimage加載過程
Fsimage加載過程完成的操作主要是為了:
1. 從fsimage中讀取該HDFS中保存的每一個目錄和每一個文件
2. 初始化每個目錄和文件的元數據信息
3. 根據目錄和文件的路徑,構造出整個namespace在內存中的鏡像
4. 如果是文件,則讀取出該文件包含的所有blockid,並插入到BlocksMap中。
整個加載流程如下圖所示:
如上圖所示,namenode在加載fsimage過程其實非常簡單,就是從fsimage中不停的順序讀取文件和目錄的元數據信息,並在內存中構建整個namespace,同時將每個文件對應的blockid保存入BlocksMap中,此時BlocksMap中每個block對應的datanodes列表暫時為空。當fsimage加載完畢后,整個HDFS的目錄結構在內存中就已經初始化完畢,所缺的就是每個文件對應的block對應的datanode列表信息。這些信息需要從datanode的blockReport中獲取,所以加載fsimage完畢后,namenode進程進入rpc等待狀態,等待所有的datanodes發送blockReports。
-
NameNode的HA
NameNode的HA一個備用,一個工作,且一個失敗后,另一個被激活。他們通過journal node來實現共享數據 -
NameNode和DataNode之間有哪些操作
這個問題有些歧義。操作具體可以查看hadoop命令,應該超不出命令匯總
Hadoop Shell命令字典(可收藏)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6983
hadoop高級命令詳解
http://www.aboutyun.com/forum.php?mod=viewthread&tid=14829 -
Hadoop的作業提交流程
Hadoop2.x Yarn作業提交(客戶端)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=9498
Hadoop2.x Yarn作業提交(服務端)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=9496
更多:
hadoop作業提交腳本分析(1)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6954
hadoop作業提交腳本分析(2)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=6956 -
Hadoop怎么分片
如何讓hadoop按文件分片
http://www.aboutyun.com/forum.php?mod=viewthread&tid=14549
Hadoop分塊與分片
http://www.aboutyun.com/blog-5994-697.html -
如何減少Hadoop Map端到Reduce端的數據傳輸量
減少傳輸量,可以讓map處理完,讓同台的reduce直接處理,理想情況下,沒有數據傳輸 -
Hadoop的Shuffle
徹底了解mapreduce核心Shuffle--解惑各種mapreduce問題
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7078
hadoop代碼筆記 Mapreduce shuffle過程之Map輸出過程((1)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=10335 -
HMaster的作用
hmaster的作用
為region server分配region.
負責region server的負載均衡。
發現失效的region server並重新分配其上的region.
Gfs上的垃圾文件回收。
處理schema更新請求。
更多
region server and hmaster server -
HBase的操作數據的步驟
Hbase寫數據,存數據,讀數據的詳細過程
http://www.aboutyun.com/forum.php?mod=viewthread&tid=10886‘ -
Innodb的二進制文件和Redo日志的區別
1 二進制日志記錄所有引擎的日志,而重做日志只記錄InnoDB;
2 二進制日志記錄事務的具體操作內容,而后者記錄每個頁更改的物理情況;
3 前者用於point-in-time恢復,后者用於crash recovery;如果mysql發生介質損壞,則需要從備份中恢復然后應用binary log執行point-in-time recovery
spark
mr和spark區別,怎么理解spark-rdd
Mr是文件方式的分布式計算框架,是將中間結果和最終結果記錄在文件中,map和reduce的數據分發也是在文件中。
spark是內存迭代式的計算框架,計算的中間結果可以緩存內存,也可以緩存硬盤,但是不是每一步計算都需要緩存的。
Spark應用轉換流程
1、spark應用提交后,經歷了一系列的轉換,最后成為task在每個節點上執行
2、RDD的Action算子觸發Job的提交,生成RDD DAG
3、由DAGScheduler將RDD DAG轉化為Stage DAG,每個Stage中產生相應的Task集合
4、TaskScheduler將任務分發到Executor執行
5、每個任務對應相應的一個數據塊,只用用戶定義的函數處理數據塊
Spark-rdd是一個數據的分區記錄集合………………
Driver運行在Worker上
通過org.apache.spark.deploy.Client類執行作業,作業運行命令如下:
作業執行流程描述:
1、客戶端提交作業給Master
2、Master讓一個Worker啟動Driver,即SchedulerBackend。Worker創建一個DriverRunner線程,DriverRunner啟動SchedulerBackend進程。
3、另外Master還會讓其余Worker啟動Exeuctor,即ExecutorBackend。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。
4、ExecutorBackend啟動后會向Driver的SchedulerBackend注冊。SchedulerBackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計划,並調度執行。對於每個stage的task,都會被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend匯報的時候把TaskScheduler中的task調度到ExecutorBackend執行。
5、所有stage都完成后作業結束。
spark概念
術語總是難以理解的,因為它取決於所處的上下文。在很多情況下,你可能習慣於“將Job提交給一個cluster”,但是對於spark而言卻是提交了一個driver程序。
也就是說,對於Job,spark有它自己的定義,如下:
A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.在這個例子中,假設你需要做如下一些事情:
1. 將一個包含人名和地址的文件加載到RDD1中
2. 將一個包含人名和電話的文件加載到RDD2中
3. 通過name來Join RDD1和RDD2,生成RDD3
4. 在RDD3上做Map,給每個人生成一個HTML展示卡作為RDD4
5. 將RDD4保存到文件
6. 在RDD1上做Map,從每個地址中提取郵編,結果生成RDD5
7. 在RDD5上做聚合,計算出每個郵編地區中生活的人數,結果生成RDD6
8. Collect RDD6,並且將這些統計結果輸出到stdout
為了方便說明,我將這個例子整理成如下的一張示意圖:
其中紅色虛線表示輸入和輸出,藍色實線是對RDD的操作,圓圈中的數字對應了以上的8個步驟。接下來解釋driver program, job和stage這幾個概念:
- Driver program是全部的代碼,運行所有的8個步驟。
- 第五步中的save和第八步中的collect都是Spark Job。Spark中每個action對應着一個Job,transformation不是Job。
- 其他的步驟(1、2、3、4、6、7)被Spark組織成stages,每個job則是一些stage序列的結果。對於一些簡單的場景,一個job可以只有一個stage。但是對於數據重分區的需求(比如第三步中的join),或者任何破壞數據局域性的事件,通常會導致更多的stage。可以將stage看作是能夠產生中間結果的計算。這種計算可以被持久化,比如可以把RDD1持久化來避免重復計算。
- 以上全部三個概念解釋了某個算法被拆分的邏輯。相比之下,task是一個特定的數據片段,在給定的executor上,它可以跨越某個特定的stage。
到了這里,很多概念就清楚了。驅動程序就是執行了一個Spark Application的main函數和創建Spark Context的進程,它包含了這個application的全部代碼。Spark Application中的每個action會被Spark作為Job進行調度。每個Job是一個計算序列的最終結果,而這個序列中能夠產生中間結果的計算就是一個stage。
再回過頭來看一下Spark Programming Guide,對於Transformations和Actions是有着明確區分的。通常Action對應了Job,而Transformation對應了Stage:
Action列表:
- reduce
- collect
- count
- first
- take
- takeSample
- takeOrdered
- saveAsTextFile
- saveAsSequenceFile
- saveAsObjectFile
- countByKey
- foreach
Transformation列表:
- map
- filter
- flatMap
- mapPartitions
- mapPartitionsWithIndex
- sample
- union
- intersection
- distinct
- groupByKey
- reduceByKey
- aggregateByKey
- sortByKey
- join
- cogroup
- cartesian
- pipe
- coalesce
- repartition
- repartitionAndSortWithinPartitions
至於task,官方文檔中是這么說的:Task is a unit of work that will be sent to one executor。再結合官方對Stage的解釋,可以這樣理解:
一個Job被拆分成若干個Stage,每個Stage執行一些計算,產生一些中間結果。它們的目的是最終生成這個Job的計算結果。而每個Stage是一個task set,包含若干個task。Task是Spark中最小的工作單元,在一個executor上完成一個特定的事情。