namenode は基本的にブロックを管理する単なる RPC サーバーであるHashMap
ため、2 つの主要なメモリの問題があります。
- Java
HashMap
は非常にコストがかかります。衝突の解決 (別の連鎖アルゴリズム) も同様にコストがかかります。これは、衝突した要素をリンクされたリストに格納するためです。
- RPC サーバーはリクエストを処理するためにスレッドを必要とします
dfs.namenode.service.handler.count
。Hadoopには独自の RPC フレームワークが同梱されており、デフォルトで 10 に設定されているデータノードに対してこれを構成できます。または、実行したいMapReduce ジョブなどdfs.namenode.handler.count
の他のクライアントに対してこれをJobClients
構成できます。仕事。リクエストが来て、新しいハンドラーを作成したい場合、メモリが不足する可能性があります (新しいスレッドもスタックスペースのかなりのチャンクを割り当てているため、これを増やす必要があるかもしれません)。
これらが、namenode が大量のメモリを必要とする理由です。
What determines namenode'QPS (Query Per Second) ?
私はまだそれをベンチマークしていないので、それについての良いヒントを提供することはできません. 確かに、ハンドラーを微調整すると、並列実行できるタスク数 + 投機的実行よりも多くカウントされます。ジョブの送信方法に応じて、他のプロパティも微調整する必要があります。
もちろん、完全なガベージ コレクション サイクルに陥らないように、namenode に常に十分なメモリを与える必要があります。