Hadoop3.0の新機能!DataNodeディスク間バランサーを試す

DataNodeディスク間バランサー

昨日紹介したHDFSの再バランスは、DataNode間でディスク使用量を平準化するための機能でした。一方で、DataNodeが複数のディスクを持っている場合、それぞれのディスクの使用量のバランスが崩れてしまうこともあります。一例として、データの削除が激しく行われたり、もっとわかりやすい例は新しいディスクを増設した場合です。このように偏りが生じるとI/Oが特定のディスクに偏ってしまい、効率が良くありません。

ボリューム選択ポリシー

DataNodeが複数のディスクを持っている場合、ラウンドロビンで順番に書き込むという仕様でした。しかし今では

  • Round-Robin Volume choosing policy
  • Available Space Volume choosing policy

の2つのポリシーから選択できます。

前者は従来のラウンドロビン、後者はデータが追加されたら空いているディスクに書き込んで行きます。結果、徐々に平準化されます。しかし新しいディスク書き込みが集中してしまうなどの問題が生じてしまいます。

このポリシーはClouderaのブログで用いられている絵がわかりやすいので、是非ご覧ください。

https://blog.cloudera.com/blog/2016/10/how-to-use-the-new-hdfs-intra-datanode-disk-balancer-in-apache-hadoop/

ディスク間の再バランス(HDFS-1312)は長らく解消されていなかったのですが、ついに Hadoop 3.0にて、DataNode内のディスク間再バランス機能が導入されました。この機能はCDH5.8.2にバックポートされているため動作検証してみましょう。また、この実験に伴いディスクを追加するため、DataNodeのディスクのホットスワップ機能も試してみます。

DataNodeのディスクのホットスワップを行う

HDDの障害でDataNodeのディスクを交換したり、あるいはDataNodeにディスクを増設する場合、従来はDataNodeをシャットダウンする必要がありました。今ではDataNodeを再起動せずにディスクの構成変更を通知することができます。

HDDを追加する

現在はディスク一本で1.5GBほど利用しています。続いて /mnt1/dn と /mnt2/dn の2本のディスクを追加していきます。

追加前の使用量


$ sudo du -sh /var/lib/hadoop-hdfs/cache/hdfs/dfs/1.5G    /var/lib/hadoop-hdfs/cache/hdfs/dfs/

Cloudera Managerを用いてディスクをDataNodeに追加します。DataNodeのデータディレクトリ (dfs.datanode.data.dir) は1つのディスクしかありません。

hotswap1ここに2つのディスクを追加し、

hotswap2保存後メニューから「データディレクトリの更新」を選択します。Cloudera Managerを使用しない場合は下記のようにコマンドで更新します。

例: hdfs dfsadmin -reconfig datanode <hostname>:50020 start

hotswap3ダイアログが表示されるので、更新したら進行状況を確認しましょう。

hotswap4hotswap5必要であれば、ログを検索して追加されたことが確認できます。今回はmnt2という文字列で検索していますが、下線部のように追加されていることがわかりますね。
hotswap6

ディスク間再バランス

プロパティの設定

それではディスク間のバランシングを行います。再バランスを行うには、Cloudera Managerから dfs.disk.balancer.enabled プロパティをtrueにセットします。Cloudera Manager 5.9の時点ではこのパラメータは直接設定できないので、安全バルブで設定します。

diskbalancer1設定が終わったらHDFSサービスを再起動します。これで準備完了です。

diskbalancer2

現時点ではCloudera Managerからディスク間再バランスを行うことはできません。従ってコマンドラインから実行します。実行前のディスクの使用量は下記の通りでした。


[cloudera@quickstart ~]$ sudo du -sh /var/lib/hadoop-hdfs/cache/hdfs/dfs/
1.5G	/var/lib/hadoop-hdfs/cache/hdfs/dfs/
[cloudera@quickstart ~]$ sudo du -sh /mnt1/dn
54M	/mnt1/dn
[cloudera@quickstart ~]$ sudo du -sh /mnt2/dn
68K	/mnt2/dn
[cloudera@quickstart ~]$

ディスクバランサーは3つの手順で行います。

  1. バランシング計画の作成
  2. バランシングの実行
  3. バランシングのクエリ

計画の作成

以下のコマンドを実行して計画を作成します。


$ sudo -u hdfs hdfs diskbalancer -plan quickstart.cloudera
16/12/08 09:16:04 INFO planner.GreedyPlanner: Starting plan for Node : quickstart.cloudera:50020
16/12/08 09:16:04 INFO planner.GreedyPlanner: Compute Plan for Node : quickstart.cloudera:50020 took 3 ms
16/12/08 09:16:04 INFO command.Command: No plan generated. DiskBalancing not needed for node: quickstart.cloudera threshold used: 10.0
$

再バランスは不要だと判断されてしまいした…。閾値が10.0なので、もっと小さな値にして実行してみます。


$ sudo -u hdfs hdfs diskbalancer -plan quickstart.cloudera -thresholdPercentage 1
16/12/08 09:17:49 INFO planner.GreedyPlanner: Starting plan for Node : quickstart.cloudera:50020
16/12/08 09:17:49 INFO planner.GreedyPlanner: Disk Volume set 48ceb66a-e68f-491c-b60a-4cf867cd7786 Type : DISK plan completed.
16/12/08 09:17:49 INFO planner.GreedyPlanner: Compute Plan for Node : quickstart.cloudera:50020 took 5 ms
16/12/08 09:17:49 INFO command.Command: Writing plan to : /system/diskbalancer/2016-Dec-08-09-17-49
[cloudera@quickstart ~]$

