Apache HiveをElasticSearchと一緒に使用する

Apache HiveをElasticSearchと一緒に使用する

  • オーケストレーション
6分で読めます 更新日 Oct 24, 2017

ポイント: Apache HiveをElasticSearchとともに使用することで、ウェブサーバーログに対してSQLクエリを実行することによりデータ分析が強化されます。このガイドは、インストール、設定、およびデータロードプロセスの詳細を説明します。

  • Hiveは、データ管理の改善のためにSQLクエリとユーザー定義関数を可能にします。
  • ElasticSearchは、ログの保存とクエリに不可欠であり、サイバーセキュリティおよび運用監視のための重要な要素です。

ここでは、Apache HiveをElasticSearchで使用する方法を説明します。ApacheウェブサーバーログをElasticSearchにコピーし、その後Hive SQLを使用してクエリを実行します。

なぜこれをするのか?Hiveを使用すると、ユーザー定義関数を記述し、SQL(実際にはHQL)を使用でき、ElasticSearchのクエリ言語であるLucene Queryよりも簡単に作業でき、より多くの機能を提供します。たとえば、Hiveを使用するとデータセットを結合できます。また、Spark ML(機械学習)や他のツールを使用してHiveに対して高度な分析を実行できます。

以前にも指摘したように、いくつかのチュートリアルはHiveデータをElasticSearchに保存する方法を示すために書かれています。しかし、それは論理的ではありません。ESの全体的な目標は、ウェブサーバーやファイアウォールなどからログを収集し、それらを1つの場所(ES)に置き、クエリを実行できるようにすることです。これはサイバーセキュリティおよび運用監視のためのものです。

ElasticSearchは、ESドキュメントを読み書きできるelasticsearch-hadoopコネクタを提供しています。それを行うと、ESからHiveテーブルにデータが作成されます。HiveはESにデータを保存しません。

Hiveのインストール

まず、これらの手順を使用してHiveをインストールします。この後、MySQLが実行されます。実行されていない場合は、Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientというエラーが表示されます。

そしてHadoopをインストールします。

次に、Hive-Hadoopコネクタをダウンロードし、$HIVE_HOME/libにコピーします。

    cp /home/walker/Documents/jars/elasticsearch-hadoop-5.5.2.jar $HIVE_HOME/lib

start-dfs.shを使用してHadoopを開始します。クラスターで実行する場合は、Yarnも起動する必要があります。

Hiveを開始

次のようにHiveを開始します:

    hive

また、デバッグモードで実行して、インストールのエラーを確認し、修正することもできます。たとえば、コネクタjarをlibフォルダーにコピーし忘れると、クラスが見つからないというエラーが発生します。

    hive --hiveconf hive.root.logger=DEBUG,console

ここでstdoutを確認することもできます /tmp/(あなたのユーザーID)/hive.log

ElasticSearchをインストールし、データをロードする

ESのインストール方法の説明はこのデータの範囲を超えています。彼らの指示に従うことができますこちら。

サンプルデータをダウンロードしてアップロード

分析するためのデータが必要です。サンプルApacheログをこちらからダウンロードできます。

これを解凍するにはunrarをインストールする必要があります:

    unrar x apache-access_log.rar

次に、こちらからこのApache logstash設定をコピーし、apache.confという名前を付けます。それをlogstashインストールのルートフォルダーに置きます。

    input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}< filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => rubydebug }
}

次に、その設定ファイルでlogstashを開始します。

    bin/logstash -f apache.conf

次に、apache.confファイルに示された/tmp/access_logファイルパスにデータをコピーします。

    cp access_log /tmp/

画面は、logstashが作業を開始するに従って、次のように出力をエコーし始めます:

    {
"path" => "/tmp/access_log",
"@timestamp" => 2017-09-21T12:16:33.346Z,
"@version" => "1",
"host" => "eurovps",
"message" => "d97082.upc-d.chello.nl - - [12/Mar/2004:13:25:45 -0800] \"GET /SpamAssassin.html HTTP/1.1\" 200 7368\r",
"type" => "apache_access",
"tags" => [
[0] "_grokparsefailure"
]
}

今、コマンドラインからESをクエリすると、新しいインデックスとドキュメントのカウントを見ることができるはずです:

    curl http://localhost:9200/_cat/indices?v
health status index      uuid      pri rep docs.count docs.deleted store.size pri.store.size
yellow open logstash-2017.09.21 DBRrjIlvQtG67ddb7qUnxw 5 1 1550

次に、Kibanaを開いて、そこでもデータを確認します。

次に、次のようにテーブルを作成してHiveにこのデータを読み込むように指示します:

    CREATE EXTERNAL TABLE apachelog (
path string,
timex timestamp,
Version int,
Host string,
Message string,
Index string
)
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES( 'es.nodes.wan.only' = 'true', 'es.resource' = 'logstash-2017.09.21', 'es.query' = '?q=*');

es.resourceはESインデックスです。

Es.nodes.wan.onlyは、ネットワーク接続の問題を解決します(つまり、Hiveがそれについて文句を言った場合)。

ホストはlocalhostにデフォルト設定されます。

ESはこれを作成します:

    describe apachelog;
OK
path          string          from deserializer
timex         timestamp       from deserializer
version       int             from deserializer
host          string          from deserializer
message       string          from deserializer
index         string          from deserializer

今、私たちはgrokを正しく設定していないため、Apacheのメッセージフィールドを解析しませんでした。しかし、次のようにIPアドレスを自分で取り出すことができます:

    select regexp_extract(message, '^([0-9]{1,3}\\.){3}[0-9]{1,3}',0) as ip from apachelog;

今、どのIPアドレスがウェブサーバーに最も多くアクセスしているかを示すクエリを実行できます。これは2つのステップで行います:

  1. 中間テーブルiptabを作成します。
  2. テーブルiptabにクエリを実行します。

ここにカウントがあります:

    create table iptab as select regexp_extract(message, '^([0-9]{1,3}\\.){3}[0-9]{1,3}',0) as ip from apachelog;

ここにカウントがあります:

    select count(ip) as c, ip from iptab group by ip order by c desc;
452        64.242.88.10
270         10.0.0.153
20                    207.195.59.160
14                    128.227.88.79
14                   212.92.37.62
13                    203.147.138.233
12                    195.246.13.119
7          145.253.208.9
7          142.27.64.35
4          194.151.73.43
4          61.165.64.6
4          80.58.14.235
4          208.247.148.12
3          67.131.107.5
3          61.9.4.61
3          80.58.33.42
2          200.160.249.68
1          80.58.35.111
1          66.213.206.2
1          64.246.94.152
1          64.246.94.141
1          4.37.97.186
1          219.95.17.51
1          216.139.185.45
1          213.181.81.4
1          200.222.33.33
1          195.230.181.122
1          195.11.231.210
1          12.22.207.235
1          212.21.228.26

これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。

オーケストレーションの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。