Taste of Tech Topics

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

OpenDaylight Helium SR3を試してみた 【OpenDaylight 「Helium」 概要編】

こんにちは、こんばんは miyakeです :-) みなさん、GWはいかがお過ごしでしたか?
私は、自転車でポタリングしたりしつつ、3/16にSR3がリリースされたOpenDaylight「Helium」のインストールをしたり、検証していました。

f:id:acro-engineer:20150506190724p:plain

そこで、GW中に色々調べたことを、3回に分けて書こうと思います :-)

 今回:OpenDaylight 「Helium」 概要編 < イマココ
 次回:OpenDaylight 「Helium」をインストールしてみよう
次々回:OpenDaylight 「Helium」でSDNを構築してみよう

今回は、OpenDaylight「Helium」の概要について説明します。

OpenDaylight「Helium」ってなに?

まずOpenDaylightですが、これはおおざっぱに言ってしまえば、オープンソースのSDNコントローラを実現するためのフレームワークになります。
OpenDaylightの開発はLinux FoundationのOpenDaylight Projectによって進められていて、2014/2/4に初のリリースとなる「Hydrogen」を公開し、2014/9/29に「Helium」を公開しています。
今回インストールや検証を行ったのは、この「Helium」の3回目のリリースバージョンである、SR3になります。

SDNコントローラとは?

SDNコントローラという言葉に馴染みのない人も多いかと思うので、ここでちょっと簡単に説明します :-)

SDN(Software Defined Network)とは、名前のごとくソフトウェア(プログラム)によって動的に設定/制御することが可能なネットワークの事であり、SDNコントローラとは、そのSDNを制御するための機能やサービスの事を指します。

従来のネットワークとSDNのどこが違うのか?というと、
従来のネットワークは、L2、L3スイッチやルータなどの装置によって構成されており、これらの装置ごとに個別に設定を行うことでネットワークが構築されていました。
ネットワークの規模がそんなに大きくなければ、今までのネットワークでも問題はなかったのですが、ネットワークを構成する装置の台数が何十台、何百台にもなる大規模ネットワークが当たり前のようになってきている今日では、装置ごとに個別に設定をしてネットワークを構築することが困難になってきました。

で、この問題を解決する方法として、SDNが生まれました。

SDNでは、今までのように、、ネットワークを構成する装置ごとに設定しなくて済むよう、SDNコントローラでネットワーク全体の設定/制御をまとめられるようにしました。
また、今までネットワーク装置側で行っていたネットワーク制御処理部分をSDNコントローラで行う様になっています。こうすることで、ネットワーク全体の制御を、SDNコントローラ内のプログラムで行えるようになります。
コントローラ側で、プログラムによってネットワークを制御しようという考え方が、「Software Defined Network」という名前の由来にもなっています。

このSDNという言葉が一般的になってきたのは、OpenFlowという仕様に準拠したネットワーク機器が出てきたころで、だいたい5年ぐらい前からになります。

次々回の「OpenDaylight 「Helium」で仮想ネットワークを構築してみよう」では、このOpenFlow仕様に準拠しているopen vSwitchとOpenDaylightを使って、実際にSDNを構築してみます :-)

OpenDaylightの概要

OpenDaylight 本家サイト
OpenDaylight | A Linux Foundation Collaborative Project

OpenDaylightの概要ですが、本家サイトのSoftware | OpenDaylightにある、以下の図にすべてが凝縮されています :-)

f:id:acro-engineer:20150510130028p:plain

この図の、「Controller Platform」の部分がコントローラの中心になるところで、ネットワークを制御するプログラムがプラグインとしてまとめられています。
プラグインを開発して「Controller Platform」に登録することで、OpenDaylightに独自のネットワーク制御処理を追加することができます。

「Southbound Interface&Protocol Plugins」の部分が、実際のネットワーク機器への制御を行うためのプラグインと、「Controller Platform」からの制御を受け付けるインタフェース(一般的にSouthbound APIと呼ばれている)を提供しています。
このProtocol Pluginも開発して登録することができるので、特殊なネットワーク機器に対応する必要が出てきた場合は、Protocol Pluginを開発することで対応することが出来るようになります。

