SlideShare a Scribd company logo
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
2017年2月20日
1
ヤフー株式会社 データ&サイエンスソリューション統括本部
データプラットフォーム本部 開発1部 パイプライン
森谷 大輔
Elasticsearch 5.2
と Java Clientで戯れる
Elasticsearch勉強会#18 LT
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
自己紹介
• 森谷 大輔(@kokumutyoukan)
• 仕事
• 次世代データパイプラインの開発
• 1,000,000 msgs/sec
• Kafka, Storm, Cassandra, Elasticsearch
• Elasticsearch (+Kibana)はログの可視化用途
• Java Clientは初めて触ったので5.2でどう進化したかなどは今回触れない
2
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
LTの内容
• Elasticsearch 5.2 のJava Client(Bulk Processor)でログ投入して
みた
• 試した流れの要約と詰まったところ
• Elasticsearch 5.2 と Java Clientについて複合した内容
• Elasticsearch 5.2 セットアップ
• Java Client - Elasticsearchクラスタ接続設定
• 1ログを投入
• Bulk Processorで投入
3
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
なんでJava Clientでログ投入?
• Logstash や Beats は?
• 前提:自分が今回想定したユースケースはログを発するところではなく、
Kafka→Elasticsearchを中継するようなところ
• 使ったことがなかったのでこれはこれで覚える必要
• 前処理で好き勝手やりたい
• id上書きしたりタイムスタンプ補正したりKVSデータとJoinしたり
• ↑でもできるかもだけどJavaならとりあえず何でもできるでしょという感覚
4
Data Source
Data Source
Mirror Maker
こ
こ
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Elasticsearch 5.2 セットアップ
• DLページの簡単3step通りなのだけど・・・
• https://www.elastic.co/jp/downloads/elasticsearch
• 初期設定だとlocalhostからしかアクセスできないのでnetwork.hostを0.0.0.0にして立ち上げようと
するとファイルディスクリプタとメモリマップの警告でエラー
• 5系からプロダクション設定での起動チェックが厳しくなっているらしい
5
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Elasticsearch 5.2 セットアップ
• tar ballからセットアップしようとしたからあたったが、RPMからインストールすればこの辺
の設定はsystemd経由で最初から入っている
• ファイルディスクリプタの制御面倒なのでRPMからのインストールが無難
• 【一言メモ】セットアップ前にこのQiita記事を見ておくのオススメ
• http://qiita.com/uzresk/items/e0b10c14875b79c450f2
6
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
脱線:モニター
• elasticsearch-headが好きだった
• しかし5系からsite pluginが使えなくなった
• スタンドアロンで起動するしかないが
• headの場合は別にWebサーバを立てなければ使えないので面倒になった
• Cerebro(旧Kopf)に鞍替えした
• tar ball展開して bin/cerebro 実行するだけでWebサーバも一緒に立ち上げて
くれるのですごく楽
• headからの乗換感想:headでよく使ってた機能は持っているみたいだしいい
感じ、直感的ですぐ慣れた
7
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Java Client - Elasticsearchクラスタ
接続設定
• Java API説明ページを見ながら進めていく
• https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html
• まずはここから
8
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
client オブジェクトを作る
9
private TransportClient cli;
/**
* elasticsearch clientを、つくってゆきます
* @param esHost 例:es01.example.com
* @param esCliPort client受付ポートのデフォルトは9200じゃなくて9300
* @param clusterName デフォルトのelasticsearchのままになんてしないよね・・・?
*/
private void createCli(String esHost, int esCliPort, String clusterName)
throws UnknownHostException {
InetSocketTransportAddress address = new InetSocketTransportAddress(
InetAddress.getByName(esHost), esCliPort);
Settings settings = Settings.builder().put("cluster.name", clusterName).build();
cli = new PreBuiltTransportClient(settings)
.addTransportAddress(address);
//.addTransportAddresses(addresses); // 複数のホストを指定する場合ここに配列
}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
index template
• 5系では elasticsearch.yml でインデックス設定ができなくなった
• index.number_of_shards, index.number_of_replicas
• 僕「えっ?!デフォルトのシャード数とレプリカ数どうやって指定する
の?!」
• → こうする
• index templateを使う、もちろんJava Clientじゃなくてもよい
10
cli.admin().indices()
.preparePutTemplate("hogehoge-template") // 任意のテンプレート名
.setTemplate(indexPrefix + "-*") // テンプレートを有効にしたい対象のインデックス
.setSettings(Settings.builder()
.put("number_of_shards", 10)
.put("number_of_replicas", 1))
.get();
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
1ログを投入する
• client便利だと思った
• 入力に以下のどれでも選べる
• JSON文字列
• Map
• beansクラスの
Jacksonバイナリ
• Elasticsearch専用ヘルパー
• 特にMapがお手軽
11
// index名やidの準備
DateTime eventTime = new DateTime(eventTimestamp);
String indexName = indexPrefix + “-”
+ eventTime.toString(“yyyy.MM.dd”);
String id = UUID.randomUUID().toString();
// 書き込むログの準備
Map<String, Object> json = new HashMap<>();
json.put(“user”, “kokumutyoukan”);
json.put(“postDate”, new Date(eventTime.getMillis()));
json.put(“message”, "eat rice.");
// 書き込みリクエスト
IndexResponse response = cli.prepareIndex(
indexName, type, id).setSource(json).get();
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Bulk Processor
• それなりの流量でドキュメントをインデックスするならBulk API一択
• Bulk Processorはすごく直感的で良かった
12
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Bulk Processor
13
BulkProcessor bp = BulkProcessor.builder(cli, new BulkProcessor.Listener() {
@Override
public void beforeBulk(long l, BulkRequest bulkRequest) {
System.out.println(“bulkRequest = ” + bulkRequest.numberOfActions()); // 何リクエスト今からbulk書き込みします
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) {
// hasFailuresだから失敗したときにtrueであることに注意.
System.out.println(“bulkResponse = ” + bulkResponse.hasFailures()
+ “ ” + bulkResponse.buildFailureMessage()); // 失敗内容
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) {
throwable.printStackTrace();
}
}).setBulkActions(10000) // 1万リクエストたまったらbulk書き込み
.setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) // 5MBたまったらbulk書き込み
.setFlushInterval(TimeValue.timeValueSeconds(5)) // 5秒たまったらbluk書き込み
.setConcurrentRequests(1) // bulk書き込みの並列度、1なら2並列
.build();
for (NanikaEvent event : NanikaStream stream) {
Map<String, Object> json = event2Map(event);
bp.add(new IndexRequest(indexName, type, id).source(json));
}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
Bulk Processor
14
BulkProcessor bp = BulkProcessor.builder(cli, new BulkProcessor.Listener() {
@Override
public void beforeBulk(long l, BulkRequest bulkRequest) {
System.out.println(“bulkRequest = ” + bulkRequest.numberOfActions()); // 何リクエスト今からbulk書き込みします
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) {
// hasFailuresだから失敗したときにtrueであることに注意.
System.out.println(“bulkResponse = ” + bulkResponse.hasFailures()
+ “ ” + bulkResponse.buildFailureMessage()); // 失敗内容
}
@Override
public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) {
throwable.printStackTrace();
}
}).setBulkActions(10000) // 1万リクエストたまったらbulk書き込み
.setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) // 5MBたまったらbulk書き込み
.setFlushInterval(TimeValue.timeValueSeconds(5)) // 5秒たまったらbluk書き込み
.setConcurrentRequests(1) // bulk書き込みの並列度、1なら2並列
.build();
for (NanikaEvent event : NanikaStream stream) {
Map<String, Object> json = event2Map(event);
bp.add(new IndexRequest(indexName, type, id).source(json));
}
Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.
まとめ
• Elasticsearch 5.2 いくつか引っかかるところもあった
• Java Client初めて使ったけど使い勝手が良かった
• 自力でBulkのHTTPリクエスト生成するよりはずっといい
• Bulk Processorは特に良かった
15
Ad

