日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ambari hdfs 启动报错_HDFS 运维常见问题处理

發(fā)布時間:2024/1/23 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ambari hdfs 启动报错_HDFS 运维常见问题处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

騰訊游戲CROS體系的DBA維護著多套互娛數(shù)據(jù)平臺的核心HDFS集群,積累了不少維護經(jīng)驗。

1. 定期block全盤掃描,引起dn心跳超時而脫離集群

hdfs有一個目錄掃描機制,默認6小時會全盤掃描一次所有block,判斷與內(nèi)存里的那份blockMap是否一致。參考
https://blog.cloudera.com/hdfs-datanode-scanners-and-disk-checker-explained/?。

在小文件比較多的情況,掃描的時候特征很明顯——磁盤的iops很高,但吞吐量很低。當然這不是引起datanode心跳超時的原因,真正的原因是處理掃描后的結(jié)果,比如比較完發(fā)現(xiàn)有20000個block不一致,在修復這些block時不斷的持有了 FsDatasetImpl 這個對象的一把鎖,在磁盤比較慢的情況下,可能需要5分鐘甚至10分鐘處理完,從而一直阻塞讀、寫、心跳的線程。

詳細的可以了解 HDFS-14476 lock too long when fix inconsistent blocks between disk and in-memory,包括一些特征、證據(jù),以及block修復邏輯,細節(jié)比較多。

解決辦法是,我們這邊加了個patch(已合入官方版本 2.10和3.x),在處理異常block的時候,中間休息2秒,處理一下正常的請求,不至于datanode卡住甚至離線。
修復后的結(jié)果也是很明顯,datanode心跳平滑了許多:

2. namenode遷移裁撤,遇到客戶端無法寫入

在需要遷移/裁撤namenode時,一般思路是保持 namenode hostname 不變,滾動遷移 standby 的方式遷移。

但是在我們的遷移實踐中,發(fā)現(xiàn) hdfs namenode 完成遷移后,集群正常,但 hdfs 客戶端訪問異常。在 yarn 這樣的長任務場景下,會導致文件讀寫一直失敗,直到 yarn nodemanager 重啟。

具體問題是這樣的:

client使用的是 ConfiguredFailoverProxyProvider ,client啟動之后會根據(jù)當時的inetsocket創(chuàng)建nn1,nn2兩個namenode proxy,這個在任何網(wǎng)絡異常的情況下都不會重新創(chuàng)建。

client 的 updateAddress 方法能檢測到namenode ip發(fā)生了變化,但由于那個異常沒有捕獲,本該在下次循環(huán)使用正確的 namenode ip 就能正常,但拋出異常后導致client重新連接namenode,然而上面的 namenode proxy 還是舊地址,SetupConnection 異常,又進入updateAddress判斷邏輯,返回true又去建連接,陷入了死結(jié)。

