Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Elasticsearch設定に関する小ネタ

こんにちは、ツカノ(@)です。

この記事はElasticsearch Advent Calendar 2014の21日目です。
20日目はjtodoさんの「Spark on elasticsearch-hadoop トライアル」でした。

さて、以前、「Elasticsearchソースコードリーディング~内部構造把握の第一歩~」と題してElasticsearchのスレッド構成といった内部構造の話を書きましたが、今回もまた、似たような話です。
今回はElasticsearchの設定ファイルについてです。
f:id:acro-engineer:20140131080117p:plain

1.ノード名について

Elasticsearchのデフォルトのログフォーマットでは、ノード名が出力されます。クラスタで運用することも考えると、ノード名って重要ですよね。ノード名の設定方法については、公式ページに記載があります。
ここで面白いのが、設定を省略した場合の動きです。Marvelのキャラクター名からランダムで設定されるそうです。
githubにある設定を実際に見てみましょう。

2826個も名前が書いてあります。
ざっと見ると、Iron ManとかX-Manとかって名前がありますね。運が良ければ(?)あなたのノード名が「Iron Man」になるかもしれません。

この設定ファイルには、以下のような名前も書いてありますね。日本っぽい名前だけれど、私はMarvelは良く分からないので、Marvelの何に由来しているのか分かりません。。。

  • Kimura
  • Mariko Yashida
  • Mikado
  • Shingen Harada
  • Shirow Ishihara
  • Sushi
  • Yukio

こういうノード名が付く可能性があるんですね。

2.設定ファイルのフォーマット、読み込む順序

Elasticsearchの設定ファイルはjson形式でもyaml形式でもproperty形式でも書け、結構便利ですね。
設定ファイルも「elasticsearch.拡張子」と書いてconfigディレクトリに置けば勝手に読んでくれます。
どんな風に読み込んでいるのか気になったので、コードを読んでみました。
ElasticsearchのInternalSettingsPreparerクラスを読むと、以下のようなコードが書いてあります。

                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.yml"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                } catch (NoClassDefFoundError e) {
                    // ignore, no yaml
                }
                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.json"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                }
                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.properties"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                }

「elasticsearch.json→elasticsearch.yml→elasticsearch.properties」の順序で設定ファイルを探して、読み込んでいるんですね。
同じ設定を記述した場合は、後から記載した設定で上書きされるので、設定ファイルの優先順序は以下のようになります。

  1. elasticsearch.properties
  2. elasticsearch.json
  3. elasticsearch.yml

また、yamljsonで階層構造で設定を記述した場合は、階層を「.」でつないだ設定名になります。
例えば、json形式で以下の2つのケースは同じ設定で、Elasticsearch内部では、「node.name」として扱われます。

{
  "node" :
      { "name" : "json" }
}
{
  "node.name" : "json"
}

yaml形式で設定を記述するときも、同様に階層を「.」でつないだ設定名になります。
property形式の場合は「node.name=json」のように記載するしかないですね。

設定ファイルを記述する際の参考になればと思います。ちょっとした小ネタでした。

それではまた~

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