Recommended

ニュースアプリで起きた不具合から学んだ 最適への一歩
ニュースアプリで起きた不具合から学んだ 最適への一歩
Yahoo!デベロッパーネットワーク
 
Storm の新機能について @HSCR #hadoopreading
Storm の新機能について @HSCR #hadoopreading
Yahoo!デベロッパーネットワーク
 
JavaOne2017参加報告 Microservices topic & approach #jjug
JavaOne2017参加報告 Microservices topic & approach #jjug
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのOracle構成-2017年版
Yahoo! JAPANのOracle構成-2017年版
Yahoo!デベロッパーネットワーク
 
大規模運用で見えるWebプロトコルの理想と現実、そして今後 #html5j #html5j_b
大規模運用で見えるWebプロトコルの理想と現実、そして今後 #html5j #html5j_b
Yahoo!デベロッパーネットワーク
 
Design pattern in presto source code
Design pattern in presto source code
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT⑦
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT⑦
Yahoo!デベロッパーネットワーク
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo!デベロッパーネットワーク
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのOSS Cassandra貢献の今までとこれから
Yahoo! JAPANのOSS Cassandra貢献の今までとこれから
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージ
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
 
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT①
Yahoo!デベロッパーネットワーク
 
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
Yahoo!デベロッパーネットワーク
 
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Yahoo!デベロッパーネットワーク
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
 
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
AMPと広告とOpenRTBと #yjmu
AMPと広告とOpenRTBと #yjmu
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT③
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT③
Yahoo!デベロッパーネットワーク
 