外部からOpenDaylightに対して制御を行う場合は、OpenDaylight APIs(REST APIを通して行います。
このAPIも、必要であればプラグインとして独自APIを追加できるようになっています。

OpenDaylightは、SDNコントローラを実現するために必要なフレームワークプラグインを提供しており、これらを用いて、自分たちの目的に合ったSDNコントローラを実現することができます。

なお、OpenDaylightフレームワークプラグイン機能にはOSGiが使用されており、現バージョンの「Helium」では「Apache Karaf」が使用されています。karaf.apache.org

「Helium」で変わったこと

OpenDaylightの情報をWeb上で調べる時、最初にリリースされた「Hydrogen」と「Helium」の違いを知っていると色々便利なので、「Hydrogen」から「Helium」になって、大きく変わった点について簡単にまとめてみました。

リリースイメージが一本化された

「Hydrogen」では、利用ケースに合わせて以下の3つのリリースイメージがリリースされていました。

  1. 個人や学術機関向けの「Base Edition」
  2. データセンター向けの「Virtualization Edition」
  3. 通信事業者やサービス事業者向けの「Service Provider Edition」

「Helium」からは、1つのリリースイメージに統一され、必要な機能(Feature)を選んでインストールする仕様に変わりました。

OSGiフレームワークがKarafに変更された

「Hydrogen」では、OSGiフレームワークに「Apache Felix Framework+Eclipse Equinox」が使用されていましたが、「Helium」から「Apach Karaf」に変更されました。
Eclipse Equinoxは、Javaプログラム開発でおなじみの、Eclipse内のプラグイン機構のフレームワークです :-)

GUIがDULXに変更された

「Helium」から、GUIが「DLUX」に変更され、「Hydrogen」のGUIから大きな変更がありました。
以下が、「DLUX」で表示されたネットワーク構成図です。
f:id:acro-engineer:20150506184659j:plain
「Hydrogen」のものと比べると、まだ発展途上な感じで、今後の機構拡張に期待です。

その他注意点など

OpenDaylight「Helium」のインストールなどを行う上で注意する点について、簡単にまとめました。

Java8に対応していない

OpenDaylight「Helium」SR3をインストールする際、Java8への対応状況を確認したところ、まだJava8では動作しませんでした。
「Apach Karaf」の3.0.1は、すでにJava8に対応しているで、OpenDaylightのコア部分の問題だと思われます。

以下が実際に実行した時の出力で、無条件にMaxPermSizeを設定して起動していることが原因の警告が出ています。
起動スクリプト自体、まだJava8に対応していないことがこれでわかります。

[miyake@centos7-dev opendaylight]$ ./bin/karaf
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0

    ________                       ________                .__  .__       .__     __
    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_
     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \<   |  ||  | |  |/ ___\|  |  \   __\
    /    |    \  |_> >  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  >   Y  \  |
    \_______  /   __/ \___  >___|  /_______  (____  / ____||____/__\___  /|___|  /__|
            \/|__|        \/     \/        \/     \/\/            /_____/      \/


Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown OpenDaylight.

opendaylight-user@root>list
Error executing command: java.lang.NullPointerException
opendaylight-user@root>

起動したあと、"list"コマンドを実行したらNullPointerExceptionが出るなど、正常に起動していませんでした....orz

試しにMaxPermSizeを外して起動してみたのですが、コマンドを打った段階でNullPointerExceptionになってしまった...orz

プラグイン開発の方式が色々変更されている

少し実装寄りの細かい話になってしまいますが、Helium向けにプラグインを開発する際、内部のデータモデルにアクセスするクラスライブラリのクラス名称やAPIが大きく変更されていました。
このためWeb上で公開されている、「Hydrogen」の頃に書かれているコードやサンプルはコンパイル時にエラーになるため、そのまま使用することができなくなっています。

また、OpenDaylightのプラグイン方式である、AD-SALとMD-SALの2つのうち、MD-SALへの移行が促されています。
OpenDaylight Controller:MD-SAL:Application Migration Guide - Daylight Project

これは、「Controller Platform」で提供しているモデルへのアクセス方式に統一することで、プラグイン間でデータの共有、統一がとれるようにすることを目的としているようです。
今後、独自プラグインを開発する際は、MD-SAL方式で開発することが必要とされると思われます。


次回は、OpenDaylight Helium SR3のインストール手順などを説明します :-)
それでは。

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


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

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

