Taste of Tech Topics

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

Elastic Stack 5.0.0 GAリリース! 早速インストール!! #elasticsearch

Hello world, @ です。
少し肌寒い日が続きますが、皆さんいかがお過ごしでしょうか。
寒いのは決して僕のせいではないからね、そう周りに言い聞かせながら生き抜く日々です。


さて、
ついにElastic Stack 5.0.0のGA版がリリースされました!!
https://www.elastic.co/jp/blog/elastic-stack-5-0-0-released

既にリリースされたalpha版やRC版などを触っていますが、2.x系から新機能が追加されただけでなく、性能や安定性、またユーザビリティが向上している体感があり、積極的にこの新版を使っていきたいと思っているところです。

Elastic Stack 5.0.0の新機能

公式ブログでもいくつか紹介されていますが、2.xから5.0ではピックアップしきれないほどの変更点があります。私なりに重要だと思っている新機能をいくつか紹介します。

Elasticsearch

https://www.elastic.co/blog/elasticsearch-5-0-0-released

  • 大幅な性能改善
  • Ingest Nodeにより、これまでLogstashが行なってきた加工処理ができるようになった
  • Stringの代わりにText/Keywordという型が導入された

性能改善によりKibanaのレスポンスが体感で変わりました。またIngest NodeのおかげでLogstashを使わない構成も取れるようになりました。特に小さな規模で動かす時には、Logstashを外すことも検討できそうです。

また、TextとKeywordについて、Textは単語分割されたいわゆる「analyzed」なフィールド、Keywordは単語分割されていない「not_analyzed」なフィールドです。Elasticsearchにデータを入れると、デフォルトで、このTextとKeywordの両方が保存されるようになりました。
2.x系を使っていた頃には「not_analyzedにしてなかったせいで、上手く検索できない!」とか「後からnot_analyzedに変更するのが大変すぎる!」なんて絶望したことがありましたが、5.0ではそんな目に遭うこともありません!

Kibana

https://www.elastic.co/blog/kibana-5-0-0-released

  • UIが大幅に変更された
  • SenseとTimelionが最初から組み込まれるようになった

Kibanaは見た目が一新され、グラフの表示エリアが広がりました。またSenseが「Console」という名前になって、最初から入る「Dev Tools」のひとつになりました。ほぼ必須のプラグインだったので、これも助かります。

Logstash

https://www.elastic.co/blog/logstash-5-0-0-released

  • モニタリングAPIが追加され、プロセスの情報や、パイプラインの状態などを取得できるようになった
  • 設定ファイルの自動再読み込みができるようになった(オプション)

Logstashの設定を行なう際、これまでは、設定ファイルを書いて、Logstashを立ち上げ(数秒掛かる!)、動作確認して、間違ってたら設定ファイルを直して、またLogstashを立ち上げ直して(だから数秒掛かる!)、という作業を繰り返さなくてはいけませんでした。
バージョン5.0では、設定ファイルの再読み込み機能を有効にすることで、Logstashを再起動しなくとも、設定が反映できるようになりました。特に初期構築時などに嬉しい機能ですね。

またLogstashにモニタリングAPIが追加されたことで、リソース情報などが取れるようになり、今後、X-Packのモニタリング機能でLogstashもモニタリングできるようになりそうです。

Beats

https://www.elastic.co/blog/beats-5-0-0-released

  • Metricbeatが登場。Topbeatの機能を持つほか、Apache、nginx、MySQL、MongoDBなどのメトリクスを収集できる
  • データを直接Kafkaに送信できるようになった
  • 不要なデータを送らないようフィルタできるようになった
  • Kibanaのダッシュボードを作るためのスクリプトが同梱されるようになった

最も大きな変更は、Kafkaにデータを送信できるようになったことでしょう。Kafkaを用いて情報収集の仕組みを安定化する際、システム構成をシンプルにできるようになりました。
また、Metricbeatにも注目です。Metricbeatは情報をpullで取りに行くエージェントで、今後も情報の取得先が増える見込みですし、自分でプラグインを書いて拡張することもできます。

Elastic Stack 5.0.0のインストール方法

それではElasicスタックのインストール手順を紹介します
5.0になってインストール周りが改善され、yumやapt-getを使ったインストールを行ないやすくなりました。
ここではAWS上のAmazon Linuxにインストールする想定で、手順を説明します。

事前準備

まずJava8(OpenJDK)をインストールします。
Elasticsearch 5.0からはJava 8以上が必要となり、またOpenJDKも正式サポートされるようになりました。

sudo yum update -y
sudo yum remove -y java-1.7.0-openjdk
sudo yum install -y java-1.8.0-openjdk-devel
sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

なおOpenJDKは -devel を入れないとjinfoやjstatなどのコマンドが入りませんし、 -debuginfo を入れないとjinfoやjstatで情報を取れないので、これらをセットで入れておきましょう。これが入ってないと、トラブルシューターが激おこですよ。


続いて、yumでインストールできるようにするため、GPGキーのインポートと、リポジトリの定義を作成します。

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vi /etc/yum.repos.d/elastic.repo

elastic.repo の内容は次の通りです。