20140120 presto meetup
20140120 presto meetup
Ogibayashi
 
GCP vs 他社クラウド
GCP vs 他社クラウド
Hasegawa Yusuke
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo!デベロッパーネットワーク
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
Elastic searchをrailsから使ってみた
Elastic searchをrailsから使ってみた
Yoichi Toyota
 

More Related Content

What's hot (20)

Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT⑦
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT⑦
Yahoo!デベロッパーネットワーク
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo!デベロッパーネットワーク
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのOSS Cassandra貢献の今までとこれから
Yahoo! JAPANのOSS Cassandra貢献の今までとこれから
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるフラッシュストレージ
ヤフーを支えるフラッシュストレージ
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
 
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT①
Yahoo!デベロッパーネットワーク
 
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
Yahoo!デベロッパーネットワーク
 
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Kafka・Storm・ZooKeeperの認証と認可について #kafkajp
Yahoo!デベロッパーネットワーク
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
 
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
AMPと広告とOpenRTBと #yjmu
AMPと広告とOpenRTBと #yjmu
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT③
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)LT③
Yahoo!デベロッパーネットワーク
 
20140120 presto meetup
20140120 presto meetup
Ogibayashi
 
GCP vs 他社クラウド
GCP vs 他社クラウド
Hasegawa Yusuke
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo!デベロッパーネットワーク
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo!デベロッパーネットワーク
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
ヤフーのロギングSDKの挑戦〜データドリブン企業を目指して〜 #yjdsnight
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
 
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Dataworks Summit SJ QueryEngine - Hadoop Source Code Reading #23 #hadoopreading
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション②
Yahoo!デベロッパーネットワーク
 
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
プランニングツールにおけるインタラクティブな可視化を支えるバックエンド
Yahoo!デベロッパーネットワーク
 
20140120 presto meetup
20140120 presto meetup
Ogibayashi
 
GCP vs 他社クラウド
GCP vs 他社クラウド
Hasegawa Yusuke
 
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo! JAPANのプライベートRDBクラウドとマルチライター型 MySQL #dbts2017 #dbtsOSS
Yahoo!デベロッパーネットワーク
 

Similar to Elasticsearch 5.2とJava Clientで戯れる #elasticsearchjp (20)

Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
Elastic searchをrailsから使ってみた
Elastic searchをrailsから使ってみた
Yoichi Toyota
 
言語アップデート -Scala編-
言語アップデート -Scala編-
Kota Mizushima
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
 
Lucandraを使ってみる
Lucandraを使ってみる
Fumihiko Sato
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみた
furandon_pig
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Kentaro Yoshida
 
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
S. T.
 
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
VirtualTech Japan Inc.
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
Naoyuki Yamada
 
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
SORACOM,INC
 
SolidFire を Kibana(ELK Stack)で可視化(需要予測)する
SolidFire を Kibana(ELK Stack)で可視化(需要予測)する
Kensuke Maeda
 
メディアコンテンツ向け記事検索DBとして使うElasticsearch
メディアコンテンツ向け記事検索DBとして使うElasticsearch
Yasuhiro Murata
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
朋哉 池田
 