Marionette.js 2.4 で AppRouter を使う方法

こんにちは。masudaです。

今日はBackbone.js 上のフレームワークであるMarionette.jsについて
小ネタを書こうと思います。

f:id:acro-engineer:20150421200915p:plain


最近、仕事でお世話になることが多いMarionette.jsですが、
Marionette.jsの公式ドキュメントを確認していたところ
Marionette.Controllerがdeprecatedとなっていました。

Warning: deprecated. The Controller object is deprecated. Instead of using the Controller
class with the AppRouter, you should specify your callbacks on a plain Javascript object.

http://marionettejs.com/docs/v2.4.1/marionette.controller.html


ControllerはMarionette.AppRouterの処理を呼び出す為のモジュールだから、
AppRouterも使用しないということですかね?

でも、AppRouterはdeprecatedになっていませんね。


web上のサンプル実装を見ても探した限りでは
Marionette.Controllerを使用しているものがほとんどで、
よくわからないので調べました。


結論としては、JavaScriptのObjectを使用する」が正しいようです。

確かに、上述の警告文にも、よくよく見ると、書いてますね^^;


AppRouterのサンプルでも、その通りになっています。

var someController = {
  someMethod: function(){ /*...*/ }
};

Backbone.Marionette.AppRouter.extend({
  controller: someController
});

http://marionettejs.com/docs/v2.4.1/marionette.approuter.html


Controllerがdeprecatedになった経緯は以下ではないかと思います。

  1. 2.1以前には、Marionete.Controllerが存在していたが、MVCフレームワークのControllerと異なる使い方であり紛らわしかった。
  2. 2.1以降では、Marionette.Object が導入され、Controllerの代わりに使うようになった。
  3. 結果的に、Marionete.ControllerがAppRouter呼び出しだけに使用するものになったため、2.4でdeprecatedにした。

Prior Usage

Before Marionette 2.1, the Controller had another use, which was a general-purpose, white-label object. This was confusing given its other use within the Router, and its name, which carries so much meaning in the context of MVC frameworks.

As of v2.1, a new Class is available for your use: Marionette.Object. We recommend using Marionette.Object instead of Marionette.Controller in all situations outside of the Router.

http://marionettejs.com/docs/v2.4.1/marionette.controller.html

Marionette.js 2.4 以降を使う皆さんは、注意してください。

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

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

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

Java Day Tokyo 2015に参加してきました。

Java Day Tokyo 2015 に参加してきました!!

みなさん、こんばんは。
fujiiです。

4/8(水) にJava Day Tokyo 2015に参加してきました。

f:id:acro-engineer:20150408084632j:plain

今年は、Java 20周年 ということもあり、イベントが多かった印象です。


簡単ですが、Java Day Tokyo 2015 の様子を紹介していきたいと思います♪

Keynote

f:id:acro-engineer:20150408085724j:plain

Java8の機能説明や、Javaの展望、デモなど、何人かのスピーカーが交代しながら、説明していました。
JDK 9 は来年リリース予定のようですね。

f:id:acro-engineer:20150408095105j:plain

JavaOneでも紹介されていたJava Car も説明してもらえました。
IoTデバイスが組み込まれた車がサーバと連携して、車を制御してくれるとのことです。

自分の車がJavaで制御されていると、改造したくなりそうです(^O^)

f:id:acro-engineer:20150408093014j:plain

