hdfs中datanode和namenode的坑

2021-09-25 23:38:03 字數 4906 閱讀 1870

在聊心酸史之前,先鋪墊一下問題的由來:

本來就是簡單的使用簡單操作檔案到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

jpsnamenode

nodemanager

secondarynamenode

resourcemanager

發現真的是沒有datanode

而且有些同學也出現了這樣的問題,然後有些同學,

方式一通過先停止所有啟動,然後再格式化namenode就可以了,**如下:

stop-all.sh

hadoop namenode -format

然後我也試一下,然後並沒有起到效果,它大舅還是它大舅,它二舅還是它二舅。

方式二有的同學在啟動所有的狀態下單獨給datanode啟動命令,**如下:

hadoop-daemon.sh start datanode

他們好了,擁有了他們想要的,但是我還是我,不一樣的煙火

方式三怎麼辦,茫茫人海中多看一眼解決不了,那就多看幾眼,

然後我就綜合前倆種方式,先停掉所有服務,然後再單獨啟動datanode,在啟動所有,**如下:

stop-all.sh

hadoop-daemon.sh start datanode

hadoop namenode-format

然後神奇的事情發生了,你想要datanode給你了,但卻丟了namenode,就像上帝給了你一扇窗,就關掉了另一扇窗。

結果:

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

clusterid=cid-c4546e12-23d2-5yy2-64v3-435gh5h2hj45

然後我更改了,name裡的clusterid,讓它和data裡的clusterid保持一致,帶著處理後的結果我去滿懷希望的去進行最初使的操作,啟動所有,然後jbs,檢視,萬水千山還是它,到此時,越到最後越不能慌,

分析一下

導致我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

namenode

nodemanager

datanode

secondarynamenode

resourcemanager

然後再回到python的執行,就暢通無阻了。好開森。

總結:

在第一次啟動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...