polidog に elasticsearch を教える
polidog に elasticsearch を教える
ftnk
 
JJUG CCC リクルートの Java に対する取り組み
JJUG CCC リクルートの Java に対する取り組み
Recruit Technologies
 
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
Kentaro Yoshida
 
elasticsearchプラグイン入門
elasticsearchプラグイン入門
Shinsuke Sugaya
 
20200324 ms open-tech-elastic
20200324 ms open-tech-elastic
Koji Kawamura
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
Amazon Web Services Japan
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
Jun Ohtani
 
Elastic searchをrailsから使ってみた
Elastic searchをrailsから使ってみた
Yoichi Toyota
 
言語アップデート -Scala編-
言語アップデート -Scala編-
Kota Mizushima
 
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
 
Lucandraを使ってみる
Lucandraを使ってみる
Fumihiko Sato
 
elasticsearchソースコードを読みはじめてみた
elasticsearchソースコードを読みはじめてみた
furandon_pig
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Kentaro Yoshida
 
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
S. T.
 
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
VirtualTech Japan Inc.
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
Naoyuki Yamada
 
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
IoT と時系列データと Elasticsearch | Data Pipeline Casual Talk Vol.4
SORACOM,INC
 
SolidFire を Kibana(ELK Stack)で可視化(需要予測)する
SolidFire を Kibana(ELK Stack)で可視化(需要予測)する
Kensuke Maeda
 
メディアコンテンツ向け記事検索DBとして使うElasticsearch
メディアコンテンツ向け記事検索DBとして使うElasticsearch
Yasuhiro Murata
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
朋哉 池田
 
polidog に elasticsearch を教える
polidog に elasticsearch を教える
ftnk
 
JJUG CCC リクルートの Java に対する取り組み
JJUG CCC リクルートの Java に対する取り組み
Recruit Technologies
 
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
Kentaro Yoshida
 
elasticsearchプラグイン入門
elasticsearchプラグイン入門
Shinsuke Sugaya
 
20200324 ms open-tech-elastic
20200324 ms open-tech-elastic
Koji Kawamura
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
Amazon Web Services Japan
 
Ad

More from Yahoo!デベロッパーネットワーク (20)

ゼロから始める転移学習
ゼロから始める転移学習
Yahoo!デベロッパーネットワーク
 
継続的なモデルモニタリングを実現するKubernetes Operator
継続的なモデルモニタリングを実現するKubernetes Operator
Yahoo!デベロッパーネットワーク
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
Yahoo!デベロッパーネットワーク
 
LakeTahoe
LakeTahoe
Yahoo!デベロッパーネットワーク
 
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
オンプレML基盤on Kubernetes 〜Yahoo! JAPAN AIPF〜
Yahoo!デベロッパーネットワーク
 
Persistent-memory-native Database High-availability Feature
Persistent-memory-native Database High-availability Feature
Yahoo!デベロッパーネットワーク
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
eコマースと実店舗の相互利益を目指したデザイン #yjtc
eコマースと実店舗の相互利益を目指したデザイン #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
ビッグデータから人々のムードを捉える #yjtc
ビッグデータから人々のムードを捉える #yjtc
Yahoo!デベロッパーネットワーク
 
サイエンス領域におけるMLOpsの取り組み #yjtc
サイエンス領域におけるMLOpsの取り組み #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo! JAPAN Tech Conference 2022 Day2 Keynote #yjtc
Yahoo!デベロッパーネットワーク
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
「新しいおうち探し」のためのAIアシスト検索 #yjtc
「新しいおうち探し」のためのAIアシスト検索 #yjtc
Yahoo!デベロッパーネットワーク
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
ヤフーでは開発迅速性と品質のバランスをどう取ってるか
Yahoo!デベロッパーネットワーク
 
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
データの価値を最大化させるためのデザイン~データビジュアライゼーションの方法~ #devsumi 17-E-2
Yahoo!デベロッパーネットワーク
 
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
ヤフーを支えるセキュリティ ~サイバー攻撃を防ぐエンジニアの仕事とは~ #yjtc
Yahoo!デベロッパーネットワーク
 
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
Yahoo!デベロッパーネットワーク
 
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
新技術を使った次世代の商品の見せ方 ~ヤフオク!のマルチビュー機能~ #yjtc
Yahoo!デベロッパーネットワーク
 
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
PC版Yahoo!メールリニューアル ~サービスのUI/UX統合と改善プロセス~ #yjtc
Yahoo!デベロッパーネットワーク
 
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
モブデザインによる多職種チームのコミュニケーション改善 #yjtc
Yahoo!デベロッパーネットワーク
 
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
ユーザーの地域を考慮した検索入力補助機能の改善の試み #yjtc
Yahoo!デベロッパーネットワーク
 
