自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解密HDFS如何判斷磁盤存儲(chǔ)大小,存儲(chǔ)動(dòng)態(tài)負(fù)載均衡的?

大數(shù)據(jù) 數(shù)據(jù)倉庫
DataNode在運(yùn)行過程中,為了計(jì)算DN的capacity使用量,實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的動(dòng)態(tài)均衡,DN會(huì)對(duì)已配置的數(shù)據(jù)存儲(chǔ)路徑(dfs.datanode.data.dir)進(jìn)行du -sk操作,以此獲得capacity使用量匯報(bào)給NN中,然后NN就知道哪些DN有空間能被寫數(shù)據(jù)進(jìn)去,哪些是空間不足的。

1. HDFS對(duì)底層的磁盤存儲(chǔ)如何選擇的?

 一個(gè)HDFS集群,會(huì)有很多個(gè)datanode節(jié)點(diǎn),每個(gè)datanode節(jié)點(diǎn)會(huì)掛載很多塊磁盤。HDFS在存儲(chǔ)數(shù)據(jù)時(shí)如何動(dòng)態(tài)負(fù)載均衡最優(yōu)化地往每個(gè)datanode,每個(gè)磁盤上存儲(chǔ)數(shù)據(jù)呢?

 其實(shí)沒啥,DataNode在運(yùn)行過程中,為了計(jì)算DN的capacity使用量,實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的動(dòng)態(tài)均衡,DN會(huì)對(duì)已配置的數(shù)據(jù)存儲(chǔ)路徑(dfs.datanode.data.dir)進(jìn)行du -sk操作,以此獲得capacity使用量匯報(bào)給NN中,然后NN就知道哪些DN有空間能被寫數(shù)據(jù)進(jìn)去,哪些是空間不足的。

圖片

為了保證數(shù)據(jù)使用量的近實(shí)時(shí)性,目前DN是以默認(rèn)10分鐘的間隔時(shí)間執(zhí)行一次。假設(shè)按照一個(gè)DN節(jié)點(diǎn)12個(gè)數(shù)據(jù)目錄對(duì)應(yīng)12塊盤的情況,就會(huì)有12個(gè)du操作在每個(gè)10分鐘內(nèi)都會(huì)執(zhí)行一次。在datanode存儲(chǔ)的數(shù)據(jù)使用率比較高的時(shí)候,會(huì)十分消耗性能。直接引發(fā)阻塞io,系統(tǒng)load直線增高。

這種問題在大規(guī)模的集群中是很常見的,下面是針對(duì)線上(hadoop2.6版本的)簡(jiǎn)易零時(shí)的優(yōu)化手段。說明:此問題僅存在于低于hadoop2.8版本,高于此版本已經(jīng)修復(fù)。

https://issues.apache.org/jira/browse/HADOOP-9884

如果碰到這種情況,升級(jí)不了集群版本,那么我們還有其他奇技淫巧嗎?

2.通過修改HDFS代碼實(shí)現(xiàn)優(yōu)化

先回顧一下du,df的使用

du原理簡(jiǎn)述:

du命令全程disk usage,它的統(tǒng)計(jì)原理在于將目標(biāo)路徑下的當(dāng)前沒有被刪除的文件進(jìn)行大小累加,然后得出總使用量。這種計(jì)算方式在文件數(shù)量少時(shí)往往不會(huì)表現(xiàn)出什么問題。但是當(dāng)目標(biāo)路徑目錄多,文件多的時(shí)候,du會(huì)表現(xiàn)出明顯的時(shí)間執(zhí)行耗時(shí)。

df 原理簡(jiǎn)述:

df命令統(tǒng)計(jì)值通過文件系統(tǒng)獲取的。df命令的弊端是它不能按照具體目錄進(jìn)行使用量的統(tǒng)計(jì)。df是按照所在磁盤級(jí)別進(jìn)行統(tǒng)計(jì)的。換句話說,用df命令在屬于同一塊物理盤的子路徑下執(zhí)行df命令,獲取的值會(huì)是完全一致的。比較遺憾,這種情況將無法支持DataNode多block pool共用一塊盤的情況。