Java SDK for Pepperが出るということで、Pepperも登場しました!!

ますます、Pepperが欲しくなりますね!

■セッション

Java8やJavaEEを中心に話を聞いてきました♪

セッションの詳細については、Twitterやブログを見れば、だいたい紹介されているので、詳細は割愛します。

f:id:acro-engineer:20150408153755j:plain

当社の谷本も、

人気番組との戦い! Javaシステムのパフォーマンス・チューニング奮闘記

というテーマで発表させていただきました!!


■セッションの裏でも

セッションの裏でも企画がありました。

f:id:acro-engineer:20150410031901j:plain

NIGHT HACKINGの収録では、

・末永恭正氏
鈴木雄介
・岩崎浩文氏

といったJava会の著名人に加え、当社の谷本もインタビューを受けました!


Java Day Tokyo 2015 | NightHacking


f:id:acro-engineer:20150408143823j:plain

こちらは、O'REILLY本の販売コーナー。

f:id:acro-engineer:20150410033255j:plain

本日、4/10(金)発売の「Javaパフォーマンス」本の先行販売も行われており、
監訳者の寺田佳央氏と当社の谷本が買ってくれた人に、
サインをするサービスもありました!!

もちろん、私もサインをもらいました^^;


また、中身が豊富・解説が詳細で、すべてのJavaエンジニアにオススメの一冊です。

Amazon.co.jp: Javaパフォーマンス: Scott Oaks, アクロクエストテクノロジー株式会社(監訳), 寺田 佳央(監訳), 牧野 聡: 本



Java 20周年記念セッション

f:id:acro-engineer:20150408175505j:plain

最後は、Java 20周年記念セッション!


Javaに関するクイズ大会で盛り上がってきました。



他のセッションも含め、盛り沢山な内容でした。


次回も是非、行きたいと思います♪

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


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

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

3分でできる!Google CodeからGitHubへの移行

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

f:id:acro-engineer:20150407062904p:plain

先日、Google Codeが2016年1月に閉鎖されると発表されました。
長年使っており残念だ、と言う方もいらっしゃると思いますが、時代の流れでしょうか。
Google Codeにホスティングしている方は、忘れないうちにGitHub等への移行が必要です。

幸いにもツールが用意されているため、いくつかの制約を許容すれば、3分で移行できます
そこで、今回はGoogle Code上のコードをGitHubへ移行してみましょう。

実際に、移行してみましょう

ここでは、Google Codeにある「mibible」というプロジェクトを例に説明します。
事前に、Google Code、GitHubにログインしているものとします。

それではまず、移行したいGoogle Codeのページに行きましょう。
すると、「Export to GitHub」というボタンが表示されています。これを押しましょう。
f:id:acro-engineer:20150407064304j:plain


簡単な説明画面に遷移するため、ここで「Start Export」を押しましょう。
f:id:acro-engineer:20150407064311j:plain


GitHub側の認証画面が表示されますので、「Authorize application」を押しましょう。
f:id:acro-engineer:20150407064713j:plain


確認画面が表示されます。「Confirm」を押しましょう。
f:id:acro-engineer:20150407064719j:plain


Google CodeからGitHubへの移行が開始されます。
f:id:acro-engineer:20150407064335j:plain


しばらく待てば、完了します。
f:id:acro-engineer:20150407064344j:plain


GitHubを覗いてみると、、、おっ移行できてますね。
f:id:acro-engineer:20150407064359j:plain

とても、簡単に移行できました。
巨大なプロジェクトでもなければ、時間的にも3分あれば移行できると思います。

制約について

とても簡単に移行できましたが、制約もあります。
気付いた点を記しておきます。

  • 一部の文字が、文字化けした
  • GitHubのコミット者はGoogle Code側のアカウント名になる
  • issuesの作成者は「GoogleCodeExporter」になる。

上記は移行データだけの問題ですので、そのあとGitHubで作業を進める上では問題ありません。
Google Codeのアカウント名と、GitHubのアカウント名が異なる場合は、ちょっと残念ですが。


