"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import SVG\n",
"SVG(filename='images/notebooks-filled.svg')"
]
},
{
"cell_type": "markdown",
"metadata": {
"lc_cell_meme": {
"current": "1e7aae78-1fd8-11e7-b31a-0242ac12000d",
"next": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"previous": "c68c3294-1fd3-11e7-b31a-0242ac12000d"
}
},
"source": [
"*構築*フェーズは、構築・運用対象とするElasticsearchのためのマシンを準備し、ソフトウェアのインストール、設定を行います。\n",
"\n",
"*確認・診断*フェーズは、構築したElasticsearchの日々の運用や、問題発生時の健康診断を行います。\n",
"\n",
"*改善*フェーズは、健康診断の結果、Nodeの追加により容量を増やしたり、データをクリーンアップしたりといった操作を行います。"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"lc_cell_meme": {
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"history": [
{
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "762cb5d6-1537-11e7-b31a-0242ac12000d"
},
{
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "762cb3f6-1537-11e7-b31a-0242ac12000d"
},
{
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "377d4a52-1fd3-11e7-b31a-0242ac12000d"
},
{
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "c68c3294-1fd3-11e7-b31a-0242ac12000d"
},
{
"current": "762cb7a2-1537-11e7-b31a-0242ac12000d",
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "c68c3294-1fd3-11e7-b31a-0242ac12000d"
}
],
"next": "762cb96e-1537-11e7-b31a-0242ac12000d",
"previous": "1e7aae78-1fd8-11e7-b31a-0242ac12000d"
},
"nbpresent": {
"id": "254432a4-e8fc-4d50-ac21-04a62e34643a"
}
},
"source": [
"## お手本Notebookの目次一覧\n",
"\n",
"各Notebookの詳細な目次を参照するには、以下のセルを実行(`Run cell`)してください。Notebookファイルへのリンクが表示されます。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"lc_cell_meme": {
"current": "762cb96e-1537-11e7-b31a-0242ac12000d",
"next": "762cbb3a-1537-11e7-b31a-0242ac12000d",
"previous": "762cb7a2-1537-11e7-b31a-0242ac12000d"
},
"scrolled": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python2.7/dist-packages/cffi/model.py:525: UserWarning: 'point_conversion_form_t' has no values explicitly defined; guessing that it is equivalent to 'unsigned int'\n",
" % self._get_c_name())\n"
]
},
{
"data": {
"text/html": [
"00_Prerequisites for Literate Computing via NotebooksAbout: Prerequisites for Literate Computing via Notebook - 文芸的機械化の準備 - Notebookでね
Ansibleの設定 - Notebook環境は、以下の条件を満たしている必要がある。
・
AnsibleでDefault Moduleが利用可能であること - A - DefaultのModuleが使えればよい。特にカスタマイズすべき項目はなし。
資材の準備 - - Oracle JDK ライセンス認証・RPMパッケージの配置
・
JVMの資材が準備されていること - A - Elasticsearchを動作させるのに必要なJVMのファイルを用意します。
・
Elasticsearchのダウンロードサイトにアクセスできること - A - Elasticsearchの媒体を公式サイトからダウンロード可能か確認します。
01_01_OutlineElastic Stackの構築:概要 - Elastic Stackの概念やNodeの種類、 サイジングの観点について説明します。
・
基本概念 - 実際の構築の前に、クラスタやそれを構成するNodeに関する基本概念を説明します。
・
サイジングの考え方 - 構築にあたり、1サーバのスペック、設定するshardの数、各役割のノード数を決める必要があります。
・
典型的な構成 - Elasticsearchを動作させるための典型的な設定を示します。
・
設定の出力 - 前の章の構成例を元に、この後の「収容」「インストール」のNotebookで用いるパラメータを生成します。
01_02_Accommodation_AWSElastic Stackの構築手順:収容(AWS) - Elasticsearchのインストール先となる Amazon EC2インスタンスを確保します。
・
設定 - インスタンスの生成に必要な情報を設定します。
・
EC2インスタンスの設定と生成 - サーバ構成に応じたEC2インスタンスの設定を定義し、インスタンスを生成します。
・
Inventory作成用のインスタンスリストを作成 - ホストのパブリックDNS一覧をリスト化します
01_02g_Accommodation_GCEElastic Stackの構築手順:収容(GCE) - Elasticsearchのインストール先となるGoogle Compute Engineインスタンスを確保します。
動作環境の確認 - このNotebookは、 [Google Python Client Library](https://github.com/google/google-api-python-client) を使ってマシンの確保を行います。そのため、Libraryがインポート可能であることの確認と、Credentialsが設定されている
・
Libraryの確認 - このNotebook環境にGoogle Python Client Libraryがインストールされている必要があります。インストールされていない場合は、以下のセル実行に失敗し、 ImportError となります。
・
Credentialの指定 - Google Compute EngineにアクセスするためのCredentialを指定してください。
GCEインスタンスの設定と生成 - サーバ構成に応じたGCEインスタンスの設定を定義し、インスタンスを生成します。
・
ゾーンの設定 - どのZoneにインスタンスを確保するかを定義しておく。
・
インスタンスの設定 ・
Inventory作成用のインスタンスリストを作成
01_03_Set_InventoryElastic Stackの構築手順:インベントリの設定 - Ansibleで利用するインベントリ情報を ファイルに出力します。
・
設定 - アカウントや通信先などを設定します。
・
既存のインベントリのバックアップ - 出力前に、既存の内容をバックアップ用ディレクトリに退避します。
・
ファイルの生成 - インベントリファイルを生成します。
・
内容の確認・修正 - 生成したインベントリファイルの内容を確認、修正したり、前回のバージョンと比較したい場合は以下から実施できます。
・
インベントリのテスト - 作成したインベントリにある各ホストに、Ansibleから各種の操作が可能か確認します。
01_04_InstallElastic Stackの構築手順:インストール - Elasticsearchをインストールし、 各種パラメータを設定してクラスタを構築します。
・
設定 - アカウントや通信先などを設定します。
・
インストール - Elasticsearchのインストールし、設定、起動します。
・
クラスタのステータスの確認方法と監視方法 - クラスタのステータスを確認するためにCluster APIを発行します。
・
Logstashへのサンプルデータ投入(オプション) - インストール済みのLogstashに、この後のNotebookで利用するサンプルデータを投入します。
01_05_DiagnosticsElastic Stackの構築:状態の診断 - 稼働しているElasticsearchに異常がないか調べ、 異常がある場合の対処手順について説明します。
・
準備 - 本章のコマンドを実行するための設定を行います。
・
診断 - 現在の状態を把握するために、各種の状態を診断します。
・
症状と対処 - 診断の章で異常があった場合、本章の内容に従い対処します。
01_50_Add_Data_NodeData Node追加操作 - 新しいData Nodeを クラスタに追加します。
・
準備 - 本章のコマンドを実行するための設定を行います。
・
サーバの追加生成 - Data Nodeを生成する先のサーバを生成します。
・
インベントリへホストを追加 - 追加したホスト情報を既存のインベントリに追記します。
・
追加したホストへのインストール - 追加したホストに、Elasticsearchをインストールし、設定します。
・
クラスタの状態確認 - クラスタに追加したData Nodeが参加できているか確認します。
・
Data Node追加・障害復旧時の注意点 - Data Nodeを追加したり、一度障害が発生してクラスタから抜けたData Nodeを復旧させる際の注意点について説明します。
01_51_Force_MergeForce Merge操作 - ディスクの使用量を削減するために、強制的な Merge操作によってセグメント数を減らします。
・
準備 - 本章のコマンドを実行するための設定を行います。
・
削除可能なデータ件数の確認 - 削除フラグがonの状態のデータが何件あるか、Indices Statsで確認します。
・
Force Merge APIの発行 - 実際にAPIを発行します。
01_52_Backup_Restoreバックアップ&リストア - Data Node上にあるデータのバックアップと リストアについて説明します。
・
準備 ・
バックアップ - バックアップ方法について説明します。
・
リストア - リストア方法について説明します。
02_Searchサーチエンジンとしての利用手順(検索) - 様々な条件で投入したドキュメントを検索する 方法について説明します。
・
サーチエンジンとしてのElasticsearch ・
リクエストの基本構文 ・
ドキュメントの検索 ・
ドキュメントの追加 ・
ドキュメントの更新 ・
ドキュメントの削除 ・
大量データ取得時の検索 ・
実行クエリ解析
03_Aggregationサーチエンジンとしての利用手順(集計) - 検索したドキュメントをさらに集計する 方法について説明します。
・
準備 ・
Aggregationとは ・
リクエストの基本構文 ・
レスポンスの基本構文 ・
Metrics Aggregations ・
Bucket Aggregations ・
Pipeline Aggregations ・
Matrix Aggregations ・
実行クエリ解析
04_Store_Dataサーチエンジンとしての利用手順(データ蓄積) - LogstashからElasticsearchへ、様々な形式の データを蓄積する方法について説明します。
・
準備 ・
Logstashとは ・
Logstashの設定 ・
データフォーマット ・
データ加工 ・
Ingest Nodeの利用方法 ・
トラブルシューティング
05_Indexingサーチエンジンとしての利用手順(インデックス設計) - インデックスに与えるマッピング定義の内容や、 reindexの方法について説明します。
・
準備 ・
マッピング設定 ・
マッピングの設定方法と注意点 ・
reindex APIを使った投入後データの加工方法 ・
パラメータ設定
99_Summarizing notebooksAbout: Notebookの利用フローまとめ - Notebookの利用フローを図としてまとめる例です。
必要なツール - このNotebookの実行には[blockdiag](http://blockdiag.com/ja/blockdiag/)が必要です。
ブロック図による一覧生成 - 以下のセルを実行(`Run All Below`)することで、Notebookがそれぞれどのような局面での利用を想定しているのか、ブロック図で確認することができます。
・
雛形の生成 - まず、Notebookの利用フローを表したブロック図の雛形を作成します。
・
詳細情報の埋め込み - 生成した雛形に対して、見出しの情報など詳細な情報を埋め込みます。
後始末 - 一時ファイルを削除します。
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%run scripts/get-display-contents.py\n",
"display_notebook_contents()"
]
},
{
"cell_type": "markdown",
"metadata": {
"lc_cell_meme": {
"current": "762cbb3a-1537-11e7-b31a-0242ac12000d",
"next": "762cbdce-1537-11e7-b31a-0242ac12000d",
"previous": "762cb96e-1537-11e7-b31a-0242ac12000d"
}
},
"source": [
"## お手本Notebookと証跡Notebook\n",
"\n",
"お手本Notebookを使う場合は、お手本をコピーし、そのコピーを開きます。このように、**お手本と作業証跡は明確に分けながら作業をおこないます。**\n",
"\n",
"また、お手本をコピーする際は、 `YYYYMMDD_NN_` といった実施日を示すプレフィックスを付加することで、後で整理しやすくしています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"lc_cell_meme": {
"current": "762cbdce-1537-11e7-b31a-0242ac12000d",
"next": "762cbfe0-1537-11e7-b31a-0242ac12000d",
"previous": "762cbb3a-1537-11e7-b31a-0242ac12000d"
}
},
"source": [
"## 実際にお手本Notebookを使ってみる\n",
"\n",
"以下のJavaScriptを実行することで、簡単にお手本から作業用Notebookを作成することもできます。\n",
"\n",
"以下のセルを実行すると、Notebook名のドロップダウンリストと[作業開始]ボタンが現れます。\n",
"[作業開始]ボタンを押すと、お手本Notebookのコピーを作成した後、自動的にブラウザでコピーが開きます。\n",
"Notebookの説明を確認しながら実行、適宜修正しながら実行していってください。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"lc_cell_meme": {
"current": "762cbfe0-1537-11e7-b31a-0242ac12000d",
"next": "762cc1c0-1537-11e7-b31a-0242ac12000d",
"previous": "762cbdce-1537-11e7-b31a-0242ac12000d"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
""
],
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from datetime import datetime\n",
"import shutil\n",
"\n",
"def copy_ref_notebook(src):\n",
" prefix = datetime.now().strftime('%Y%m%d') + '_'\n",
" index = len(filter(lambda name: name.startswith(prefix), os.listdir('.'))) + 1\n",
" new_notebook = '{0}{1:0>2}_{2}'.format(prefix, index, src)\n",
" shutil.copyfile(src, new_notebook)\n",
" print(new_notebook)\n",
"\n",
"ref_notebooks = filter(lambda m: m, map(lambda n: re.match(r'([0-9][0-9a-z]+_.*)\\.ipynb', n), os.listdir('.')))\n",
"ref_notebooks = sorted(ref_notebooks, key=lambda m: m.group(1))\n",
"\n",
"frags = map(lambda m: ''.format(name=m.group(0), title=m.group(1)),\n",
" ref_notebooks)\n",
"HTML('''\n",
"\n",
"')"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"lc_cell_meme": {
"current": "762cc1c0-1537-11e7-b31a-0242ac12000d",
"next": "762cc38c-1537-11e7-b31a-0242ac12000d",
"previous": "762cbfe0-1537-11e7-b31a-0242ac12000d"
}
},
"source": [
"## お手本のアーカイブ\n",
"\n",
"以下のセルで、お手本NotebookのZIPアーカイブを作成できます"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"lc_cell_meme": {
"current": "762cc38c-1537-11e7-b31a-0242ac12000d",
"history": [
{
"current": "762cc38c-1537-11e7-b31a-0242ac12000d",
"next": null,
"previous": "762cc1c0-1537-11e7-b31a-0242ac12000d"
}
],
"next": "d0293c52-1fd8-11e7-b31a-0242ac12000d",
"previous": "762cc1c0-1537-11e7-b31a-0242ac12000d"
},
"nbpresent": {
"id": "1ef6727d-43a6-4d8c-924e-6eddb0e97a85"
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"updating: 00_Prerequisites for Literate Computing via Notebooks.ipynb (deflated 76%)\n",
"updating: 01_01_Outline.ipynb (deflated 81%)\n",
"updating: 01_02_Accommodation_AWS.ipynb (deflated 85%)\n",
"updating: 01_02g_Accommodation_GCE.ipynb (deflated 86%)\n",
"updating: 01_03_Set_Inventory.ipynb (deflated 86%)\n",
"updating: 01_04_Install.ipynb (deflated 87%)\n",
"updating: 01_05_Diagnostics.ipynb (deflated 89%)\n",
"updating: 01_50_Add_Data_Node.ipynb (deflated 80%)\n",
"updating: 01_51_Force_Merge.ipynb (deflated 95%)\n",
"updating: 01_52_Backup_Restore.ipynb (deflated 86%)\n",
"updating: 02_Search.ipynb (deflated 92%)\n",
"updating: 03_Aggregation.ipynb (deflated 94%)\n",
"updating: 04_Store_Data.ipynb (deflated 88%)\n",
"updating: 05_Indexing.ipynb (deflated 90%)\n",
"updating: 99_Summarizing notebooks.ipynb (deflated 89%)\n",
"updating: Delete_01_06_Manual-Operation.ipynb (deflated 94%)\n",
"updating: Delete_01_07_Troubleshooting.ipynb (deflated 88%)\n",
"updating: Readme.ipynb (deflated 84%)\n",
"updating: logstash_conf/csv.conf (deflated 53%)\n",
"updating: logstash_conf/document_id.conf (deflated 54%)\n",
"updating: logstash_conf/geoip.conf (deflated 45%)\n",
"updating: logstash_conf/json.conf (deflated 30%)\n",
"updating: logstash_conf/json_multiline.conf (deflated 41%)\n",
"updating: logstash_conf/ltsv.conf (deflated 81%)\n",
"updating: logstash_conf/main.conf (deflated 53%)\n",
"updating: logstash_conf/multi_line.conf (deflated 77%)\n",
"updating: logstash_conf/single_line.conf (deflated 78%)\n",
"updating: logstash_conf/tsv.conf (deflated 53%)\n",
"updating: logstash_conf/useragent.conf (deflated 36%)\n",
"updating: playbooks/copy_logstash_conf.yml (deflated 35%)\n",
"updating: playbooks/copy_sample_data.yml (deflated 28%)\n",
"updating: playbooks/install_elasticsearch.yml (deflated 36%)\n",
"updating: playbooks/install_jdk.yml (deflated 52%)\n",
"updating: playbooks/install_logstash.yml (deflated 34%)\n",
"updating: playbooks/set_api_parameter.yml (deflated 37%)\n",
"updating: playbooks/set_elasticsearch.yml (deflated 74%)\n",
"updating: playbooks/set_heap-size.yml (deflated 54%)\n",
"updating: playbooks/set_iptables-rule.yml (deflated 57%)\n",
"updating: playbooks/set_kernelparameter.yml (deflated 39%)\n",
"updating: playbooks/set_test.yml (deflated 35%)\n",
"updating: playbooks/start_cluster.yml (deflated 33%)\n",
"updating: sample_data/geoip.csv (deflated 79%)\n",
"updating: sample_data/geoip.json (deflated 79%)\n",
"updating: sample_data/mapping.txt (deflated 76%)\n",
"updating: sample_data/multi_line.txt (deflated 61%)\n",
"updating: sample_data/single_line.txt (deflated 43%)\n",
"updating: sample_data/tokyo2015.csv (deflated 74%)\n",
"updating: sample_data/useragent.txt (deflated 38%)\n",
"updating: sample_data/weather.csv (deflated 62%)\n",
"updating: sample_data/weather.json (deflated 89%)\n",
"updating: sample_data/weather.ltsv (deflated 50%)\n",
"updating: sample_data/weather.tsv (deflated 62%)\n",
"updating: sample_data/weather_multiline.json (deflated 89%)\n",
"updating: images/01_1server.png (deflated 10%)\n",
"updating: images/01_5server.png (deflated 23%)\n",
"updating: images/01_basic_concept.png (deflated 17%)\n",
"updating: images/01_node_type.png (deflated 7%)\n",
"updating: images/01_server_construction.png (deflated 10%)\n",
"updating: images/03_pipeline.png (deflated 16%)\n",
"updating: images/images.pptx (deflated 19%)\n",
"updating: images/notebooks-filled.svg (deflated 90%)\n",
" adding: scripts/generate-diagram.py (deflated 73%)\n",
" adding: scripts/get-display-contents.py (deflated 49%)\n",
" adding: scripts/get-json-repr.py (deflated 46%)\n",
" adding: scripts/get-replace-file.py (deflated 52%)\n",
" adding: scripts/get-struct-selector.py (deflated 61%)\n"
]
}
],
"source": [
"ref_notebooks = filter(lambda m: m, map(lambda n: re.match(r'([A-Z][0-9][0-9a-z]+_.*)\\.ipynb', n), os.listdir('.')))\n",
"ref_notebooks = sorted(ref_notebooks, key=lambda m: m.group(1))\n",
"!zip ref_notebooks-{datetime.now().strftime('%Y%m%d')}.zip *.ipynb {' '.join(map(lambda n: '\"' + n.group(0) + '\"', ref_notebooks))} logstash_conf/* playbooks/*.yml sample_data/* images/* scripts/* "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"lc_cell_meme": {
"current": "d0293c52-1fd8-11e7-b31a-0242ac12000d",
"next": null,
"previous": "762cc38c-1537-11e7-b31a-0242ac12000d"
}
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"lc_notebook_meme": {
"current": "762caa8c-1537-11e7-b31a-0242ac12000d",
"lc_server_signature": {
"history": []
}
},
"toc": {
"colors": {
"hover_highlight": "#DAA520",
"navigate_num": "#000000",
"navigate_text": "#333333",
"running_highlight": "#FF0000",
"selected_highlight": "#FFD700",
"sidebar_border": "#EEEEEE",
"wrapper_background": "#FFFFFF"
},
"moveMenuLeft": true,
"nav_menu": {
"height": "191px",
"width": "252px"
},
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 4,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": true,
"widenNotebook": false
}
},
"nbformat": 4,
"nbformat_minor": 1
}