Ad

Elasticsearch 5.2とJava Clientで戯れる #elasticsearchjp

  • 1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 2017年2月20日 1 ヤフー株式会社 データ&サイエンスソリューション統括本部 データプラットフォーム本部 開発1部 パイプライン 森谷 大輔 Elasticsearch 5.2 と Java Clientで戯れる Elasticsearch勉強会#18 LT
  • 2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自己紹介 • 森谷 大輔(@kokumutyoukan) • 仕事 • 次世代データパイプラインの開発 • 1,000,000 msgs/sec • Kafka, Storm, Cassandra, Elasticsearch • Elasticsearch (+Kibana)はログの可視化用途 • Java Clientは初めて触ったので5.2でどう進化したかなどは今回触れない 2
  • 3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. LTの内容 • Elasticsearch 5.2 のJava Client(Bulk Processor)でログ投入して みた • 試した流れの要約と詰まったところ • Elasticsearch 5.2 と Java Clientについて複合した内容 • Elasticsearch 5.2 セットアップ • Java Client - Elasticsearchクラスタ接続設定 • 1ログを投入 • Bulk Processorで投入 3
  • 4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. なんでJava Clientでログ投入? • Logstash や Beats は? • 前提:自分が今回想定したユースケースはログを発するところではなく、 Kafka→Elasticsearchを中継するようなところ • 使ったことがなかったのでこれはこれで覚える必要 • 前処理で好き勝手やりたい • id上書きしたりタイムスタンプ補正したりKVSデータとJoinしたり • ↑でもできるかもだけどJavaならとりあえず何でもできるでしょという感覚 4 Data Source Data Source Mirror Maker こ こ
  • 5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Elasticsearch 5.2 セットアップ • DLページの簡単3step通りなのだけど・・・ • https://www.elastic.co/jp/downloads/elasticsearch • 初期設定だとlocalhostからしかアクセスできないのでnetwork.hostを0.0.0.0にして立ち上げようと するとファイルディスクリプタとメモリマップの警告でエラー • 5系からプロダクション設定での起動チェックが厳しくなっているらしい 5 max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
  • 6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Elasticsearch 5.2 セットアップ • tar ballからセットアップしようとしたからあたったが、RPMからインストールすればこの辺 の設定はsystemd経由で最初から入っている • ファイルディスクリプタの制御面倒なのでRPMからのインストールが無難 • 【一言メモ】セットアップ前にこのQiita記事を見ておくのオススメ • http://qiita.com/uzresk/items/e0b10c14875b79c450f2 6
  • 7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 脱線:モニター • elasticsearch-headが好きだった • しかし5系からsite pluginが使えなくなった • スタンドアロンで起動するしかないが • headの場合は別にWebサーバを立てなければ使えないので面倒になった • Cerebro(旧Kopf)に鞍替えした • tar ball展開して bin/cerebro 実行するだけでWebサーバも一緒に立ち上げて くれるのですごく楽 • headからの乗換感想:headでよく使ってた機能は持っているみたいだしいい 感じ、直感的ですぐ慣れた 7
  • 8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Java Client - Elasticsearchクラスタ 接続設定 • Java API説明ページを見ながら進めていく • https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/index.html • まずはここから 8 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency>
  • 9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. client オブジェクトを作る 9 private TransportClient cli; /** * elasticsearch clientを、つくってゆきます * @param esHost 例:es01.example.com * @param esCliPort client受付ポートのデフォルトは9200じゃなくて9300 * @param clusterName デフォルトのelasticsearchのままになんてしないよね・・・? */ private void createCli(String esHost, int esCliPort, String clusterName) throws UnknownHostException { InetSocketTransportAddress address = new InetSocketTransportAddress( InetAddress.getByName(esHost), esCliPort); Settings settings = Settings.builder().put("cluster.name", clusterName).build(); cli = new PreBuiltTransportClient(settings) .addTransportAddress(address); //.addTransportAddresses(addresses); // 複数のホストを指定する場合ここに配列 }
  • 10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. index template • 5系では elasticsearch.yml でインデックス設定ができなくなった • index.number_of_shards, index.number_of_replicas • 僕「えっ?!デフォルトのシャード数とレプリカ数どうやって指定する の?!」 • → こうする • index templateを使う、もちろんJava Clientじゃなくてもよい 10 cli.admin().indices() .preparePutTemplate("hogehoge-template") // 任意のテンプレート名 .setTemplate(indexPrefix + "-*") // テンプレートを有効にしたい対象のインデックス .setSettings(Settings.builder() .put("number_of_shards", 10) .put("number_of_replicas", 1)) .get();
  • 11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 1ログを投入する • client便利だと思った • 入力に以下のどれでも選べる • JSON文字列 • Map • beansクラスの Jacksonバイナリ • Elasticsearch専用ヘルパー • 特にMapがお手軽 11 // index名やidの準備 DateTime eventTime = new DateTime(eventTimestamp); String indexName = indexPrefix + “-” + eventTime.toString(“yyyy.MM.dd”); String id = UUID.randomUUID().toString(); // 書き込むログの準備 Map<String, Object> json = new HashMap<>(); json.put(“user”, “kokumutyoukan”); json.put(“postDate”, new Date(eventTime.getMillis())); json.put(“message”, "eat rice."); // 書き込みリクエスト IndexResponse response = cli.prepareIndex( indexName, type, id).setSource(json).get();
  • 12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Bulk Processor • それなりの流量でドキュメントをインデックスするならBulk API一択 • Bulk Processorはすごく直感的で良かった 12
  • 13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Bulk Processor 13 BulkProcessor bp = BulkProcessor.builder(cli, new BulkProcessor.Listener() { @Override public void beforeBulk(long l, BulkRequest bulkRequest) { System.out.println(“bulkRequest = ” + bulkRequest.numberOfActions()); // 何リクエスト今からbulk書き込みします } @Override public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { // hasFailuresだから失敗したときにtrueであることに注意. System.out.println(“bulkResponse = ” + bulkResponse.hasFailures() + “ ” + bulkResponse.buildFailureMessage()); // 失敗内容 } @Override public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) { throwable.printStackTrace(); } }).setBulkActions(10000) // 1万リクエストたまったらbulk書き込み .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) // 5MBたまったらbulk書き込み .setFlushInterval(TimeValue.timeValueSeconds(5)) // 5秒たまったらbluk書き込み .setConcurrentRequests(1) // bulk書き込みの並列度、1なら2並列 .build(); for (NanikaEvent event : NanikaStream stream) { Map<String, Object> json = event2Map(event); bp.add(new IndexRequest(indexName, type, id).source(json)); }
  • 14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Bulk Processor 14 BulkProcessor bp = BulkProcessor.builder(cli, new BulkProcessor.Listener() { @Override public void beforeBulk(long l, BulkRequest bulkRequest) { System.out.println(“bulkRequest = ” + bulkRequest.numberOfActions()); // 何リクエスト今からbulk書き込みします } @Override public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { // hasFailuresだから失敗したときにtrueであることに注意. System.out.println(“bulkResponse = ” + bulkResponse.hasFailures() + “ ” + bulkResponse.buildFailureMessage()); // 失敗内容 } @Override public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) { throwable.printStackTrace(); } }).setBulkActions(10000) // 1万リクエストたまったらbulk書き込み .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) // 5MBたまったらbulk書き込み .setFlushInterval(TimeValue.timeValueSeconds(5)) // 5秒たまったらbluk書き込み .setConcurrentRequests(1) // bulk書き込みの並列度、1なら2並列 .build(); for (NanikaEvent event : NanikaStream stream) { Map<String, Object> json = event2Map(event); bp.add(new IndexRequest(indexName, type, id).source(json)); }
  • 15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ • Elasticsearch 5.2 いくつか引っかかるところもあった • Java Client初めて使ったけど使い勝手が良かった • 自力でBulkのHTTPリクエスト生成するよりはずっといい • Bulk Processorは特に良かった 15