それではまた、OSSライフを楽しんでください~

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


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

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

ENdoSnipe5.2の新機能紹介

f:id:acro-engineer:20150218031813p:plain

こんにちは、fujiiです。


かれこれ1年ぶりになりましたが、ENdoSnipeをバージョンアップし、ver5.2をリリースしました!
そこで今回はENdoSnipe5.2の新機能を紹介したいと思います。
おっと、その前に「ENdoSnipeって何?」という方は、技術評論社さんのサイトの連載を読んで、ENdoSnipeについて復習しましょう!


今回のリリースはDashboard機能の強化をメインに行っています。


それでは、さっそく紹介していきますね。

グラフ機能強化

グラフ機能を強化し、グラフを任意にカスタマイズできるようになりました。

ツリーの任意の要素を右クリックし、「Add Multiple Resource Graph」
というメニューを選ぶことで、グラフの追加ができます。

f:id:acro-engineer:20150218025558p:plain

表示する系列を指定する方法には、系列指定(Graph Selection)正規表現指定(Regular Expression)の2つがあります。

系列指定では、表示されている任意のグラフを選択し、好きなグラフを作ることができます。

正規表現指定では、正規表現で系列の指定ができます。

f:id:acro-engineer:20150215232010p:plain

サマリしたいグラフが複数あるときには、正規表現で指定する方が便利ですね。

閾値判定機能

ENdoSnipeで取得したデータをグラフにするだけでなく、予め設定した閾値を超えたことをシグナルとして表示する機能を追加しました。

ツリーの任意の要素を右クリックし、「Add Signal」
というメニューを選ぶことで、設定ができます。

シグナルの種類は、3段階(3Level)と5段階(5Level)の2種類から選ぶことができ、
設定した閾値を超えるごとに、

(緑)→黄→(橙)

のように色が変わります。

f:id:acro-engineer:20150218030934p:plain


設定が完了すると、ツリーにシグナルが生成され、
閾値を超えると色が変わるようになります。

f:id:acro-engineer:20150218025439p:plain


シグナルを作っておくと、グラフを開かなくても、
問題のあるリソースを見ることができるので、便利ですね。

Dashboard

これまでに作成したグラフやシグナルをダッシュボードで表示できるようになりました。

画面右上の「Dashboard」ボタンを押すと、Dashboardが表示されます。

f:id:acro-engineer:20150216073214p:plain


デフォルトでは、以下を確認できるテンプレートを用意しています。

  1. システムのリソース使用状況
  2. Javaプロセスのリソース使用状況
  3. Javaアプリケーションの性能
  4. Webアプリケーションの性能
  5. DBに対するアクセス状況


もちろん、表示したいグラフやシグナルを自由に配置するための編集機能もついています。

f:id:acro-engineer:20150218035717p:plain


編集機能を利用し、監視したい内容に合わせ、カスタマイズしてみてください!



今回紹介した機能の他に、ENdoSnipe5.2ではレポート機能の強化や実行計画表示機能なども行っています。


ENdoSnipeここからダウンロードできますので、是非感想等をお知らせください。

それでは。

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


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

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

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の開発に携わりたい。

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

Impalaにファイルで投入したデータはいつから検索可能になるの?

こんにちは。kimukimu(@)です。

このエントリはSpark, SQL on Hadoop etc. Advent Calendar 2014 - Qiitaの12/14分です。

多くの人がSQLなら書けるということで、
開発者でなくても自在に検索を定義可能なSQL on Hadoopが今非常に広まりつつあります。
私はそんなSQL on Hadoopの中でImpalaを今使用しているため、Impalaについて書かせていただきますね。
f:id:acro-engineer:20141209070857j:plain

Impalaをデータの集計で使用しているのですが、
その際に「元々存在しているテーブルにデータをファイルで投入する」ことがあります。


ですが、ファイル投入後クエリを実行してみても投入した結果が表示されないことがありました。
かつ、Impalaのサイトを見てもどのタイミングでデータが検索可能になるか、は明確には見つからないんですよね・・・

