Ⅰ Hadoop 自身提供將文件從文件系統復制到 HDFS 的功能,有人了解這方面的東東么
命令行 dfs -put 就可以
要是java程序的話 主要看FileSystem那個類相關介面 還有FIleUtil 這個裡面的一些介面!
Ⅱ hdfs工作流程
1. hdfs基本工作流程
1. hdfs初始化目錄結構
hdfs namenode -format 只是初始化了namenode的工作目錄
而datanode的工作目錄是在datanode啟動後自己初始化的
namenode在format初始化的時候會形成兩個標識:
blockPoolId:
clusterId:
新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識
一旦namenode重新format後,namenode的身份標識已變,而datanode如果依然
持有原來的id,就不會被namenode識別
2. hdfs的工作機制
hdfs集群分為兩大角色:NameNode,DataNode (Secondary NameNode)
NameNode負責管理整個文件的元數據(命名空間信息,塊信息) 相當於Master
DataNode負責管理用戶的文件數據塊 相當於Salve
文件會按照固定的大小(block=128M)切成若干塊後分布式存儲在若干個datanode節點上
每一個文件塊有多個副本(默認是三個),存在不同的datanode上
DataNode會定期向NameNode匯報自身所保存的文件block信息,而namenode則會負責保持文件副本數量
hdfs的內部工作機制會對客戶的保持透明,客戶端請求方法hdfs都是通過向namenode申請來進行訪問
SecondaryNameNode有兩個作用,一是鏡像備份,二是日誌與鏡像的定期合並
3. hdfs寫入數據流程
1.客戶端要向hdfs寫入數據,首先要跟namenode通信以確認可以寫文件並獲得接收文件block的datanode,然後,客戶端按照順序將文件block逐個傳給相應datanode,並由接收到block的datanode負責向其他datanode復制block副本
4. 寫入數據步驟詳細解析
客戶端向namenode通信,請求上傳文件,namenode檢查目標文件是否已經存在,父目錄是否存在
namenode返回給客戶端,告知是否可以上傳
客戶端請求第一個block該傳輸到那些datanode伺服器上
namenode返回3個datanode伺服器abc
客戶端請求3台datanode的一台a上傳數據(本質上是一個rpc調用,建立pipeline),A收到請求後會繼續調用b,然後b調用c,將整個pipeline建立完成,逐級返回客戶端。
客戶端開始忘a上傳第一個block(先從磁碟讀取數據放入本地內存緩存),以packet為單位,a收到一個packet將會傳給b,b傳給c,a每傳一個packet會放入一個應答隊列等待應答
宕一個block傳輸完之後,客戶端再次請求namenode上傳第二個block的伺服器
Ⅲ hadoop的幾個問題 1.將本地文件復制到hdfs中,那麼在hdfs中這個文件是存放在namenode還是分開放在datanode
試著回答:
先說明一下:
1. namenode負責管理目錄和文件信息,真正的文件塊是存放在datanode上。
2. 每個map和rece(即task)都是java進程,默版認是有單獨的jvm的,所以不可能同一個類的對象會在不同節點上。
看你的描述是把namenode,datanode和jobtracker,tasktracker有點混了。
所以:
問題1. 分塊存放在datanode上
問題2.inputformat是在datanode上,確切的說是在tasktracker中。每權個map和rece都會有自己的對象,當多個map讀入一個文件時,實際上不同的map是讀的文件不同的塊,rece也是一樣,各個任務讀入的數據是不相交的。
問題3.rece輸出肯定是在hdfs上,和普通文件一樣在datanode上。
問題4.每個recer會有自己的outputformat對象,與前面inputformat原因一樣。
Ⅳ hdfs api創建文件並寫入內容
Hadoop類庫中最終面向用戶提供的介面類是FileSystem,該類是個抽象類,只能通過來類的get方法得到具體類。get方法存在幾個重載版本,常用的是這個: