您好,登錄后才能下訂單哦!
從這篇開始記錄一下集群遷移的事情
早先因為機房沒地方,就已經開始規劃集群搬機房的事情,最近終于開始動手了,我會把這次不停機遷移的過程遇到的主要問題和矛盾以及各種解決方法記錄下來。
集群規模說大不大,幾百臺,總容量30PB左右。Hadoop使用CDH 5.5.1加一些自定義patch的rpm打包編譯版本。
總的方案是集群不停機,在兩個機房之間架設專線,舊機房decommission,拉到新機房recommission。每天不能下線太多機器,要保證計算。
新機房提前架設90臺機器,測試帶寬。帶寬的測試方式是比較簡單粗暴的,就是在新機房拿幾十臺新機器搭一個集群,然后舊機房集群和新機房集群之間做distcp,帶寬能打滿即可。
新機房拆除小集群,合并到大集群里,機架感知按照 "/機房/機架" 這種方式劃分,然后提前做一段時間balancer。
當然在這里面會發現一些問題,我記錄在上一篇博客里了,這里再重復記錄一下。
萬兆網卡的mtu問題,新機房的新機器datanode報slow block receiver問題,調整網卡mtu從1500到9000,解決。
df 命令卡死,升級systemd并重啟解決
跑作業慢,打Centos 7 CPU補丁 重啟
廣播風暴問題,流量比較大,查看網口每機器每秒幾百條ARP通告,目前無解,后續運維VLAN解決。
詳情看 運維記錄系列二十三 https://blog.51cto.com/slaytanic/2141665
期間還遇到了decommission速度慢的問題,調整了一下dn參數dfs.datanode.max.transfer.threads到16384,然后調整NN參數 dfs.namenode.replication.max-streams-hard-limit參數到8感覺也沒快多少,然后翻看源碼,在 src/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/UnderReplicatedBlocks.java 這個文件里面
public synchronized List<List<Block>> chooseUnderReplicatedBlocks( int blocksToProcess) { // initialize data structure for the return value List<List<Block>> blocksToReplicate = new ArrayList<List<Block>>(LEVEL); for (int i = 0; i < LEVEL; i++) { blocksToReplicate.add(new ArrayList<Block>()); } if (size() == 0) { // There are no blocks to collect. return blocksToReplicate; } int blockCount = 0; for (int priority = 0; priority < LEVEL; priority++) { // Go through all blocks that need replications with current priority. BlockIterator neededReplicationsIterator = iterator(priority); Integer replIndex = priorityToReplIdx.get(priority); // skip to the first unprocessed block, which is at replIndex for (int i = 0; i < replIndex && neededReplicationsIterator.hasNext(); i++) { neededReplicationsIterator.next(); } blocksToProcess = Math.min(blocksToProcess, size()); if (blockCount == blocksToProcess) { break; // break if already expected blocks are obtained } // Loop through all remaining blocks in the list. while (blockCount < blocksToProcess && neededReplicationsIterator.hasNext()) { Block block = neededReplicationsIterator.next(); blocksToReplicate.get(priority).add(block); replIndex++; blockCount++; } if (!neededReplicationsIterator.hasNext() && neededReplicationsIterator.getPriority() == LEVEL - 1) { // reset all priorities replication index to 0 because there is no // recently added blocks in any list. for (int i = 0; i < LEVEL; i++) { priorityToReplIdx.put(i, 0); } break; } priorityToReplIdx.put(priority, replIndex); } return blocksToReplicate; }
從這里獲取需要被復制的數據塊的索引,我們只需要將 Integer replIndex = proorityToReplIdx.get(priority);改為 Integer replIndex = 0;即可。
但是為了改一行代碼我還得重新編譯,就不劃算了。于是同事找了個工具叫byteman,jboss公司出品的內存修改器,可以理解成針對Java進行內存修改的金山游俠。
具體修改參考同事的github,我就不重復了。不過萬一內存改崩潰了,本人不負任何責任。
https://github.com/whitelilis/whitelilis.github.io/issues/17
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。