今度はうまくいったようです。プランがHDFSに書き出されました。


$ ]$ hdfs dfs -ls /system/diskbalancer/2016-Dec-08-09-17-49
Found 2 items
-rw-r--r--   1 hdfs supergroup       1154 2016-12-08 09:17 /system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.before.json
-rw-r--r--   1 hdfs supergroup       1716 2016-12-08 09:17 /system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json
[cloudera@quickstart ~]$ hdfs dfs -cat /system/diskbalancer/2016-Dec-08-09-17-49/*.plan.json/system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json
cat: `/system/diskbalancer/2016-Dec-08-09-17-49/*.plan.json/system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json': No such file or directory
[cloudera@quickstart ~]$ hdfs dfs -cat /system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json
{"volumeSetPlans":[{"@class":"org.apache.hadoop.hdfs.server.diskbalancer.planner.MoveStep","sourceVolume":{"path":"/var/lib/hadoop-hdfs/cache/hdfs/dfs/data","capacity":58479091712,"storageType":"DISK","used":962919796,"reserved":0,"uuid":"DS-b77a7116-4780-483b-9af2-763211fd90d8","failed":false,"volumeDataDensity":-1.0000000000000286E-4,"skip":false,"transient":false,"readOnly":false},"destinationVolume":{"path":"/mnt2/dn","capacity":20944310272,"storageType":"DISK","used":341392257,"reserved":0,"uuid":"DS-498e1698-6fda-4e46-8d5b-a9a42f2eea2a","failed":false,"volumeDataDensity":9.99999999999994E-5,"skip":false,"transient":false,"readOnly":false},"idealStorage":0.0163,"bytesToMove":341337867,"volumeSetID":"48ceb66a-e68f-491c-b60a-4cf867cd7786","maxDiskErrors":0,"tolerancePercent":0,"bandwidth":0},{"@class":"org.apache.hadoop.hdfs.server.diskbalancer.planner.MoveStep","sourceVolume":{"path":"/var/lib/hadoop-hdfs/cache/hdfs/dfs/data","capacity":58479091712,"storageType":"DISK","used":962919796,"reserved":0,"uuid":"DS-b77a7116-4780-483b-9af2-763211fd90d8","failed":false,"volumeDataDensity":-1.0000000000000286E-4,"skip":false,"transient":false,"readOnly":false},"destinationVolume":{"path":"/mnt1/dn","capacity":20944310272,"storageType":"DISK","used":341392257,"reserved":0,"uuid":"DS-e42991fb-9844-4ede-885e-d4194d8f39ab","failed":false,"volumeDataDensity":9.99999999999994E-5,"skip":false,"transient":false,"readOnly":false},"idealStorage":0.0163,"bytesToMove":285682561,"volumeSetID":"48ceb66a-e68f-491c-b60a-4cf867cd7786","maxDiskErrors":0,"tolerancePercent":0,"bandwidth":0}],"nodeName":"quickstart.cloudera","nodeUUID":"d30df094-5f4b-4f21-8075-014774e782f5","port":50020,"timeStamp":1481217469721}[cloudera@quickstart ~]$

ディスク間再バランスの実行


$ sudo -u hdfs hdfs diskbalancer -execute  /system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json
16/12/08 09:30:29 INFO command.Command: Executing "execute plan" command
[cloudera@quickstart ~]$

再バランスが行われているかを確認するため、ディスクの使用量を確認します。うまくいっているようですね。


[cloudera@quickstart ~]$ sudo du -sh /var/lib/hadoop-hdfs/cache/hdfs/dfs/
982M    /var/lib/hadoop-hdfs/cache/hdfs/dfs/
[cloudera@quickstart ~]$ sudo du -sh /mnt1/dn
306M    /mnt1/dn
[cloudera@quickstart ~]$ sudo du -sh /mnt2/dn
301M    /mnt2/dn
[cloudera@quickstart ~]$

再バランスの確認

コマンドラインからも確認します。


]$ sudo -u hdfs hdfs diskbalancer -query quickstart.cloura
16/12/08 09:36:37 INFO command.Command: Executing "query plan" command.
Plan File: /system/diskbalancer/2016-Dec-08-09-17-49/quickstart.cloudera.plan.json
Plan ID: e15d65bc1b51a69ce792a09489e1df53f2ea584f0617253a77f789f72e0d3394ace3a662f9f15d332ade23b2f31a96f352aef3cd2d13be0dea61d4600210f9d1
Result: PLAN_DONE
[cloudera@quickstart ~]$

PLAN_DONE と表示され、再バランスが完了していました。

まとめ

DataNodeは4〜12本のディスクを搭載しているサーバを使うことが多いですが、簡単にディスク間の偏りを調整する方法はありませんでした。このディスク間再バランスの機能は運用の際にかなり役立つ方も多そうですね。

 

参考情報

New in CDH 5.4: Hot-Swapping of HDFS DataNode Drives:http://blog.cloudera.com/blog/2015/05/new-in-cdh-5-4-how-swapping-of-hdfs-datanode-drives/

How-to: Use the New HDFS Intra-DataNode Disk Balancer in Apache Hadoop: https://blog.cloudera.com/blog/2016/10/how-to-use-the-new-hdfs-intra-datanode-disk-balancer-in-apache-hadoop/

HDFS Disk Balancer: http://hadoop.apache.org/docs/r3.0.0-alpha1/hadoop-project-dist/hadoop-hdfs/HDFSDiskbalancer.html

 

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)