[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

これまでのバージョンではyumリポジトリがElasticsearch、Kibanaなど、プロダクトごとに分かれていたのですが、5.0ではこれが一つに統合されたため、スタック全体のバージョンを統一しやすくなりました。
ここまで済めば、後は各プロダクトをyumでインストールしていきます。

ElasticsearchとKibanaのインストール

yumコマンドでElaticsearchとKibanaをインストールします。

sudo yum install -y elasticsearch
sudo yum install -y kibana

Kibanaはインストール直後の状態ではlocalhostからのみアクセスできる状態となっているため、AWSなど外部のサーバにインストールした場合には、publicアクセスできるように設定を変える必要があります。

sudo vi /etc/kibana/kibana.yml

次の設定を追加します。

server.host: "0.0.0.0"


また、Elasticsearchも同様にlocalhostからのみアクセスできる状態なので、もし別サーバにBeatsやLogstashを置いてアクセスする場合には、同一ネットワーク内からアクセスできるよう設定する必要があります。

sudo vi /etc/elasticsearch/elasticsearch.yml

次の設定を追加します

network.host: _local_, _site_

ローカルホスト(_local_)と、同一ネットワーク帯(_site_)からのアクセスを許可する設定です。


ここまで済んだら、ElasticsearchとKibanaを起動します。

sudo service elasticsearch start
sudo service kibana start

起動後にブラウザで http://(サーバのアドレス):5601/ にアクセスして、Kibanaの画面が出たら成功です。


ちなみに画面遷移時に「Index Patterns: Please specify a default index pattern」というエラーメッセージが出るので、とりあえず「.kibana」をデフォルトindexにしておけば警告はなくなります。
f:id:acro-engineer:20161027124719p:plain

4.x系のKibanaを使っていた人にとっては、ずいぶん変わったなぁという印象ではないでしょうか。

Beatsのインストール

続いて、Beatsをインストールします。
ここでは例としてMetricbeatによるリソース情報の収集と、PacketbeatによるKibanaへのアクセス情報の収集を行います。


yumコマンドでインストールします。

sudo yum install -y metricbeat
sudo yum install -y packetbeat


続いて、PacketbeatでKibanaに対するHTTPアクセスを収集できるよう設定します。
設定ファイルを書き換え、KibanaがHTTPアクセスに使うポート番号を指定します。

sudo vi /etc/packetbeat/packetbeat.yml

packetbeat.yml

packetbeat.protocols.http:
  ports: [5601]

これで5601ポートを通るパケットの情報が解析され、Elasticsearchに送信できるようになります。

なおMetricbeatはインストールした直後の状態で、サーバのリソース情報を取得できるようになっているため、今回はこのまま利用します。


ところで、Beatsで取得した情報を可視化するためにはKibanaでダッシュボードを作成する必要があるのですが、Beatsにはサンプルのダッシュボードを作るためのスクリプトが用意されており、これを使ってダッシュボードを作ることができます。
別に、情報を収集してからダッシュボードを作っても構いませんが、今回は先に作っておきます。次のコマンドでダッシュボードを作成します。

cd /usr/share/metricbeat
sudo ./scripts/import_dashboards
cd /usr/share/packetbeat
sudo ./scripts/import_dashboards


設定が終わったら、Beatsをそれぞれ起動します。

sudo service metricbeat start
sudo service packetbeat start


Beatsを起動した後、しばらくKibanaで操作などしていれば、アクセス情報やリソース情報などがElasticsearchに蓄積されます。
蓄積された情報を見るため、Kibanaにアクセスして「Dashboard」の「Open」から、ダッシュボードを開いてください。


MetricbeatのProcessダッシュボードは、こんな感じで閲覧できます。
f:id:acro-engineer:20161027124800p:plain


PacketbeatのHTTPダッシュボードは、こんな感じです。
f:id:acro-engineer:20161027124807p:plain


こういうダッシュボードがすぐに出来るのは、本当に手軽で強いなと思いますね。

Logstashのインストール

最後に、Logstashも試してみましょう。
Logstashを用いてKibanaのログを読み込み、Elasticsearchに転送します。


まずyumコマンドでLogstashをインストールします。

sudo yum install -y logstash


続いてLogstashの設定ファイルを作り、Kibanaのログファイルを読みこむようにします。

sudo vi /etc/logstash/conf.d/kibana.conf

このような内容にします。

input {
  file {
    codec => "json"
    path => "/var/log/kibana/kibana.stdout"
    start_position => "beginning"
    sincedb_path => "/var/log/logstash/since_kibana"
  }
}

output {
  elasticsearch {
    index => "kibana_access-%{+YYYY.MM.dd}"
    document_type => "%{type}"
  }
}

KibanaのログはJSON形式で出力されているため、codecにjsonを指定さえすれば、特にfilter処理を書く必要はありません。


設定が終わったら、Logstashを起動します。起動コマンドが他のサービスと少し異なっている点に注意してください。

sudo initctl start logstash


これで、Elasticsearchのkibana_access-(日付) というindexにアクセス情報が蓄積されます。
この情報を見るために、まずKibanaのメニューの「Management」からIndex patternを追加します。名前は「kibana_access-*」とすると良いでしょう。
f:id:acro-engineer:20161027124813p:plain


これでindexパターンを作成すると、Discoverからindexに蓄積された情報を確認することができるようになります。
f:id:acro-engineer:20161027124832p:plain


ここからさらに詳しい可視化をしたい場合には、Kibana上でグラフやダッシュボードを作る必要があります。

ちなみにここではLogstashで読み込む方法を紹介しましたが、実は今回のパターンではLogstashを使う必要はなく、Filebeatだけで済ませることができます。というのもKibanaのログはJSON形式で出力されており、Filebeat 5.0の「1行 1JSON」形式のファイルを読み込む機能を使えば、きちんと処理できるためです。
Logstashはもう少し複雑なログの解析や、転送先が複数ある時などに使うと良いでしょう。

まとめ

Elasticスタック5.0は、新機能追加に加え、性能や安定性、ユーザビリティなどが向上しています。
yumでのインストールもさらに簡単になり、導入しやすくなりました。

まだ使っていない人は、ぜひこの機会に挑戦してみてください。
とは言え、まだ出て間もないですからね、実案件への導入は計画的に!

告知

2016年11月18日(金) に、Spring Day 2016というイベントが東京で開催されます。
私も「Let's Visualize Your Spring Cloud Applications!」というタイトルで、Elasticスタックを使ったマイクロサービスの可視化について具体的な手法や、アーキテクチャなどを紹介する予定です。ぜひご参加ください!
springday2016.springframework.jp


それでは、
Enjoy elastic, see you!


AcroquestではElasticsearch、Logstash、Kibanaの無償ハンズオンセミナーを開催しています。


当社公認エンジニアがElasticsearchの基礎から、商用プラグインの利用、
実データを用いた可視化・分析までを、ハンズオン形式で説明致します。
ハンズオンでは最新バージョンであるElasticスタック5.0を利用します。


詳細・参加応募はこちらからお願いします。
www.acroquest.co.jp

Data Analytics Showcaseで登壇してきました!

こんにちは @です!

先日、恵比寿にて開催されたData Analytics Showcaseにて、私と弊社の@が登壇してきました。
www.db-tech-showcase.com


それぞれ、次のテーマで発表しました。
@ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」を用いた販売データの関連分析~
@:デジタルデータの可視化基盤「ENdoSnipe」を使った、システムトラブルの未然防止、経営判断につながる可視化の実践

ビッグデータを高速に検索・分析する「Elasticsearch」~新プラグイン「Graph」を用いた販売データの関連分析~

私(@)は、人気急上昇中の全文検索エンジンElasticsearchの機能を利用したデータ分析について、発表しました。
これまでこのブログでも多く取り上げているので皆さんご存知かと思いますが、
Elasticsearchは、ログ収集・加工ツールであるLogstash、データ可視化ツールであるKibanaと組み合わせて使うことで
ビッグデータを高速処理するデータ分析基盤として力を発揮します。

今回は、Kibana に追加された Graph というプラグインに特にフォーカスしてお話しさせていただきました。
Graphはデータ間の関連を可視化するためのプラグインになっていて、特徴的な関連を一目で見つけることができます。

今回はコンビニエンスストアの販売データを利用し、分析を行いました。
どのお菓子が、どの年代・性別に売れているのか等、すぐにわかります^^

詳細な内容については、発表資料をご覧ください。

www.slideshare.net


デジタルデータの可視化基盤「ENdoSnipe」を使った、システムトラブルの未然防止、経営判断につながる可視化の実践

この講演では、デジタルデータの可視化基盤であるENdoSnipeの紹介を行い、
KPI/KRIといった指標の相関関係、その関係を見つけるにはどうするか説明しました。
そして、ENdoSnipeの基盤をElasticsearchになぜおきかえたのか、
膨大な系列のデータから相関関係をどう発見していくのかについて説明しました。

興味ある方は、ぜひ発表資料をご覧ください。

www.slideshare.net


どちらのセッションも終了後に多くの質問があり、
Elasticsearchを用いたデータ分析に対する注目度の高さを感じた一日でした^^

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた

こんにちは。

ポケモンGOみなさんやってますか?私は開始1週間くらいで一度止めてしまったのですが、周りが続けているのに触発されて再開。先日ようやくレベル20まで上がりました。

どうも、@です。

さて、今回はKubernetesについてです。
最近Kubernetes(以下k8s)を使うと決めて、k8sの環境構築をしています。
その際、公式のドキュメントやさくらのナレッジさんの記事が非常に参考になったのですが、OSやk8sなどのバージョンが一部異なるため、いろいろと試行錯誤を重ねることになりました。

kubernetesによるDockerコンテナ管理入門 - さくらのナレッジ

Kubernetes - What is Kubernetes?

そこで、同じような環境構築をしている人に、一例として少しでも参考になればと思い、k8sクラスタ環境の構築~Dashboardのインストールまでをまとめました。

0. 環境と条件

  1. 物理マシンでMaster1台、Node2台を用意する。
  2. 各マシンのOSはCentOS 7.2を利用する。
  3. k8sのバージョンは1.2系を利用する。(yum installでインストール可能な版)
  4. プライベートなDocker Registryを立てる(Docker HubにイメージをPushしたくない)
  5. k8s-dashboardをインストールし、Webブラウザからクラスタ管理をできるようにする。

今回のMaster/Nodeの構成では、次のIPアドレスをそれぞれ設定しています。

No マシン IPアドレス
1 Master 192.168.98.47
2 Node1 192.168.98.48
3 Node2 192.168.98.49

またMasterとNodeに今回インストールするものをまとめると次のようになります。

No マシン インストール
1 Master Kubernetes, etcd, flannel, docker-registry
2 Node Kubernetes, flannel, docker

1. 共通の設定

k8sはノード間の通信をする際に、マシンのホスト名を利用するようです。そこで、各マシンには、/etc/hostsに自マシンのIPアドレスとホスト名を登録しておきましょう。(このホスト名は後々k8sの設定で使うことになります。)

192.168.98.47 master

2. Masterの設定

必要なサービスをインストールします。

$ sudo yum install kubernetes
$ sudo yum install etcd
$ sudo yum install flannel
$ sudo yum install docker-registry

※etcd、flannel、docker-registryは他サイトでいくらでも説明されていると思いますので、ここでは説明を割愛します。

2.1. k8s関連の設定

サービスのインストールが完了したら、各種設定ファイルを変更します。全部載せると長いので、変更点のみ載せています。まずはk8sの動作に関する設定ファイルの編集です。Masterサーバとして自マシンのIPアドレスを設定します。
[/etc/kubernetes/config]

#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://192.168.98.47:8080"

kubeletには、自マシンのホスト名(/etc/hostsに記載したもの)と、API Serverの設定を記述します。
[/etc/kubernetes/kubelet]

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=master"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://192.168.98.47:8080"

※このKUBELET_HOSTNAMEの設定が、/etc/hostsに最初に登録したホスト名と同じである必要があります。

次に、API Serverの設定です。今回はローカルでの通信を想定しているので、--insecure-bind-addressを用いてAPI Serverのアドレスは指定します。
[/etc/kubernetes/apiserver]

#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--insecure-bind-address=192.168.98.47"

#KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.98.47:2379"

APIServerへのアクセス用にキーの作成も必要になるので、ここで準備しておきます。

$ sudo openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048

[/etc/kubernetes/apiserver]

#KUBE_API_ARGS=""
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"

[/etc/kubernetes/controller-manager]

#KUBE_CONTROLLER_MANAGER_ARGS=""
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"

これでk8sの設定は完了になります。

2.2. etcdの設定

次はetcdの設定を行います。configファイルでetcdが外部からのアクセスを許可するように編集します。

[/etc/etcd/etcd.conf]

#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

2.3. Dockerの設定

最後にDockerの設定になります。今回Docker Registryはローカル通信で行うので、INSECURE_REGISTRYの設定が必要になります。またREGISTRYとしてMasterサーバのIPアドレスを指定します。
[/etc/sysconfig/docker]

#ADD_REGISTRY='--add-registry 127.0.0.1:5000'
ADD_REGISTRY='--add-registry 192.168.98.47:5000'

# INSECURE_REGISTRY='--insecure-registry'
INSECURE_REGISTRY='--insecure-registry 192.168.98.47:5000'

ここまでで主な設定は完了になります。

etcdctlでflannelが利用するネットワーク周りの設定をしておきます。
[注意]この設定はCentOS 7.2用の設定です。よく他のページで紹介されている「/coreos.com/network/config」というパスは、CoreOS用の設定になります。

$ sudo etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

2.4. 関連サービスの起動とサービス登録

ファイルの更新が完了したら、サービスの立ち上げと登録を行います。

$ sudo systemctl restart kube-apiserver
$ sudo systemctl restart kube-controller-manager
$ sudo systemctl restart kubelet
$ sudo systemctl restart flanneld
$ sudo systemctl restart etcd
$ sudo systemctl restart docker
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl enable kube-apiserver
$ sudo systemctl enable kube-controller-manager
$ sudo systemctl enable kubelet
$ sudo systemctl enable flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy

3. Nodeの設定

まず必要なモノのインストールです。

$ sudo yum install kubernetes
$ sudo yum install docker
$ sudo yum install flannel

3.1. k8s関連の設定

次にk8s関連の設定ファイルの編集です。Master-Node間の通信のため、KUBE_MASTERにはMasterサーバのIPアドレスを指定します。
[/etc/kubernetes/config]

#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://192.168.98.47:8080"

対象となるマシンのKubeletのIPアドレスを指定します。またKUBELET_HOSTNAMEには/etc/hostsに指定した名前を使ってください。KUBELET_API_SERVERにはAPI Serverをインストールしたマシン(今回の場合はMasterのマシン)のIPアドレスを記述します。
[/etc/kubernetes/kubelet]

#KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_ADDRESS="--address=192.168.98.48"

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://192.168.98.47:8080"

※192.168.98.47はMasterのIPアドレス、192.168.98.48はNodeのIPアドレスになります。

3.2. flannelの設定

k8sのMaster-Node間の通信を実現するためにFlanneldを利用しています。FLANNELD_ETCDには、ETCDをインストールしたマシンのIPアドレスを記述します。
[/etc/sysconfig/flanneld]

#FLANNEL_ETCD="http://127.0.0.1:2379"
FLANNEL_ETCD="http://192.168.98.47:2379"

3.3. Dockerの設定

最後にDockerの設定になります。こちらにも、INSECURE_REGISTRY、ADD_REGISTRYの設定が必要になります。
[/etc/sysconfig/docker]

#ADD_REGISTRY='--add-registry 127.0.0.1:5000'
ADD_REGISTRY='--add-registry 192.168.98.47:5000'

# INSECURE_REGISTRY='--insecure-registry'
INSECURE_REGISTRY='--insecure-registry 192.168.98.47:5000'

3.4. 関連サービスの起動とサービス登録

ファイルの更新が完了したら、サービスの立ち上げと登録を行います。

$ sudo systemctl restart kubelet
$ sudo systemctl restart flanneld
$ sudo systemctl restart docker
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl enable kubelet
$ sudo systemctl enable flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy

同じ設定をもう一台のNodeマシンでも実施してください。(ホスト名とIPアドレスはマシンに合わせて変更してください)

4. 設定結果の確認

設定が完了したら、うまくMasterがNodeを認識しているか確認しましょう。kubectlコマンドをMasterマシンで実行すると確認ができます。

$ kubectl get nodes
NAME      STATUS    AGE
master    Ready     3d
node1     Ready     2d
node2     Ready     2d

上記のように出力されれば、一旦k8sの基本的な環境の設定は完了になります。

5. ダッシュボードのインストール

次にダッシュボードをインストールします。今回の環境はdokcer-registryをMasterに立てており、

  1. 開発環境でDockerイメージを作成
  2. Masterのdocker-registryにイメージをPush
  3. k8sにデプロイする際はNodeがdocker-registryからイメージをPull

という流れになります。

kubernetes-dashboardはdocke hubにimageが存在するため、次のように、開発環境にpullをしてきて、そのimageをMasterのregistryにpushします。
では、まずk8s-dashboardのローカルへのイメージの登録です。

$ docker pull gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0
$ docker tag gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0
$ docker push 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0

これでDocker側の準備は整いましたので、k8s側でダッシュボードを作成します。すでにyamlファイルが公開されているので、そちらを取得し、中身をローカル用に変更してから作成します。

https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

上記のファイルの中身を更新します。

        #image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.4.0
        image: 192.168.98.47:5000/kubernetes-dashboard-amd64:v1.4.0

        # - --apiserver-host=http://192.168.98.47:8080
          - --apiserver-host=http://192.168.98.47:8080

(最下に追記)
  externalIPs:
  -  192.168.98.47

このファイルをkubectlで読み込ませてダッシュボードを作成します。ダッシュボードはkube-systemというnamespaceを利用するので、事前にnamespaceを作成します。

$ kubectl create ns kube-system
$ kubectl create -f kubernetes-dashboard.yaml

以下のコマンドでdashboardのSTATUSがRunningになっていることを確認します。

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-4061540060-9gzk0   1/1       Running   0          2d

6. 結果の確認

問題なくdashboardのインストールができれば、以下のアドレスからダッシュボードが確認できるはずです。
http://192.168.98.47:8080/ui
f:id:acro-engineer:20161004083220p:plain

7. まとめ

今回k8sクラスタ環境を構築して、ダッシュボードのインストールを行いました。同じように嵌ってしまってなかなかインストールが進まない人は、ぜひ参考にしてみてください。また、よりよいやり方があるなど知っている人がいましたら、教えてもらえるとうれしいです。


それでは!

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

PyConJP2016に参加してきました!

こんにちは、@です。

なんと、私、先日PyConJPに参加してきました!
ちなみに、Python歴4年目にして初参加です。

実はこのカンファレンス知ってからずっと参加したいと思っていて
やっと参加することができました!

そこで参加したセッションや感想を書きました。

f:id:acro-engineer:20160923231415p:plain:w300:left

セッションについて

今回は全体的にデータを分析するセッションが多かったように感じますが
多種多様ですばらしいセッションの数々です。

今回、私が参加したセッションは次のとおりです。

1日目

2日目

  • PythonでもPythonじゃなくても使える汎用的なMicroservice実行環境
  • Pythonで実現する4コマ漫画の分析・評論
  • Pythonで入門するApache Spark
  • PythonではじめるOpenAI Gymトレーニング
  • Building a data preparation pipeline with Pandas and AWS Lambda

私の興味関心は仕事がらもあり、データ分析系が多いのですが
ところどころで自分が本来、関わりのないような領域も聞くことができて、
新鮮な気持ちといい刺激になり、とても良かったと思っています。

個人的には、「確率的ニューラルネットの学習と Chainer による実装」が特に面白かったです。

参加してよかったこと改善してほしいと思ったこと

参加してよかったこと

1.参加者同士の交流が盛ん
参加者同士の交流が盛んで、ポスターセッションや夜の懇親会など色々なところで
話すことができ、非常に楽しいカンファレンスです。

2.多種多様のセッション
様々なセッションがあるので、必ずといっていいほど、自分が関心のある
セッションを探すことができます。

3.おやつ
凄く想定外だったのですが、おやつの配布がありました。
疲れるタイミングでのおやつの配布だったので非常に良かったです。
おいしいお菓子の図です。

f:id:acro-engineer:20160922144417j:plain:w400

4.会場までの交通の便が良かった。
西早稲田駅だったので、個人的にも会場までの交通自体もよく
会場の場所もわかりやすかったので、行きやすかったです。

5.講演のビデオはあとで見ることができる。
講演のビデオについてですが、あとで見ることができます。
そのため、万が一見逃しても安心です。

PyCon Japan 2016 - YouTube

6.サポートが手厚い
このカンファレンス参加費が1万円です。
しかし、この1万円で朝食(2日間)、昼食(2日間)、おやつ(大事・2日間)、懇親会(1日目)が出ました。
(1日目の朝食は食いそびれましたがorz)
また、シャツや様々なグッズがついてきてお得感もあり、非常に満足しています。

改善してほしいと思ったこと

1.招待講演は混雑が予想されるので広い会場が良いです。
今回のカンファレンスでは招待講演で部屋に入れないといったことがあったので
予め混雑が予想されそうなセッションは広い部屋を使うと良かったと思います。

2.講演会場に電源を
会場の確保の話ですが、PC持っている人が多いので、電源があると嬉しいです。
休憩時間に行っても良いのですが、他のイベントもあって、電源エリアに行くのが難しいので・・

最後に

PyConJP凄く楽しかったです。
スタッフ、発表者、参加者、関係者の皆さん楽しいカンファレンスをありがとうございました!
来年も行くと思いますので、よろしくお願いします。

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

API Gatewayから、AWS Lambdaを使わずにDynamoDBにアクセスする

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

クラウド上にアプリケーションを構築することがアドバンテージとなり、AWSを利用したサーバレスな事例を多く目にするようになりました。
例えば、DBアクセスする場合などは、EC2のようにサーバ管理が必要なサービスを使わずに構築できるようになりました。

DynamoDBにアクセスする例は、様々な方がWeb上に掲載していますが、
f:id:acro-engineer:20160923092042p:plain
API GatewayAWS Lambda → DynamoDB
という流れで呼び出している例を多く目にします。

こういった例の中には、AWS Lambdaでは特に他の処理をせず、単にDynamoDBのAPIを呼び出しているだけのものもあります。
実はAPI Gatewayにはマッピングテンプレートという機能があり、httpボディのjsonフォーマットを変換して、AWSの様々なサービスと連携できます。

docs.aws.amazon.com

この機能を利用すれば、フォーマット変換が簡単なケースではAWS Lambdaを利用せずとも、
f:id:acro-engineer:20160923092111p:plain
API Gateway → DynamoDB
という流れで呼び出すことができます。
AWS Lambdaを利用しなくてよいため、ある程度利用料金も安くなりますね。

ただ、API Gatewayマッピングテンプレート(Velocityを利用している)を実際に書いてみると、多少の慣れが必要だと感じます。
そこで、API GatewayからDynamoDBのAPIを呼び出すためのマッピングテンプレートを具体的にまとめてみました。

今回利用したデータ

RDBMSでよく例に登場するemployeesのデータを利用しました。

ここから、employeesテーブルだけ利用します。
http://dev.mysql.com/doc/employee/en/sakila-structure.html

emp_no INT(11)
birth_date DATE
first_name VARCHAR(14)
last_name VARCHAR(16)
gender ENUM('M', 'F')
hire_date DATE
  • データ

先ほどのテーブルに入る具体的なデータは、このサイトにサンプルがあります。
https://launchpad.net/test-db/

何行か見てみると、このようなデータになっています。

(10001,'1953-09-02','Georgi','Facello','M','1986-06-26'),
(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21'),
(10003,'1959-12-03','Parto','Bamford','M','1986-08-28'),
(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01'),
(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12'),
(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02')
(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10'),
(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15'),
(10009,'1952-04-19','Sumant','Peac','F','1985-02-18'),
(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24'),

API GatewayAPIについて

API GatewayAPIについては以下のサイトを参考にしました。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.API.html
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html

GetItemのリクエスト・レスポンスの例が載っていますが、ちょっと癖がありますね。

{
    "TableName": "Pets",
    "Key": {
        "AnimalType": {"S": "Dog"},
        "Name": {"S": "Fido"}
    }
}
{
    "Item": {
        "Age": {"N": "8"},
        "Colors": {
            "L": [
                {"S": "White"},
                {"S": "Brown"},
                {"S": "Black"}
            ]
        },
        "Name": {"S": "Fido"},
        "Vaccinations": {
            "M": {
                "Rabies": {
                    "L": [
                        {"S": "2009-03-17"},
                        {"S": "2011-09-21"},
                        {"S": "2014-07-08"}
                    ]
                },
                "Distemper": {"S": "2015-10-13"}
            }
        },
        "Breed": {"S": "Beagle"},
        "AnimalType": {"S": "Dog"}
    }
}

httpリクエストをAPI Gatewayに送信するとき、ボディのjsonに型を記載しないことが多いと思いますが、DynamoDBのAPIでは型指定が必要になります。
そのため、API Gatewayでボディのjsonを変換する必要があります。

API Gatewayの設定方法について

API Gatewayの設定方法については、こちらのサイトが分かりやすいです。
dev.classmethod.jp

このサイトに「Integration Response の設定」が記載されています。
DynamoDBのいくつかのAPIに対して、実際にマッピングテンプレートを記載してみましょう。

PutItemの例

#set($item = $input.path('$'))
{
  "TableName": "employees",
  "Item": { 
    "emp_no": {
      "N": "$item.emp_no"
    },
    "birth_date": {
      "S": "$item.birth_date"
    },
    "first_name": {
      "S": "$item.first_name"
    },
    "last_name": {
      "S": "$item.last_name"
    },
    "gender": {
      "S": "$item.gender"
    },
    "hire_date": {
      "S": "$item.hire_date"
    }
  }
}

応答にボディは不要とすると、レスポンスのマッピングテンプレートは不要です。

Scanの例

全件取得のため、リクエストのマッピングテンプレートは不要です。

#set($items = $input.path('$.Items'))
{
  [
#foreach($item in $items)
    {
      "emp_no": $item.emp_no.N,
      "birth_date": "$item.birth_date.S",
      "first_name": "$item.first_name.S",
      "last_name": "$item.last_name.S",
      "gender": "$item.gender.S",
      "hire_date": "$item.hire_date.S"
    }#if($foreach.hasNext),#end

#end
  ]
}

emp_noは数値型であるため、JSONのレスポンスの値はダブルコーテーションで囲いません

GetItemの例

リクエストするURLにemp_noが入っていることを前提とします。

{
  "TableName": "employees",
  "Key": { 
    "emp_no": {
      "N": "$input.params('emp_no')"
    }
  }
}
#set($item = $input.path('$.Item'))
{
  "emp_no": $item.emp_no.N,
  "birth_date": "$item.birth_date.S",
  "first_name": "$item.first_name.S",
  "last_name": "$item.last_name.S",
  "gender": "$item.gender.S",
  "hire_date": "$item.hire_date.S"
}

emp_noは数値型であるため、jsonのレスポンスの値はダブルコーテーションで囲いません

DeleteItemの例

リクエストするURLにemp_noが入っていることを前提とします。

{
  "TableName": "employees",
  "Key": { 
    "emp_no": {
      "N": "$input.params('emp_no')"
    }
  }
}

応答にボディは不要とすると、レスポンスのマッピングテンプレートは不要です。

最後に

書き方に慣れるとそうでもないのですが、初めて書くときは苦労しますよね。
今回は、ちょっとした実践例ですが、初めてマッピングテンプレートを書く方のお役に立てば幸いです。
それではまた。

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

ElasticのGraph機能でコンビニ商品を特徴分析

こんにちは、このブログにデビューしました、@です。

世の中ではポケットモンスターが流行していますが、
私の中では以前からモンスターエナジーが流行しています。

私は会社の近くのコンビニで、モンスターエナジーを購入することが多いのですが、
海外と日本では成分が異なるという話があったり、類似商品も多く出回っていたりするため、
中身が気になります。
(モンスターエナジー好きの私にとって、それ以外はすべて類似商品です)

実際、棚を眺めてみると、売り場面積の関係でコンビニで扱える商品は限られており、
工夫を凝らしたうたい文句の売れ筋商品がしのぎを削っています。

そんな折、@さんによるElasticsearchのGraph機能紹介記事もあり、
acro-engineer.hatenablog.com

同じコンビニエンスストアのデータセットを使って、もう少し違う観点から分析を深めたいと思いました。
※Graph機能の基本的な使い方は上のページを参考にしてもらえれば良いと思います。

自然言語処理も使い、販売商品の特徴をつかんで、分析してみましょう。

Graphの対象データ

今回も、The 2nd BigData Analysisのデータを使用します。
The 2nd Big Data Analysis Contest

この中にある商品データを使って、商品と説明文(概要)や商品と素材から
何か新しいこと、どんなことが見えるのかを検証してみます。

次の表に実際のレコードを2件表示しています。
本レコードにはカラムが更に多くありますが、今回は利用したカラムを抜粋しました。
pnameが商品名、abstractが商品の概要、materialsが素材名の一覧を示します。

pname abstract materials
うましおポテト(ノンフライ) ザク切りポテトを、カリッと焼き上げました。 馬鈴薯(遺伝子組換えでない)、植物油、砂糖、食塩、デキストリン食物繊維ブドウ糖、たんぱく加水分解物、調味料(アミノ酸等)、リン酸塩(Na)、甘味料(ステビア)、香料、(原材料の一部に鶏肉を含む)
くるみとココナッツのキャラメリゼ素焼きアーモンド入り くるみとココナッツに、キャラメルのやさしい甘さが広がります。 クルミ、ココナッツ、アーモンド、グラニュー糖、砂糖、ショ糖、でん粉、ぶどう糖デキストリン、食塩、乳等を主要成分とする食品、香料

解析

設定

今回の設定は次のとおりです。

  1. Sampling size:2000
  2. Certainty:1
  3. Diversity field: No diversification
  4. Timeout[ms]:5000
  5. Significant link: off

MeCabや特定の区切り文字(、)で分解したデータを投入しています。

商品の概要と商品名のデータ

The 2nd BigData Analysisには、商品の概要データがあります。

実際の加工したレコードを3件表示してみます。(形式はcsvです。)

概要の単語 商品名
ザク うましおポテト(ノンフライ)
切り うましおポテト(ノンフライ)
ポテト うましおポテト(ノンフライ)

商品の概要を解析することで概要のつながりからどのような商品が
似ているのか、思いがけない情報を取得できるかもしれません。

早速やってみましょう。
まず、大雑把に表示をすると次の図になります。

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

例えば、このGraphを見ると
「キヌアと8種のグラノーラチョコレート」の食感が「サクッ」としており、
「サクッ」としているものとしては他にも「ミニ歌舞伎揚」や「小さな海老の華」、「京挽ききなこくるみ」があることがわかります。

つまり、「サクッ」としているものを取ることができます。この「サクッ」としているものといった概念をベースに
他の商品を検索することに応用することができます。

また、気になった箇所にはGraph機能でエッジを追加することができます。
「厚切りザクッとポテトうすしお味」にはどのような概要があって、それに近いものが何かを探すこともできます。

例えば、今現れているGraphを少々操作し、「厚切りザクッとポテトうすしお味」に近いものを出すと
次のようになります。

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

「厚切りザクッとポテトコンソメ味」や「うましおポテト(ノンフライ)」といったノード(商品)が出てきました。
これで類似する商品を発見することができました。

このように、概要の繋がりから類似している商品をGraphの機能から検索することができます。

商品の素材と商品名のデータ

商品の素材データからも同じように検索することができます。
こちらも同様に、実際の加工したレコードを3件表示してみます。

素材名 商品名
馬鈴薯(遺伝子組換えでない) うましおポテト(ノンフライ)
植物油 うましおポテト(ノンフライ)
砂糖 うましおポテト(ノンフライ)

試しにGraphを使った表示をしてみましょう。

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

注目ポイントを赤枠で囲ってみます。

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

この図から、砂糖が
「お好み海鮮」、「いかみりん」、「いかの姿フライ」、「あんドーナッツ」、「キヌアと8種のグラノーラチョコレート」
の素材として使われていることがわかりました。

これを応用するとモンスターエナジーに近いものが分かるのでは!
と思ったのですが、よくよく見てみると、このデータセットにはモンスターエナジーは入っていなかったorz

Graphでわかること

ElasticsearchのGraph機能を使うと次のことがわかります。

1.要素と要素の直接的なつながり
基本的な機能ではありますが、今回解析したように、砂糖はどの商品に使われているのか、
といった関係をひと目で可視化することができます。

2.特定の要素とそれに関係した要素を可視化できる。
要素と要素から新しい要素を発見した場合、その要素と他の要素がどのように関係しているのか
といったことをひと目で可視化することができます。
今回の場合だと、「厚切りザクッとポテトうすしお味」にはどのような概要があって、
それに近いものが何かを探すことがそれを指しています。
これを応用すれば、商品の概要と売れ筋商品の関連性もつかむことができそうです。

Graph機能はこれらの分析を可能とし、関係性を容易につかむことができます。

まとめ

Graphを使うとつながりを見ることができます。
ElasticsearchのGraph機能をつかって、身近なものをどんどん可視化してみましょう。

今度はモンスターエナジーと他商品の関係を調べてみたい。

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com

位置情報付きツイートをElasticsearch,Kibanaで可視化して、ポケモンGOを攻略!

こんにちは@です

世間に一大ブームを起こしたポケモンGOですが、みなさんやってますか?
新機能が追加されたり、第二世代のポケモンが登場するという噂もあり、
さらに流行るかもしれないですね。

さて、今回は位置情報付きのツイートを地図上にマッピングして可視化してみます。
キーワードで絞り込むことで、そのキーワードを含むツイートが「どこで」「どのくらい」つぶやかれているかを知ることができます。
例えば「ピカチュウ」と検索すればポケモンGOピカチュウが出現する場所が簡単に特定できるかもしれません。

今回行うのは、logstashで取得したツイートをelasticsearchに入れて、それをkibanaで可視化するという流れです。

それでは実際にやってみます。

1.logstashでツイートを取得する

logstashのinputプラグインとして用意されているtwitterプラグインを用いて、ツイートの情報を収集します。
locations(ツイートした位置情報を表すパラメータ)またはkeywords(この文字列を含むツイートを検索する)が必須パラメータとなっています。
keywordに関してはkibana上でフィルタリングすれば良いので、locationsを指定してざっくり日本国内のツイートを集めます。
(twitterプラグインの詳しい使い方についてはhttps://www.elastic.co/guide/en/logstash/5.0/plugins-inputs-twitter.html参照)

locationsは経度と緯度をカンマ区切りのペアとして指定することができます。
下記の設定をすることで経度123〜154、緯度20〜46という範囲が設定されます。
また、keywordsを使えば指定したキーワードを含むツイートを集めることができます。

locationsでは、経度と緯度のペアをカンマ区切りで書くことでbounding boxを定義できます。
例えば
locations => 123,20,154,46
と設定すれば
経度123度、緯度20度の点と、経度154度、緯度46度の点によって作られる矩形
内の位置情報をもつツイートを検索できます。

TwitterAPIの使い方については次のURLを見てください
参考(https://dev.twitter.com/streaming/overview/request-parameters#locations)


以下に示すのが今回使用するlogstashの設定ファイルになります。
inputにtwitterプラグインで、locations => "123,20,154,46"と指定しています。
この設定で日本全国のツイートをカバーできるはずです(朝鮮半島なども一部入りますが)

 input { 
   twitter {
     consumer_key => "XXX"
     consumer_secret => " XXX"
     oauth_token => "XXX"
     oauth_token_secret => "XXX"
     locations => "123,20,154,46"
    #keywords => ""
     full_tweet => true
   }
 }
 filter{
 }
 output{
   elasticsearch{
     hosts => localhost
     index => twitter
   }
 }

この設定ファイルを使ってデータ投入!...と行きたいのですが、
この設定のみだと、ツイートの位置情報がnumber型となるのでKibanaの地図上で可視化することができません。
Kibanaの地図上でデータを可視化するためには、geo_pointという型でデータを保持する必要があります。

2.マッピングの設定をする

位置情報をgeo_point型として扱うためのマッピング定義を行います。
下記の内容をKibanaのConsoleを使って設定します。
参考(https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html)

 PUT _template/twitter_template
 {
   "template" : "twitter",
   "mappings" : {
     "_default_" : {
       "_all" : {"enabled" : true, "omit_norms" : true},
       "dynamic_templates" : [ {
         "message_field" : {
           "match" : "message",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed","omit_norms" : true
            }
         }
       }, {
         "string_fields" : {
           "match" : "*",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed", "omit_norms" : true,
           "fields" : {
             "raw" : {"type": "string", "index" : "not_analyzed",  "ignore_above" : 256}
           }
         }
       }
     } ],
     "properties" : {
     "@version": { "type": "string", "index": "not_analyzed"         },
       "coordinates" : {
         "type" : "object",
         "dynamic" : true,
         "properties" : {
           "coordinates" : { "type" : "geo_point" }
         }
       }
     }
   }
  }
 }

3.Kibana上で可視化する

まず初めに画面左にあるメニューからvisualizeをクリックして、
visualizeの種類としてtile map を選択します。
f:id:acro-engineer:20160830094038p:plain

index patternとして "twitter"を選択します。
f:id:acro-engineer:20160830094109p:plain

Optionsをクリックして以下のパラメータを設定します。

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

Dataをクリックして位置情報を表すfieldとしてcoordinates.coordinatesを選択します。

f:id:acro-engineer:20160831173912p:plain
地図上にデータが表示されました!
いまの状態だと、キーワードによる絞り込みは行わずに、収集した全データが表示されていることになります。
やはり東京近辺のツイート数が多そうですね。

それでは幾つかキーワードで絞り込みを行ってみましょう。

例1:金閣寺
f:id:acro-engineer:20160831173947p:plain

例2:大阪
f:id:acro-engineer:20160831174001p:plain

例3:富士山
f:id:acro-engineer:20160831174052p:plain

特徴的なワードだと分布がはっきりしてわかりやすいですね。

この機能を使ってポケモンの名前を調べれば出現場所がわかるかもしれません。
早速"ピカチュウ"で絞り込んでみましょう!
f:id:acro-engineer:20160831174140p:plain
ある程度場所がわかりますね。さらに拡大してみましょう。
f:id:acro-engineer:20160906103310p:plain
対応する地名をGoogleMapで見てみると、、、
f:id:acro-engineer:20160831174228p:plain
出ました!ピカチュウはみなとみらい近辺の赤レンガ倉庫やワールドポーターズのあたりにいる可能性が高いですね!


今回はツイートの位置情報をKibanaで可視化しました。
Twitterデータを常に収集し続けておけば、リアルタイムに色々な情報を得られそうですね。

それじゃあちょっとピカチュウ捕まえてきます!


(※実際にピカチュウが出現する場所を保証するものではありません)

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


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

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com