そのため、「Impalaにファイルで投入したデータはいつから検索可能になるの?」が
気になったので確認してみました。

1.前提環境

今回の確認は下記の環境で確認しています。

  • CDH 5.2.0(Cloudera Managerで構築、完全分散モード)
  • CentOS 6.6

Cloudera Managerを使うとHadoopクラスタ構築が本当に楽になりますね。

2.使用するファイル

実際に投入して確認してみるファイルの内容は下記です。

いつから検索可能になるかを確認できればいい、ということと、
あとは確認をわかりやすくするため、各ファイルには必要最小限のデータのみ定義しています。
■201412141000.csv

2014-12-14 10:00:00,Record1,100,12.34,Record1 Comment

■201412141100.csv

2014-12-14 11:00:00,Record2,200,34.56,Record2 Comment

■201412141200.csv

2014-12-14 12:00:00,Record3,300,45.67,Record3 Comment

■201412141300.csv

2014-12-14 13:00:00,Record4,400,56.78,Record4 Comment

2.ファイル投入後の表示タイミング確認パターン

Impalaに対してファイルで投入したテーブルの内容を表示するための関連オペレーションとして、
下記の4つの処理があります。

  1. Impalaにテーブル(EXTERNAL TABLE)を定義する。
  2. 定義したテーブルに対してクエリを発行し、結果を表示する。
  3. ファイルを投入する。
  4. ファイルを削除する。

すると、ざっと考えて下記くらいのパターンが挙げられると思います。
ファイル追加/ファイル削除の順番入れ替えはパターンも多くなるので省きます。

  • A.テーブル定義→クエリ発行(1→2、基本)
  • B.テーブル定義→ファイル追加→クエリ発行(1→3→2)
  • C.テーブル定義→クエリ発行→ファイル追加→クエリ発行(1→2→3→2)
  • D.テーブル定義→ファイル削除→クエリ発行(1→4→2)
  • E.テーブル定義→クエリ発行→ファイル削除→クエリ発行(1→2→4→2)
  • F.テーブル定義→ファイル追加&削除→クエリ発行(1→3&4→2)
  • G.テーブル定義→クエリ発行→ファイル追加&削除→クエリ発行(1→2→3&4→2)

3.確認結果

では各パターン毎に実際に実行してみて結果がどうなるかを確認してみます。
まず下準備としてimpalaユーザの操作可能なディレクトリ上に先ほど定義したファイルを配置します。
その上でHDFS上にImpalaがアクセス可能な下記のディレクトリを作成しておきます。

/ImpalaTest/TestPattern1
/ImpalaTest/TestPattern2
/ImpalaTest/TestPattern3
/ImpalaTest/TestPattern4
/ImpalaTest/TestPattern5
/ImpalaTest/TestPattern6
/ImpalaTest/TestPattern7

結果上では通常のLinux impalaユーザのコマンドを「>」、impala-shellからの実行コマンドを「[impala:21000] >」と記述しています。
また、impala-shellからimpala-daemonへの接続といった共通コマンドや、冗長な記述は省いています。

