用hdfs進行文件存儲
㈠ Hadoop HDFS處理大量的小文件
小文件是指文件大小明顯小於HDFS上塊(block)大小(默認64MB)的文件。如果存儲小文件,必定會有大量這樣的小文件,否則你也不會使用Hadoop(If you』re storing small files, then you probably have lots of them
(otherwise you wouldn』t turn to Hadoop)),這樣的文件給hadoop的擴展性和性能帶來嚴重問題。當一個文件的大小小於HDFS的塊大小(默認64MB),就將認定為小文件否則就是大文件。為了檢測輸入文件的大小,可以瀏覽Hadoop DFS 主頁 http://machinename:50070/dfshealth.jsp ,並點擊Browse filesystem(瀏覽文件系統)。
首先,在HDFS中,任何一個文件,目錄或者block在NameNode節點的內存中均以一個對象表示(元數據)(Every file, directory and block in HDFS is represented as an object in the namenode』s memory),而這受到NameNode物理內存容量的限制。每個元數據對象約佔150byte,所以如果有1千萬個小文件,每個文件佔用一個block,則NameNode大約需要15G空間。如果存儲1億個文件,則NameNode需要150G空間,這毫無疑問1億個小文件是不可取的。
其次,處理小文件並非Hadoop的設計目標,HDFS的設計目標是流式訪問大數據集(TB級別)。因而,在HDFS中存儲大量小文件是很低效的。訪問大量小文件經常會導致大量的尋找,以及不斷的從一個DatanNde跳到另一個DataNode去檢索小文件(Reading through small files normally causes lots of seeks and lots of hopping from datanode to datanode to retrieve each small file),這都不是一個很有效的訪問模式,嚴重影響性能。
最後,處理大量小文件速度遠遠小於處理同等大小的大文件的速度。每一個小文件要佔用一個slot,而task啟動將耗費大量時間甚至大部分時間都耗費在啟動task和釋放task上。
Hadoop存檔文件系統通常將HDFS中的多個文件打包成一個存檔文件,減少namenode內存的使用
hadoop archive命令創建HAR文件
from:https://blog.csdn.net/sunnyyoona/article/details/53870077
㈡ hadoop 中文件是怎麼存儲的
1、存儲文件的時候需要指定存儲的路徑,這個路徑是HDFS的路徑。而不是哪個節點的某個目錄。比如./hadoopfs-putlocalfilehdfspat
一般操作的當前路徑是/user/hadoop比如執行./hadoopfs-ls.實際上就相當於./hadoopfs-ls/user/hadoop
2、HDFS本身就是一個文件系統,在使用的時候其實不用關心具體的文件是存儲在哪個節點上的。如果需要查詢可以通過頁面來查看,也可以通過API來實現查詢。
㈢ hadoop 中文件是怎麼存儲的
1、存儲文件的時候需要指定存儲的路徑,這個路徑是HDFS的路徑。而不是哪個節點的某個目錄。比如./hadoop fs -put localfile hdfspat
一般操作的當前路徑是/user/hadoop比如執行./hadoop fs -ls .實際上就相當於./hadoop fs -ls /user/hadoop
2、HDFS本身就是一個文件系統,在使用的時候其實不用關心具體的文件是存儲在哪個節點上的。如果需要查詢可以通過頁面來查看,也可以通過API來實現查詢。
㈣ hdfs適合存儲多大的單個文件
首先hdfs是建立在多個機器文件系統上的一個邏輯上的文件系統。它的底層數據以數據塊方式存儲,塊大小可進行調整。
假如你設置一個數據塊大小為256M,上傳一個1G的文件,它底層會將這個文件分成4塊存儲,每個塊256M。你在hdfs上看到的是一個完整的文件,隨時可對這個文件進行操作,無需關注它的存儲。就像你在操作系統上操作文件一樣,無需關注它存在那個磁碟哪個扇區
㈤ Python使用hdfs存放文件時報Proxy error: 502 Server dropped connection解決方案
Python3 使用hdfs分布式文件儲存系統
from pyhdfs import *
client = HdfsClient(hosts="testhdfs.org, 50070",
user_name="web_crawler") # 創建一個連接
client.get_home_directory() # 獲取hdfs根路徑
client.listdir(PATH) # 獲取hdfs指定路徑下的文件列表
client._from_local(file_path, hdfs_path, overwrite=True) # 把本地文件拷貝到伺服器,不支持文件夾;overwrite=True表示存在則覆蓋
client.delete(PATH, recursive=True) # 刪除指定文件
hdfs_path必須包含文件名及其後綴,不然不會成功
如果連接
HdfsClient
報錯
Traceback (most recent call last):
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2963, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "
client.get_home_directory()
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\pyhdfs.py", line 565, in get_home_directory
return _json(self._get('/', 'GETHOMEDIRECTORY', **kwargs))['Path']
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\pyhdfs.py", line 391, in _get
return self._request('get', *args, **kwargs)
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\pyhdfs.py", line 377, in _request
_check_response(response, expected_status)
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\pyhdfs.py", line 799, in _check_response
remote_exception = _json(response)['RemoteException']
File "C:\Users\billl\AppData\Local\Continuum\anaconda3\lib\site-packages\pyhdfs.py", line 793, in _json
"Expected JSON. Is WebHDFS enabled? Got {!r}".format(response.text))
pyhdfs.HdfsException: Expected JSON. Is WebHDFS enabled? Got '\n\n\n\n
502 Server dropped connection
\n
The following error occurred while trying to access http://%2050070:50070/webhdfs/v1/?user.name=web_crawler&op=GETHOMEDIRECTORY :
\n 502 Server dropped connection
\n
Generated Fri, 21 Dec 2018 02:03:18 GMT by Polipo on .\n\r\n'
則一般是訪問認證錯誤,可能原因是賬戶密碼不正確或者無許可權,或者本地網路不在可訪問名單中
㈥ hadoop面試題之HDFS
1、簡單介紹下hadoop吧?
廣義上hadoop是指與hadoop相關的大數據生態圈。包含hive、spark、hbase等。
狹義上hadoop指的是apache的開源框架。有三個核心組件:
----hdfs:分布式文件存儲系統
----yarn:分布式資源管理調度平台
----mr:分布式計算引擎
2、介紹下hdfs?
全稱為Hadoop Distributed File System。有三個核心組件:
namenode:有三個作用,第一是負責保存集群的元數據信息,第二是負責維護整個集群節點的正常運行。
第三是負責處理客戶端的請求。
datanode:負責實際保存數據。實際執行數據塊的讀寫操作。
secondarynamenode:輔助namenode進行元數據的管理。不是namenode的備份。
3、namenode的工作機制?
namenode在內存中保存著整個內存系統的名稱空間和文件數據塊的地址映射。整個hdfs可存儲的文件數受限於namenode的內存大小。所以hdfs不適合大量小文件的存儲。
---namenode有三種元數據存儲方式來管理元數據:
》內存元數據:內存中保存了完整的元數據
》保存在磁碟上的元數據鏡像文件(fsimage):該文件時hdfs存在磁碟中的元數據檢查點,裡面保存的是最後一次檢查點之前的hdfs文件系統中所有目錄和文件的序列化信息。
》數據操作日誌文件(edits):用於銜接內存meta data和持久化元數據鏡像fsimage之間的操作日誌文件。保存了自最後一次檢查點之後所有針對hdfs文件系統的操作。如對文件的增刪改查。
4、如何查看元數據信息?
因為edits和fsimage文件是經過序列化的,所以不能直接查看。hadoop2.0以上提供了查看兩種文件的工具。
----命令:hdfs oiv 可以將fsimage文件轉換成其他格式,如xml和文本文件。-i 表示輸入fsimage文件。-o 輸出文件路徑,-p 指定輸出文件
hdfs oev可以查看edits文件。同理需要指定相關參數。
詳情查看: https://www.imooc.com/article/79705
4、datanode的工作機制?
1)以數據塊的形式存儲hdfs文件
2)datanode響應客戶端的讀寫請求
3)周期性的向namenode匯報心跳信息、數據塊信息、緩存數據塊信息
5、secondary namenode工作機制?
當發生checkpoint機制時會觸發second namenode進行工作。checkpoint:
新的edists文件不會立即和fsimage文件合並,是在edits文件大小超過(默認)64m,或者時間超過(默認)1小時,會觸發checkpoint操作。當checkpoint時,namenode會新建一個edits.new的文件,此時second namenode將文件fsimage文件和edits文件(http get)到本地,然後載入到內存中進行合並,完成的文件名稱為fsimage.ckpt。最後 second namenode將該文件(http post)到namenode,然後edits.new和fsimage.ckpt文件轉換為fsimage和edits。
6、hdfs的文件副本機制?
所有的文件都是以塊的形式保存到hdfs中。塊的大小默認為128m。在hdfs-site文件中進行指定。
動態副本創建策略:默認副本數是3,可以在上傳文件時,顯式設定replication。也可以通過指令修改文件的副本數 hadoop fs -setrep -R 1
7、為實現高可用,hdfs採用了哪些策略?
副本機制、機架感知、心跳機制、安全模式、校驗和、回收站、元數據保護、快照機制(具體介紹導航- https://www.jianshu.com/writer#/notebooks/44567747/notes/66453316 )
8、hdfs的存儲過程?
①client向hdfs發起寫請求,通過RPC與namenode建立通訊。namenode檢查文件是否存在等信息,返回是否可以存儲。
②client將文件切割為一個個block塊,client申請存儲第一塊block。namenode返回可以存儲這個block塊的datanode的地址,假設為ABC。
③A到B到C逐級構建pipeline。client向A上傳第一個packet,默認為64k。A收到一個packet後會將packet傳給B,再傳給C。pipeline反方向返回ack信息。最終由第一個節點A將pipelineack發送給client
④一個block完成之後,再進行下一個block的存儲過程。
9、hdfs的讀過程?
10、hdfs的垃圾桶機制?
hdfs的垃圾桶機制默認是關閉的,需要手動開啟。hdfs刪除的文件不會立刻就刪除,而是在設定的時間後進行刪除。
11、hdfs的擴容和縮容
【
12、
㈦ HDFS的數據存儲之block
HDFS被設計成支持非常大的文件,與HDFS兼容的應用是那些處理大數據集的應用。這些應用程序處理非常大的文件在具有隻被創建和寫入一次,被讀取一次或多次的特性,即HDFS中存儲的大文件是一次寫入多次讀取不支持修改的,同時要求HDFS滿足應用程序以流讀取速度的要求。
正是因為大數據系統對所需的文件系統有這些要求,就決定了HDFS在存儲模型上具有以下特點:
㈧ 3.4 HDFS存儲原理
一、涉及的問題
1. 冗餘數據保存
2. 數據保存策略
3. 數據恢復
二、冗餘數據保存問題
1. 冗餘因子
出於成本考慮(也是HDFS優勢),HDFS常架構在廉價機器上——經常出故障。所以必須有冗餘機制。一般每個塊都保存3份,即冗餘因子默認是3
注意:偽分布式配置,即名稱節點和數據節點都放在同一個機器上,則冗餘因子顯然只能是1,因為只有一個機器
2. 冗餘機制的好處
(1) 加快數據傳輸速度——當多個客戶端同時想訪問相同數據塊時,可以同時並行而不需要排隊
(2) 很容易檢查數據錯誤——互相對照發現錯誤
(3) 保證數據可靠性——HDFS有這樣的機制:一旦探測到一個副本故障,會自動復制正確副本,使冗餘因子恢復默認值
三、數據保存與讀取
1. 第一副本存放策略:
(1) 如果保存請求來自集群內部,第一個副本放在發起者(應用)所在節點。比如一個在DataNode1上的應用發起存數據請求,那就把它第一份副本也存在DataNode1
(2) 如果保存請求來自集群外部,HDFS會隨機挑選一台磁碟不太忙且CPU不太忙的節點來放置第一個副本
2. 第二個副本存放策略:
放在和第一副本不同的機架的節點上 。如下圖中DataNode4,它和DataNode1在不同機架上
3. 第三副本放置策略:
放在和第一副本相同的機架的其他節點。如圖中的DataNode2或DataNode3
4. 更多副本存放策略:
全部隨機放置(依靠隨機演算法)
5、數據讀取
原則:就近讀取
——HDFS提供一個API可以告訴數據節點的機架ID,客戶端也可以用API診斷自己所在機架ID。ID相同說明在同一機架。而相同機架數據間通信很快,它們就是「相近」的數據。
——而前面也說了,每個數據塊都有多個不同的副本,如果找到某個副本和客戶端在同一個機架上,就優先選此副本。如果沒有就隨機找一個副本讀取
四、數據的錯誤與恢復
1. 名稱節點出錯
只有一個名稱節點,而且它保存了核心數據結構FsImage和EditLog。恢復方法:
(1) 在HDFS1.0里只能暫停服務,從第二名稱節點(冷備份)恢復
(2) 在HDFS2.0里可以直接用熱備份恢復而不用暫停服務
2. 數據節點出錯
(1) 如何發現數據節點出問題:
在整個運行期間,DataNode都會定期通過遠程調用向NameNode發送心跳信息。一旦隔了一個周期收不到心跳信息,則NameNode就知道這個DataNode發生了故障
(2) 如何恢復數據節點:
NameNode會在狀態列表裡把出錯的DataNode標記為不可用(宕機),然後把它裡面的數據塊對應的備份(在其他DataNode上)復制到另一個DataNode上去
——HDFS和其他分布式文件系統最大的區別就是 可以調整冗餘數據位置 。這種調整不僅發生在故障時,也可以在在機器負載不均衡時把一個DataNode的數據遷移到另一個上面以平衡負載
3. 數據出錯
(1) 如何發現數據出錯:
「校驗碼機制」——客戶端每寫入一個數據塊,都會為其生成一個校驗碼並保存在同一文件目錄下。讀取數據塊同時會核對其校驗碼,如果不對說明數據出問題了。
(2) 如何恢復數據:
從備份復制過來
Reference:
https://www.icourse163.org/learn/XMU-1002335004#/learn/content?type=detail&id=1214310117&cid=1217922275&replay=true