復現(xiàn)步驟

  • 打開一個hdfsclient,長時間寫一個文件 hdfs put

  • 更新hdfs新namenode hostname-ip

  • stop old nn2, start new nn2

  • 更新客戶端的namenode hostname-ip (client還在操作文件)

  • 切換到新namenode hdfs haadmin -failover nn1 nn2

  • 此時會發(fā)現(xiàn)client一直報錯
    在yarn客戶端啟動的周期內(nèi),哪怕是新文件寫入,依舊會報錯

  • 對 ConfiguredFailoverProxyProvider 打了個patch,就是在client failover之后,也進行updateAddress判斷,如果有ip變動,就重新 createProxy。驗證這個patch同樣有效。不過在client那邊統(tǒng)一捕獲會比較好,因為還有其他類型的HaProvider可能也有這個問題。

    這個問題的 patch 已經(jīng)被合入 Apache Hadoop 3.4,見 HADOOP-17068 client fails forever when namenode ipaddr changed。我們用的版本是 2.6.0-cdh5.4.11 ,patch也已合入官方版本。

    除了從根源問題上解決,也可以在 namenode 遷移操作時,在老節(jié)點上啟用端口轉(zhuǎn)發(fā),再逐個重啟 yarn,避免引起大范圍故障。

    3. 集群dn不均衡導致文件寫入失敗

    現(xiàn)象:集群將滿時,擴容了批機器緩解空間。運行了2個星期客戶端突然報文件寫入失敗
    原因:hdfs在部分datanode空間滿的情況下,理論會自動挑選其它可用的空閑節(jié)點。由于?dfs.datanode.du.reserved配置不當,導致依然會選中滿節(jié)點。具體是dfs.datanode.du.reserved如果小于分區(qū)block reserved,在磁盤用滿時就會出現(xiàn)

    org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /kafka/xxxtmp.parquet could only be replicated to 0 nodes instead of minReplication (=1). \
    There are 14 datanode(s) running and no node(s) are excluded in this operation.

    解決:

    • 擴容完,跑rebalance

    • 修改磁盤分區(qū)的block reserved,使其小于?dfs.datanode.du.reserved.

    • 增加單個datanode容量告警

    4. 做?rebalance 時速度很慢

    啟動 rebalance 命令./start-balancer.sh -threshold 10,如果需要提高速度可以修改限流帶寬hdfs dfsadmin -setBalancerBandwidth 52428800 。

    但是 datanode 上同時接收 blocks 并發(fā)數(shù),是不能在線調(diào)整的(或者說只能調(diào)小),調(diào)整hdfs-site.xml默認的balance參數(shù),并重啟

    dfs.balancer.moverThreads=1000
    dfs.balancer.dispatcherThreads=200
    dfs.datanode.balance.max.concurrent.moves=50

    如果啟動balance時,嘗試以更高的并發(fā)執(zhí)行,datanode會判斷沒有足夠的線程接收 block:?IOException: Got error, status message Not able to copy block ... because threads quota is exceeded。

    當 move 出現(xiàn)失敗時,遷移速度是指數(shù)級下降的,因為move block失敗默認會sleep一段時間。

    ./start-balancer.sh -threshold 5\
    -Ddfs.datanode.balance.max.concurrent.moves=20 \
    -Ddfs.datanode.balance.bandwidthPerSec=150000000 \
    -Ddfs.balancer.moverThreads=500 \
    -Ddfs.balancer.dispatcherThreads=100

    5. 給datanode在線增加磁盤

    騰訊云上的機器,可以直接在原有 datanode 上直接掛在新的磁盤,快速給hdfs擴容。

    增加磁盤,不需要重啟datanode。(前提是設置了?dfs.datanode.fsdataset.volume.choosing.policy為AvailableSpaceVolumeChoosingPolicy)

  • 掛載后,先建立hadoop數(shù)據(jù)目錄并修正權(quán)限

  • 在hdfs-site.xml?里加上新目錄配置?dfs.datanode.data.dir

  • 可以使用 reconfig 命令使其生效:?hdfs dfsadmin -reconfig datanode dn-x-x-x-x:50020 start

  • 6.?namenode設置了HA,但故障時未成功切換

    現(xiàn)象:active namenode 內(nèi)存故障,主備切換失敗

    原因:dfs.ha.fencing.methods設置為了ssh,但是并不能登錄其他namenode執(zhí)行fence

    解決:生成ssh key,免密碼登錄。或者改成shell(/bin/true),強切。注意,修改fence方式后,需要重啟zkfc。

    7. hdfs client input/output error

    現(xiàn)象:執(zhí)行?hdfs?客戶端命令報錯?input/output error,試著拷貝 hadoop / jdk 的介質(zhì)目錄,亦發(fā)現(xiàn)文件損壞。有時會發(fā)現(xiàn) jvm core

    原因:磁盤存在壞塊,剛好hdfs或者jdk的 jar 庫損壞。通過觀察 messages 發(fā)現(xiàn)有?sda IO Input/Output Error 。

    使用badblocks -s -v -o bb.log /dev/sda?可以看到磁盤損壞了哪些扇區(qū)
    解決:從其他機器,拷貝一份正常的介質(zhì)

    8. hdfs誤將 data 盤作為數(shù)據(jù)盤

    誤將系統(tǒng)盤作為了dfs.datanode.data.dir,運行一段時間后,這個分區(qū)很容易最先滿。

    這個是配置上的問題,理解datanode的工作方式,可以快速的將這個分區(qū)里的block挪到正確的磁盤分區(qū)。

    處理方法就是停止datanode,拷貝/data?block到其它分區(qū),刪掉/data的配置。因為datanode上block的位置是每次啟動的時候,掃描上報給namenode,所以可以做物理拷貝。

    可以使用拷貝命令cp -a /data/hadoopdata/current/BP-*-*/current/finalized/* /data1/hadoopdata/current/BP-*-*/current/finalized/?,不能拷貝整個 hadoopdata 目錄,因為VERSION文件里面的storageID不同。

    9. 使用decomiss方式將datanode退服時,客戶端讀寫異常

    現(xiàn)象:將datanode加入 exclude ,正常 decomissing 的方式退役節(jié)點,應用層反饋 spark 任務部分異常,報錯?Unable to close file because the last block doest not have enough number of replicas?,但該集群一些其它的文件讀寫任務正常。

    原因:spark任務會頻繁的創(chuàng)建、刪除application目錄。在decomissing時,部分磁盤性能低的節(jié)點,磁盤更加繁忙,導致出現(xiàn) last contact 心跳時間長。

    解決:經(jīng)過驗證,發(fā)現(xiàn)直接 kill datanode進程的方式,不影響spark任務。但必須保證一個一個的kill,否則會出現(xiàn) missing block. (這不一定是解決問題最好的辦法,但的確有效)

    10. namenode editlog 長時間未做checkpoint

    standby namenode 的一個作用是,定期合并從journalnode上獲取的editlog,生成新的元數(shù)據(jù)fsimage,然后推送到active namenode。

    當standby namenode出現(xiàn)異常,如進程退出、軟件bug(比如我們遇到過?IOException: No image directories available!),導致長時間未合并editlog。一旦需要發(fā)生切換或者重啟namenode,有可能導致啟動時間過長,嚴重的editlog合并需要的內(nèi)存不足,無法啟動namenode.

    如果內(nèi)存不足,一種解決辦法是借一臺高內(nèi)存臨時機器合并editlog:

    • 把standby停下來,將hdfs的軟件介質(zhì)和配置文件,拷貝到高內(nèi)存機器

    • 同時拷貝dfs.namenode.name.dir?目錄中最新能用的?fsimage_xxx?和它之后的所有?edits_xxx-xxx

    • 在臨時機器上啟動 namenode 進程,會自動從對應目錄加載 fsiamge 、合并editlog

    預防比補救要重要,一定要監(jiān)控namenode上?TransactionsSinceLastCheckpoint?這個指標,我們的閾值是達到 5000000 就告警。

    11. HDFS 3.x datanode 出現(xiàn)大量 CLOSE-WAIT

    這個問題?HDFS-15402?是在定期對 datanode?http://127.0.0.1:50075/jmx?jmx 進行探測的時候產(chǎn)生的,我們有 5 個 hadoop 3.1.3 的集群都存在該問題。在 hadoop 2.x 中正常。

    50075 端口上產(chǎn)生過多 close-wait 的影響是,正常的 webhdfs 會出現(xiàn) 504 Gateway-timeout

    [root@dn-9-4-xxx-yy /tmp]# ss -ant|grep :50075 |grep CLOSE-WAIT|wc -l
    16464
    [root@dn-9-4-xxx-yy /tmp]# ss -ant|grep :50075 |grep CLOSE-WAIT|head -3
    CLOSE-WAIT 123 0 9.4.xxx.yy:50075 9.4.xxx.yy:39706
    CLOSE-WAIT 123 0 9.4.xxx.yy:50075 9.4.xxx.yy:51710
    CLOSE-WAIT 123 0 9.4.xxx.yy:50075 9.4.xxx.yy:47475

    lsof -i:39706
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 134304 hdfs *307u IPv4 429yy7315 0t0 TCP dn-9-4-xxx-yy:50075->dn-9-4-xxx-yy:39706 (CLOSE_WAIT)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 123 0 9.4.xxx.yy:50075 9.4.xxx.yy:39706 CLOSE_WAIT 134304/java

    CLOSE-WAIT 狀態(tài)是客戶端(curl)發(fā)起關閉tcp連接時,服務端(datanode)收到了FIN-ACK,但在關閉socket時一直沒有完成。正常流程是關閉socket完成,然后向客戶端發(fā)送FIN:

    所以問題出在datanode server上,與knox還是haproxy客戶端沒有關系。并且這個問題調(diào)整os內(nèi)核參數(shù)是沒有用的,除非kill datanode,否則close-wait狀態(tài)會永久存在。使用網(wǎng)上的kill_close_wait_connections.pl?能夠清理這些 close-wait,之后 webhdfs 請求變得好轉(zhuǎn)。

    目前避開的方法就是,不再請求 datanode jmx 做監(jiān)控,只獲取 namenode 上的指標。datanode 上采集 os 級別的指標。

    12. knox 無法上傳 8G 文件

    在官方 jira 里我們提了這個問題?KNOX-2139?Can not handle 8GB file when using webhdfs?,當我們使用 webhdfs with knox 上傳?8589934592 bytes?大小的文件,會出現(xiàn)?(55) Send failure: Broken pipe,在 hdfs 只能看到一個空文件。而且在版本 knox 1.1、1.2 中是必現(xiàn),在 0.8 版本正常。

    簡單 debug 了一下代碼,knox 拿到的請求 contentLength 為 0,8G 以外的情況 contentLength 為 -1。

    我們后來使用 haproxy 代替 knox 解決 knox 自身上傳速度慢和這個 8G 文件的問題。

    不過在最新的 1.4 版本,8G問題又消失了。根據(jù)官方的恢復,可能跟 jetty 的升級有關。

    13. Unable to load native-hadoop library for your platform

    Unable to load native-hadoop library for your platform... using builtin-java classes

    經(jīng)常在執(zhí)行?hdfs?客戶端命令時會有這樣的提示,其實是個老生常談的問題。

    簡單說就是系統(tǒng)里沒有找到原生的 hadoop 庫?libhdfs.so,這個庫是 C 寫的,性能比較好。缺少但不影響使用,因為 hadoop 里有 java 實現(xiàn)的客戶端庫。

    出現(xiàn)這個總結(jié)原因有 3 個:

  • hadoop 安裝包里沒有自帶?libhdfs.so
    這個情況占很大一部分。去到目錄${HADOOP_HOME}/lib/native/,看下是否有l(wèi)ibhdfs.so,libhdfs.a,libhadoop.so,libhadoop.a。如果沒有的話,可以重新下一個完整的二進制包,把lib/native拷出來用
    這種看到才是正常的

  • ./bin/hadoop checknative
    20/05/14 20:13:39 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
    20/05/14 20:13:39 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
    Native library checking:
    hadoop: true /data1/hadoop-hdfs/hadoop-dist/target/hadoop-2.6.0-cdh5.4.11-tendata/lib/native/libhadoop.so.1.0.0
    zlib: true /lib64/libz.so.1
    snappy: true /data1/hadoop-hdfs/hadoop-dist/target/hadoop-2.6.0-cdh5.4.11-tendata/lib/native/libsnappy.so.1
    lz4: true revision:10301
    bzip2: true /lib64/libbz2.so.1
    openssl: true /usr/lib64/libcrypto.so

    實在不行就在自己的 os 上編譯一個。

    mvn clean package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/lib
  • so 文件存在,但路徑不對
    現(xiàn)在的版本,默認路徑都能找得到 so 庫。這個? https://stackoverflow.com/questions/19943766/hadoop-unable-to-load-native-hadoop-library-for-your-platform-warning 里面介紹的大部分方法,都是在教怎么設置路徑。真實原因很少會因為路徑不對,不過這個答案靠譜 https://stackoverflow.com/a/30927689 ,也就是我們的情況 3

  • 編譯的版本,在我們的 os 上依賴庫不全
    遇到過這種,glibc 庫版本不夠:

  • $ ldd lib/native/libhadoop.so
    lib/native/libhadoop.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by lib/native/libhadoop.so)
    linux-vdso.so.1 => (0x00007ffd1db6d000)
    /$LIB/libonion.so => /lib64/libonion.so (0x00007f5bfd37d000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f5bfce40000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5bfcc23000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f5bfc88f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5bfd266000)

    $ strings /lib64/libc.so.6 |grep GLIBC_
    可以看當前系統(tǒng)支持哪些版本的 glibc

    但是 glibc 安裝升級有風險,如果要安裝 2.14 版本務必先做好測試。

    14. 處理?missing?blocks

    hdfs 集群出現(xiàn) missing block,無非就是 namenode 里還記錄的 block 元數(shù)據(jù)信息,但是所有副本都丟失了。如果是同時掛了多個機器,或者損壞了多個機器上的磁盤,是有可能會出現(xiàn)。
    遇到過 2 次人為產(chǎn)生 missing blocks:

  • kill 一個 datanode 進程,就出現(xiàn) missing block

  • 先設置所有文件的 replication 為 1,一小段時間后,再設置為 2

  • 這兩種情況都算是 bug,對應的文件確實無法 get 下來了。但第 1 中情況還好,經(jīng)過排除日志,發(fā)現(xiàn)實際這些丟失的 blocks 本就接收到了刪除命令,過一段時間后,missing block 一般會自動消失。第 2 種情況,是真的意外丟 block 了,比較嚴重。不要輕易把 replication 設置為 1,再改回去可能丟 block。

    如果確認這些 missing block 可以消除,可以通過 fsck 命令手動處理:

    // 如果missing blocks數(shù)不是很多,可以直接逐個delete
    hdfs fsck file_name -delete

    // 如果missing blocks較多,可以從namenode上拿到corrupt塊
    hdfs fsck / -list-corruptfileblocks -openforwrite | egrep -v '^\.+$' | egrep "MISSING|OPENFORWRITE" | grep -o "/[^ ]*" | sed -e "s/:$//" > missing_blocks.txt

    15. 應該關注的告警

    實際還有些許多問題,比如用戶supergroup 權(quán)限問題、rack-aware.sh文件缺失的問題,限于篇幅就不列舉了。

    問題是不斷會出現(xiàn)的,但及時對大部分場景做到監(jiān)控工具,能夠提前發(fā)現(xiàn)問題。下面是整理并上線的關鍵告警指標:

    • datanode lastcontactdatanode 與 namenode 心跳監(jiān)控。心跳時間長意味著這個 dn 沒響應了,默認超過10m30s 沒響應,dn會脫離集群。

    • namenode and datanode web probe
      namenode 50070 與 datanode 50075 從外部探測,并且 datanode 會根據(jù) include里面的地址自動增減。我們使用修改過了 telegraf http_response 插件,支持動態(tài)讀取url,比如?exec bash get_datanode_urls.sh

    • dirctory max files
      單目錄下的文件數(shù)告警。hdfs默認限制單目錄下最大的文件數(shù)100萬,由配置項dfs.namenode.fs-limits.max-directory-items決定。
      這個指標數(shù)據(jù)來源于 fsimage 目錄畫像分析。

    • transactions not merged
      standby 未滾動的editlog數(shù)。長期未checkpoint會導致下次namenode啟動消耗過多內(nèi)存,甚至啟動失敗。

    • missing blocks
      異常blocks數(shù)

    • test write file
      在2個namenode節(jié)點上,定期使用 hdfs put/get 寫入文件。如果失敗會告警

    • non-active namenode
      hdfs集群namenode有且只有一個active,一個standby。其它情況告警

    • cluster capacity
      集群總體容量監(jiān)控

    • node usage, ioutil
      單個 datanode 磁盤空間使用率預警,ioutil持續(xù)5分鐘大于95%預警。

    • failover occurs
      hdfs namenode發(fā)生failover

    • namenode heap size
      namenode heap size使用比率。blocks數(shù)量多,內(nèi)存使用越多。

    總結(jié)

    以上是生活随笔為你收集整理的ambari hdfs 启动报错_HDFS 运维常见问题处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。