3-A.テーブル定義→クエリ発行(1→2、基本)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern1
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_1(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern1';
[impala:21000] > select * from test_pattern_1 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

データを投入してからテーブルを定義し、クエリを発行するという基本パターンですので、当然のことながら全データが表示されます。

3-B.テーブル定義→ファイル追加→クエリ発行(1→3→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern2
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern2
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_2(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern2';
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern2
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern2
[impala:21000] > select * from test_pattern_2 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

テーブル定義後にファイルを追加した場合でも、クエリを発行する前に追加しておけば追加結果が反映されることがわかります。

3-C.テーブル定義→クエリ発行→ファイル追加→クエリ発行(1→2→3→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern3
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern3
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_3(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern3';
[impala:21000] > select * from test_pattern_3 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern3
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern3
[impala:21000] > select * from test_pattern_3 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

テーブル定義後、クエリを実行した後にファイルを追加した場合は追加結果はそのままでは反映されないようです。
そのため、クエリ初回実行時に実際に検索対象となるデータに対して何かしらのインデックス処理のようなものを施している・・?
尚、これは1日たっても結果はそのままでしたので、タイミング問題、というわけでもないようです。

3-D.テーブル定義→ファイル削除→クエリ発行(1→4→2)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern4
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_4(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern4';
> hadoop fs -rm /ImpalaTest/TestPattern4/201412141300.csv
[impala:21000] > select * from test_pattern_4 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

削除についても追加と同じく、テーブル定義後クエリ発行前に実施しておけば反映されるようです。

3-E.テーブル定義→クエリ発行→ファイル削除→クエリ発行(1→2→4→2)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern5
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_5(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern5';
[impala:21000] > select * from test_pattern_5 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -rm /ImpalaTest/TestPattern5/201412141200.csv
> hadoop fs -rm /ImpalaTest/TestPattern5/201412141300.csv
[impala:21000] > select * from test_pattern_5 ORDER BY record_time;
WARNINGS: Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern5/201412141200.csv
Error(2): No such file or directory
Backend 1:Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern5/201412141200.csv
Error(2): No such file or directory

クエリを実行した後にファイルを削除した場合、その後再度クエリを実行するとファイルが存在しない旨のエラーとなります。
結果も表示されませんでした。
やはりクエリの初回実行時にファイル単位のインデックス作成に近いものを行っていて、
以後クエリを実行した場合はそのインデックスにそって検索を行うようです。

・・と、とりあえずここまでで大体動きの予測はつきますが、念のため追加と削除を両方行うパターンについても確認しておきます。

3-F.テーブル定義→ファイル追加&削除→クエリ発行(1→3&4→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern6
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern6
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern6
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_6(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern6';
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern6
> hadoop fs -rm /ImpalaTest/TestPattern6/201412141200.csv
[impala:21000] > select * from test_pattern_6 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

予想通り、ではありますが、クエリを初回実行前にファイルの追加削除を両方行っても問題なく検索可能です。

3-G.テーブル定義→クエリ発行→ファイル追加&削除→クエリ発行(1→2→3&4→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern7
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern7
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern7
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_7(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern7';
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern7
> hadoop fs -rm /ImpalaTest/TestPattern7/201412141200.csv
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
WARNINGS: Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern7/201412141200.csv
Error(2): No such file or directory
Backend 1:Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern7/201412141200.csv
Error(2): No such file or directory

予想通り、クエリを1回実行後にファイルの追加削除を行った場合、対応できませんでした。

4.テーブル定義後にファイルの追加削除を行った場合結果に反映させるには?

では、ファイルの追加削除を反映させるためにはどうすればいいのでしょうか。
Impalaクエリのマニュアルを見てみると「REFRESH」というコマンドがありました。
REFRESHコマンドを実行することで、追加削除の結果が反映され、現状のファイルに対して検索を行うことが可能でした。

[impala:21000] > REFRESH test_pattern_7;
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

5.確認結果まとめ

これまでの結果をまとめると下記のようになります。

  1. ImpalaはEXTERNALテーブル定義後、クエリを初回実行した際にインデックスのようなものを作成する。
  2. インデックス(?)を作成する前に行ったファイル追加削除はクエリ実行結果に反映される。
  3. インデックス(?)を作成した後に行ったファイル追加削除はクエリ実行時に反映されない。(削除の場合はエラーになる)
  4. REFRESHコマンドを実行することで現状の最新の状況にインデックス(?)が更新される。

テーブル定義後、データを投入しながらインクリメンタルにクエリを発行する場合、
データ投入時の事後処理かクエリ発行時の事前処理でREFRESHコマンドを実行すればOK
となりますね。
これで追加しながら検索、もデータ未反映を気にすることなく実行可能ですね。

小ネタでしたが、以上です。

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


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

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