在聊心酸史之前,先鋪墊一下問題的由來:
本來就是簡單的使用簡單操作檔案到hdfs中,同樣的**別的同學都好使,而我的不行,**如下:
#謹記: c:\windows\system32\drivers\etc\hosts做ip對映,否則連線不上
from hdfs.client import client
#關於python操作hdfs的api可以檢視官網:
##讀取hdfs檔案內容,將每行存入陣列返回
def read_hdfs_file(client,filename):
lines =
with client.read(filename, encoding='utf-8', delimiter='\n') as reader:
for line in reader:
#pass
#print line.strip()
return lines
#建立目錄
def mkdirs(client,hdfs_path) :
client.makedirs(hdfs_path)
#刪除hdfs檔案
def delete_hdfs_file(client,hdfs_path):
client.delete(hdfs_path)
#上傳檔案到hdfs
def put_to_hdfs(client,local_path,hdfs_path):
client.upload(hdfs_path, local_path,cleanup=true)
#從hdfs獲取檔案到本地
def get_from_hdfs(client,hdfs_path,local_path):
download(hdfs_path, local_path, overwrite=false)
#追加資料到hdfs檔案
#覆蓋資料寫到hdfs檔案
def write_to_hdfs(client,hdfs_path,data):
#移動或者修改檔案
def move_or_rename(client,hdfs_src_path, hdfs_dst_path):
client.rename(hdfs_src_path, hdfs_dst_path)
#返回目錄下的檔案
def list(client,hdfs_path):
return client.list(hdfs_path, status=false)
# root:連線的跟目錄
client = client("",root="/",timeout=5*1000,session=false)
put_to_hdfs(client,'s.csv','/') #注意這s.csv是你當前路徑要有的檔案
# write_to_hdfs(client,'/a.txt','222222222222'+'\n')
# move_or_rename(client,'/b.txt', '/user/b.txt')
# mkdirs(client,'/input1/python1')
# print(list(client,'/input'))
# read_hdfs_file(client,'/hello/a.txt')
**我可以保證沒有一點點毛病,但是他就是報錯:
hdfs報failed to find datanode, suggest to check cluster health.然後我們回去輸入命令:找不到datanode,建議檢查cluster
start-all.sh發現真的是沒有datanodejpsnamenode
nodemanager
secondarynamenode
resourcemanager
而且有些同學也出現了這樣的問題,然後有些同學,
方式一通過先停止所有啟動,然後再格式化namenode就可以了,**如下:
stop-all.sh然後我也試一下,然後並沒有起到效果,它大舅還是它大舅,它二舅還是它二舅。hadoop namenode -format
方式二有的同學在啟動所有的狀態下單獨給datanode啟動命令,**如下:
hadoop-daemon.sh start datanode他們好了,擁有了他們想要的,但是我還是我,不一樣的煙火
方式三怎麼辦,茫茫人海中多看一眼解決不了,那就多看幾眼,
然後我就綜合前倆種方式,先停掉所有服務,然後再單獨啟動datanode,在啟動所有,**如下:
stop-all.sh然後神奇的事情發生了,你想要datanode給你了,但卻丟了namenode,就像上帝給了你一扇窗,就關掉了另一扇窗。hadoop-daemon.sh start datanode
hadoop namenode-format
結果:
jps對於這種情況我只想說我不服,怎麼辦,革命的道路上慢慢嘗試探索唄!nodemanager
datanode
secondarynamenode
resourcemanager
我把所有服務又都停了,然後單獨把nodanode和namenode啟動,**如下:
hadoop-daemon.sh start datanode結果:hadoop-daemon.sh start namenode
然上帝給了你兩扇窗,
namenode此時美到是美,但是其他我也得乙個乙個的去啟動,因為我也想到再啟動所有,把剩餘的再啟動起來,可是你可以做,只是結果又回到了解放前,又沒有了datanode.難道我真的要乙個個的去啟動,這並不是我想要的。datanode
那我們就來分析一下這個問題:
namenode和namenode也並不是撕破臉誰也見不得誰,它倆有同時存在的情況,那麼說明它們並不互相排斥,因為單幹自己的命令都好使,但是為什麼執行所有就不能同時存在呢!仔細對比分析倆次命令,會發現乙個是分開執行,乙個是同時執行,分開執行,無所謂,井水不犯河水,各自渡船過河,但是同時執行,就不成了,倆人同坐一條船渡河就不行。問題大概找到了,可能是因為它們有乙個共同的東西約束著它們,但是現在這個東西可能發生了改變,導致無法像以前一樣友好。
按我的路徑就是從根目錄開始cd /opt/bigdata/dfs/data/current
到了這個路徑下,你可以ls檢視會找到乙個version的東西,然後你可以vim version,看到乙個clusterid的東西,同樣的方法去檢視name裡的clusterid,發現我的倆個id果然不一樣,
clusterid=cid-c5751e32-15c0-4ef0-90a3-232ea8a0be43然後我更改了,name裡的clusterid,讓它和data裡的clusterid保持一致,帶著處理後的結果我去滿懷希望的去進行最初使的操作,啟動所有,然後jbs,檢視,萬水千山還是它,到此時,越到最後越不能慌,clusterid=cid-c4546e12-23d2-5yy2-64v3-435gh5h2hj45
分析一下
導致我clusterid不同的原因是因為,我格式化namenode了多次,導致了namenode的clusterid發生了改變,而我的datanode它並沒有發生改變,因為,我並沒有操作它,也就是說,datanode還是最初最初模樣,而發生變化是最新狀態namedata,所有我們要讓他們都處於當下狀態,那就格式化namenode,讓它變成最新,然後去更改datanode,讓datanode的clusterid也變成namenode的樣子。
最後一次猜想實驗
帶著上述的分析,我stop-all.sh停止了所有,然後hadoop namenode-format格式化namenode,讓它的clusterid變為最新,然後按前面講的查詢clusterid的方法找namenode的clusteid,得到它的值賦值給datanode的clusterid,然後儲存。此時的心情無法描述,被它摧殘的只剩下最後一絲希望。
按著這樣的方法我做,做到了。成功了。
噔噔噔…
jps然後再回到python的執行,就暢通無阻了。好開森。namenode
nodemanager
datanode
secondarynamenode
resourcemanager
總結:
在第一次啟動namenode時需要格式化,但之後不要再去格式化,否則多次格式化之後,你就會入了我的坑。當然還有一種思路,我覺的可行,就是讓所有都回到最初的模樣,那就時刪除,然後進行操作。也沒試過,能爬出這個坑也就很不容易了。其他的不足希望多多指點,小白盡力了。
HDFS中DataNode工作機制
1 datanode工作機制 1 乙個資料塊在 datanode 上以檔案形式儲存在磁碟上,包括兩個檔案,乙個是資料本身,乙個是元資料報括資料塊的長度 塊資料的校驗和以及時間戳。2 datanode 啟動後向 namenode 註冊,通過後,週期性 1小時 的向 namenode 上報所有的塊資訊。...
HDFS中DataNode工作機制
1.datanode工作機制 1 乙個資料塊在datanode上以檔案形式儲存在磁碟上,包括兩個檔案,乙個是資料本身,乙個是元資料 包括資料塊的長度,塊資料的校驗和,以及時間戳 2 datanode啟動後向namenode註冊,通過後,週期性 1小時 的向namenode上報所有的塊資訊。3 心跳是...
HDFS的DataNode原始碼分析
1.大致流程 datanode.main 入口函式 securemain args,null createdatanode args,null,resources 建立datanode instantiatedatanode args,conf,resources getstoragelocatio...