Balancer を設定するためのプロパティ

# この記事について

以下のドキュメントの翻訳。

https://docs.cloudera.com/runtime/7.3.1/scaling-namespaces/topics/hdfs-properties-for-configuring-the-balancer.html

日本語の親記事はこちら⬇️

https://qiita.com/IQ_Bocchi/items/c1d3aee330f517319a4d

:::note
この書式や・・・
:::

:::note warn
この書式で書かれた文言は訳者個人のつぶやきであり、所属する組織とは関係ありません。
:::

また、読みやすさのために適宜原文にない見出しをつけています。

# 翻訳

要件に応じて、HDFS Balancer のためのさまざまなプロパティを設定することができます。

## `dfs.datanode.balance.max.concurrent.moves`

ひとつの DataNode が同時に動かせるブロックの上限値を設定します。

この設定をDataNodeに適用すると、その DataNode は上限を超えた際に例外をスローします。この設定を HDFS Balancer に適用すると、HDFS Balancer は同時に移動するブロックが設定された上限以内におさまるようにスケジューリングします。

:::note warn
これだけ読むと、この設定を DataNode に適用する意味がわからん（例外地獄になるだけでは）と思うかもですがこの謎はすぐに解けます
:::

HDFS Balancer と DataNode で異なる値を設定することもできます。

どちらの設定も制約を課すので、効率的な設定値は両者の最小値です。

:::note warn
⬆️この文は訳すとこのとおりなのですが前後の文の因果関係が謎
:::

Cloudera は、柔軟性のために、この値を **DataNode に対しては考えられる最大の値に設定し、HDFS Balancer に対する設定を実際に制約を課したい値に調整することを推奨します。**

:::note warn
⬆️これを最初に言ってくれ！！！
:::

初期値は100です。

:::note warn
⬆️この初期値が HDFS Balancer のことなのか DataNode のことなのか、両方なのか確認中
:::

### Cloudera Manager での設定方法

この設定は、DataNode の再起動なしで変更することができます。DataNode の設定を変更するためには、以下の手順に従います。

1. Cloudera Manager でHDFS サービスの設定タブから `dfs.datanode.balance.max.concurrent.moves` の値を変更する
1. クラスタをリフレッシュする

初期値の100は、多くの状況で同時に移動するブロックの上限値として使うことができます。より低い値に設定したい場合は、25から50にすることも考えられます。この値の推奨の上限値は200です。

## `dfs.datanode.balance.bandwidthPerSec`

クラスタのバランシングをする際の、各 DataNode の帯域幅を制限します。この設定を反映させるには、DataNodeの再起動が必要です。

初期値は 100 MB/秒 です。

Balancer の帯域幅を動的に変更するためには、以下のコマンドを使用します。

```
hdfs dfsadmin -setBalancerBandwidth <帯域幅（1秒あたりのバイト数）>
```

:::note warn
Cloudera Manager から設定変更した場合は DataNode の再起動が必要で、コマンドで変更した場合は再起動が不要（ということを動的と言っている？）ということなのかを確認中
:::

## `dfs.balancer.moverThreads`

クラスタ全体で同時に移動できる合計のブロック数を制限します。この値を、HDFS Balancer がブロックを移動するスレッド数として設定します。　各ブロックの移動は、ひとつのスレッドを要します。

:::note
つまりこの項目で指定した値が、クラスタ全体で同時に移動できるブロック数の上限値ということです。
:::

初期値は1000です。

## `dfs.balancer.max-size-to-move`

各イテレーションに関して、HDFS Balancer は DataNode のペア（訳注：[ソースとターゲットのペア](https://qiita.com/IQ_Bocchi/items/f683e935d36a94ab7ad7)のこと。）を選び、データをペアの間で移動します。

この項目では、選択された DataNode のペアについて、HDFS Balancer が移動できるデータの最大サイズを制限します。

ネットワークとディスクが飽和していないときにこの設定値を増やすと、イテレーションの持続時間はほぼ同じままで、イテレーションごとのDataNode間のデータ転送量を増やすことができます。

初期値は 10GB です。

## `dfs.balancer.getBlocks.size`

`getBlocks(..)` でリターンされるブロックのリストのデータサイズの合計値を指定します。

HDFS Balancer が[ソースとターゲットのDataNode](https://qiita.com/IQ_Bocchi/items/f683e935d36a94ab7ad7) 間である量のデータを移動させる際、HDFS Balancer は `getBlocks(..)` の RPC を NameNode に繰り返し投げ、ソースの DataNode のブロックのリストを取得させます。これを、必要な量のデータがスケジュールされるまで繰り返します。

初期値は 2GB です。

## `dfs.balancer.getBlocks.min-block-size`

クラスタのバランシングに利用されるブロックの最小のブロックサイズを指定します。

初期値は 10 MB です。

:::note
（ドキュメント内の注）
クラスタのブロックの大部分が10MBより小さい場合、この値により小さい値を指定してください。
なぜなら、HDFS Balancer が移動対象となるこの値より大きいブロックを十分に見つけられないからです。
:::

:::note warn
この設定が必要なそもそもの意味が知りたい。
小さいブロックをたくさん移動させるより、大きいブロックを一回移動させた方が効率がいいということだと推測。
:::

## `dfs.datanode.block-pinning.enabled`

ブロックのピン留めを有効にするかを指定します。

ファイル作成時、ユーザーアプリケーションはファイル作成APIの中で、分散ファイルシステム内でファイルを保管したい DataNode のリストを特定することができます。NameNode はベストエフォートで、ブロックをその特定された DataNode に配置しようとします。

`dfs.datanode.block-pinning.enabled` を true にすると、ブロックのレプリカがその特定された DataNode に書き込まれている場合、そのブロックはその DataNode に「ピン留め」されます。ピン留めされたレプリカは、クラスタのバランシングが起きても、その特定された DataNode にとどまり移動しません。

この機能は、HBaseのようなブロックの分散を意識したユーザーアプリケーションを利用する際に役に立ちます。

初期値は `false` です。

:::note warn
HBase の書き込みの仕組みをもっと知りたくなった。。。
:::