ESに、データを取得するために使用後logstash、その後、これらのデータに基づいて、MySQLデータベースからの一致のために、データストリームlogstashにいくつかのデータを追加すると、出力:学ぶために
物事ののIoT時代に、私たちはしばしば、センサから収集されたデータの場合に遭遇します。これらのセンサは、物事は温度や湿度などのデータをアップロードすることができます。これらのセンサは、典型的には、自身のIDを有し、それは、地理的位置などの情報を有していません。場合は、物事へのデータ、当社のデータプラットフォームは、私たちは、データの分析に非常に有用でしょう場所とその他の情報ではそのようなことに加え、その上に私たちのデータなどのデータを、アップ収集豊富なデータを続けていくことを願っています。これらは通常、MySQLデータベースなどのリレーショナルデータベース内のテーブルに格納されたデータの富を必要としています。今日の記事では、我々は、我々のデータを豊かにするためにjdbc_streamlineを使用する方法について説明します。
インストールLogstash
MySQLをインストールします
インポートデータへのMySQL Elasticsearchに独自のMySQLデータベースをインストールして設定するには良い」インチディレクトリ内の適切なファイルに対応したコネクタを覚えておいてください。
私たちのMySQLをインストールした後、データと呼ばれるデータベースを作成し、センサーと呼ばれるテーブルを作成します
ここでは、レコードを作成します。このレコードは、私たちのもののデータを豊かにするために使用されています。入ってくるセンサデータとid idは、この表と一致する場合は、この表のデータは、私たちのイベントデータを豊かにするために、イベントに追加されます。
Logstashプロフィール
私たちは、最初にこののlogstash_jdbc_streaming.conという設定ファイルを定義し、ディレクトリ内の彼のいずれかのファイルに入れて、例えば、私は、データと呼ばれる自分のディレクトリに保存します。
# data/logstash_jdbc_streaming.conf
input {
http {
id => "sensor_data_http_input"
user => "sensor_data"
password => "sensor_data"
}
}
output {
stdout {
codec => rubydebug
}
}
ここでは、HTTPと呼ばれる入力を使用しています。HTTP入力基準文書https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http.htmlビットプラグイン。
私たちはただIDを指定したので、ここでは、以来、私たちは、デフォルト設定のHTTP入力プラグインを使用しています。それは公共のインターネット上で、どこからでも送信データにセンサーを可能にしますよう私たちは、このHTTPエンドポイントの安全性を保護する必要があります。私たちは、パラメータ、ユーザー名とパスワードは、この目的を保護するために必要なユーザー名とパスワードを設定することができます。
私たちは、最初のLogstashを開始することができます。インストールディレクトリにLogstash実行します。
./bin/logstash -f ~/data/logstash_jdbc_streaming.conf
この入力プラグイン開始Logstashを使用する場合は、指定されたユーザー名とパスワードを基本認証の保護にHTTPサーバを使用して、ポート8080でHTTPサーバを起動します。次のように私たちは、このカールLogstashパイプラインを要求するコマンドを使用することができます。
curl -XPOST -u sensor_data:sensor_data --header "Content-Type:application/json" "http://localhost:8080/" -d '{"id":1,"time":1512102540000,"reading":17.00}'
我々は上記のコマンドを実行すると、我々は結果を端末Logstashランニングに表示され見ることができます。
豊富なデータをjdbc_streaming使用
次に、我々は、センサーからの我々のデータを豊かにします。まず第一に、私たちはさらに私たちのLogstash設定ファイルを変更する必要があります。
# cat data/logstash_jdbc_streaming.conf
input {
http {
id => "sensor_data_http_input"
user => "sensor_data"
password => "sensor_data"
}
}
filter {
jdbc_streaming {
jdbc_connection_string => "jdbc:mysql://localhost:3306/data?useTimezone=true&&serverTimezone=UTC"
jdbc_user => "root"
jdbc_password => "YourDatabasePassword"
jdbc_validate_connection => true
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
parameters => { "sensor_identifier" => "id"}
statement => "select * from sensors where id= :sensor_identifier"
target => lookupResult
}
}
output {
stdout {
codec => rubydebug
}
}
ここでは、ことに注意する必要があります。
- JDBCコネクタを設定するときは、Logstashの下で、対応するドライブのインストールディレクトリにコピーする必要があります
$ pwd
/Users/liuxg/elastic/logstash-7.3.0
(base) liuxg:logstash-7.3.0 liuxg$ ls ./logstash-core/lib/jars/mysql-connector-java-8.0.17.jar
./logstash-core/lib/jars/mysql-connector-java-8.0.17.jar
- また、設定ファイルでは、ないのconfigure jdbc_driver_libraryこのアイテムを行います。そうでなければ、私たちは、次のエラーメッセージが表示されることがあります
[2019-10-10T14:41:53,015][ERROR][logstash.javapipeline ] Pipeline aborted due to error {:pipeline_id=>"main", :exception=>#<TypeError: failed to coerce jdk.internal.loader.ClassLoaders$AppClassLoader to java.net.URLClassLoader>, :backtrace=>["org/jruby/java/addons/KernelJavaAddons.java:29:in `to_java'", "/Users/liuxg/elastic/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-filter-jdbc_streaming-1.0.7/lib/logstash/plugin_mixins/jdbc_streaming.rb:48:in `prepare_jdbc_connection'", "/Users/liuxg/elastic/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-filter-jdbc_streaming-1.0.7/lib/logstash/filters/jdbc_streaming.rb:200:in `prepare_connected_jdbc_cache'", "/Users/liuxg/elastic/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/logstash-filter-jdbc_streaming-1.0.7/lib/logstash/filters/jdbc_streaming.rb:116:in `register'", "org/logstash/config/ir/compiler/AbstractFilterDelegatorExt.java:56:in `register'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:192:in `block in register_plugins'", "org/jruby/RubyArray.java:1792:in `each'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:191:in `register_plugins'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:463:in `maybe_setup_out_plugins'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:204:in `start_workers'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:146:in `run'", "/Users/liuxg/elastic/logstash-7.3.0/logstash-core/lib/logstash/java_pipeline.rb:105:in `block in start'"], :thread=>"#<Thread:0x3fa8c5a3 run>"}
ランタイムエラーが発生した場合は、タイムゾーンのエラーは、JDBC要求serverTimezoneに追加する必要があるなど
私たちは、上記のステップを完了すると、私たちはLogstashを再実行します。
./bin/logstash -f ~/data/logstash_jdbc_streaming.conf
別の端末では、次のコマンドを入力します。
curl -XPOST -u sensor_data:sensor_data --header "Content-Type:application/json" "http://localhost:8080/" -d '{"id":1,"time":1512102540000,"reading":17.00}'
私たちは、Logstashの次の出力端子を見ることができます。
上記では、我々はにlookupResultで豊富なデータがあったことがわかります。我々はさらに、当社のコンフィギュレーションファイル、およびライブラリ更なる処理の領収書から収集したデータを変換することができます。
# cat data/logstash_jdbc_streaming.conf
input {
http {
id => "sensor_data_http_input"
user => "sensor_data"
password => "sensor_data"
}
}
filter {
jdbc_streaming {
jdbc_connection_string => "jdbc:mysql://localhost:3306/data?useTimezone=true&&serverTimezone=UTC"
jdbc_user => "root"
jdbc_password => "YourDabaePassword"
jdbc_validate_connection => true
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
parameters => { "sensor_identifier" => "id"}
statement => "select * from sensors where id= :sensor_identifier"
target => lookupResult
}
mutate {
rename => {"[lookupResult][0][sensorType]" => "sensorType"}
rename => {"[lookupResult][0][customer]" => "customer"}
rename => {"[lookupResult][0][department]" => "department"}
rename => {"[lookupResult][0][buildingName]" => "buildingName"}
rename => {"[lookupResult][0][room]" => "room"}
rename => {"[lookupResult][0][floor]" => "floor"}
rename => {"[lookupResult][0][locationOnFloor]" => "locationOnFloor"}
add_field => {
"location" => "%{[lookupResult][0][latitude]},%{[lookupResult][0][longitude]}"
}
remove_field => ["lookupResult", "headers", "host"]
}
}
output {
stdout {
codec => rubydebug
}
}
Logstash再実行して我々のアプリケーション、および別の端末でcurlコマンドに、あなたはこれが私たちのデータ変換の結果であることがわかります。我々は、同時に、我々は必要とする場所フィールドの組み合わせに緯度と経度の情報を持っている、データのビットが必要とされない除去しました。私たちの調査の未来のための便利な場所を提供します。
Elasticsearchへの出力
これまでのところ、私たちは私たちが唯一のデバッガを使用し、stdoutに私たちのデータを示しています。我々はさらに、当社のコンフィギュレーション・ファイルを変換することができます。
cat data/logstash_jdbc_streaming.conf
input {
http {
id => "sensor_data_http_input"
user => "sensor_data"
password => "sensor_data"
}
}
filter {
jdbc_streaming {
jdbc_connection_string => "jdbc:mysql://localhost:3306/data?useTimezone=true&&serverTimezone=UTC"
jdbc_user => "root"
jdbc_password => "YourPassword"
jdbc_validate_connection => true
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
parameters => { "sensor_identifier" => "id"}
statement => "select * from sensors where id= :sensor_identifier"
target => lookupResult
}
mutate {
rename => {"[lookupResult][0][sensorType]" => "sensorType"}
rename => {"[lookupResult][0][customer]" => "customer"}
rename => {"[lookupResult][0][department]" => "department"}
rename => {"[lookupResult][0][buildingName]" => "buildingName"}
rename => {"[lookupResult][0][room]" => "room"}
rename => {"[lookupResult][0][floor]" => "floor"}
rename => {"[lookupResult][0][locationOnFloor]" => "locationOnFloor"}
add_field => {
"location" => "%{[lookupResult][0][latitude]},%{[lookupResult][0][longitude]}"
}
remove_field => ["lookupResult", "headers", "host"]
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["localhost:9200"]
index => "sensor_data-%{+YYYY.MM.dd}"
user => "elastic"
password => "elastic"
}
}
今回は、出力としてelasticsearchを追加しました。私たちのKibanaを見ることができます開き、我々が正常に出力データがElasticsearchに入れています。
実際の使用では、我々は継続的に豊かだったモノのインターネットから収集し、このjdbc_streaming我々のデータを使用することができます。