處理方式:使用 df 命令替換 du

捕獲到datanode執(zhí)行過程中調(diào)用的 du -sk 命令,替換為df -k 。

實(shí)現(xiàn)腳本如下:

##將原始的 du指令更換名稱

mv /usr/bin/du /usr/bin/du_bak
vim /usr/bin/du
#!/bin/sh
if [[ $2 == */current/BP-* ]] && [ $1 == -sk ]
then
    used=`df -k $2 | grep -vE 'Used' | awk '{print $3}'`
    echo -e "$used\t$2"
else
    echo -e "$(du_bak $@)"
fi

chmod +x /usr/bin/du

3.批量部署的執(zhí)行環(huán)境

跳板機(jī)(10.90.72.195)已經(jīng)部署好ansible環(huán)境,配置主機(jī)名,執(zhí)行ansible-playbook腳本即可。

執(zhí)行路徑:/home/tool/updata_datanodes_du
需要修改的配置文件:/home/tool/updata_datanodes_du/datanodes
執(zhí)行腳本:./run.sh

updata_du.yml

---
- hosts: all_datanodes
remote_user: root
gather_facts: F # 跳過gather_facts環(huán)節(jié)
serial: 70 #開啟的并發(fā)數(shù)
tasks:
- name: "檢查主機(jī)du是否已經(jīng)被部署過"
stat:
path: "/usr/bin/du_bak"
register: file_stat
- name: "同步du腳本文件到目標(biāo)主機(jī)"
copy: # 使用復(fù)制模塊,進(jìn)行文件分發(fā),從本地主機(jī)分發(fā)到遠(yuǎn)程主機(jī)
src: '{{ item.src }}' # 源文件,變量定義多個(gè)源文件
dest: "/tmp/" # 文件復(fù)制到目標(biāo)主機(jī)的目錄
owner: root
group: root
mode: 0777
with_items: # 本地源文件列表
- { src: '/home/tool/updata_datanodes_du/scp_files/du' }
when: not file_stat.stat.exists
- name: "檢查du文件是否同步成功"
stat:
path: "/tmp/du"
register: tmp_du_stat
- name: "備份du文件"
command: mv /usr/bin/du /usr/bin/du_bak
when: tmp_du_stat.stat.exists
- name: "更新為新的du腳本文件"
command: mv /tmp/du /usr/bin/du
when: tmp_du_stat.stat.exists

責(zé)任編輯:武曉燕 來源: 滌生大數(shù)據(jù)
相關(guān)推薦

2023-10-23 06:47:37

Redis磁盤存儲(chǔ)

2017-04-17 13:24:43

數(shù)據(jù)庫內(nèi)存數(shù)據(jù)庫存儲(chǔ)

2018-10-31 09:07:56

磁帶磁盤存儲(chǔ)

2011-12-12 10:02:20

虛擬化本地存儲(chǔ)SANsymphony

2013-01-21 13:38:27

IBMdW

2009-01-11 22:38:37

SSD固態(tài)盤綠色

2017-11-08 08:31:57

NAS存儲(chǔ)移動(dòng)硬盤

2010-03-25 11:09:07

Hyper-V磁盤存儲(chǔ)虛擬化Hyper-V

2022-05-06 09:21:57

工作負(fù)載SPDK線程

2010-05-18 20:05:43

富士通磁盤存儲(chǔ)

2018-08-28 15:10:16

數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)Hadoop

2023-03-30 13:32:51

負(fù)載均衡器HDFS

2019-05-16 14:28:48

硬盤存儲(chǔ)設(shè)備

2018-12-03 08:31:40

負(fù)載均衡解密Web 服務(wù)器

2018-12-03 13:50:03

流量網(wǎng)絡(luò)負(fù)載均衡

2024-05-31 13:29:47

2017-08-14 09:05:50

SIOC存儲(chǔ)負(fù)載

2015-04-02 12:42:26

HDFS分層存儲(chǔ)高效

2023-11-22 08:35:34

存儲(chǔ)引擎bitcask

2017-05-22 14:58:01

負(fù)載存儲(chǔ)性能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)