Azure HDInsightを使って、大量テキストの集計(3)

シェアする

目次
(1)HDInsight環境準備
(2)データの準備、SQL実行方法の確認
(3)データのロードと、抽出・集計の実行

前回と前々回にて準備が終わりました。今回は、実際にデータのロードと、集計を行っていきたいと思います。

データのロード

それでは、HiveQLを実行する方法も分かったところで、実際のデータ抽出を進めていきたいと思います。
(2015/9/14追記)
外部テーブルとしてアクセスするファイルは、文字コードUTF8で格納しておきます
(UTF16LEで格納したら、デフォルト設定でHiveを動かしたらうまくいきませんでした)

データの格納方法(外部テーブル、内部テーブル)

Hiveでデータを扱うときに、以下の2通りの方法が選べます
  • 元のテキストファイルをそのまま処理対象にする(外部テーブル)Hive内では、テーブル定義情報のみが保存され、データはテキストファイルのまま
    外部テーブルを削除(drop)しても、元のテキストファイルには影響なし
  • ネイティブなフォーマットで格納する(内部テーブル)ORC等の形式を選択でき、サイズの圧縮や、高速スキャンが期待できる
    テーブルを削除(drop)した場合は、当然データが消えます。

そのため、RDBのようにデータのロードは必須ではありませんが、ネイティブなフォーマットにした方が抽出は捗りますね。

今回は、

元データは年・月単位でフォルダーに区分けして、
テキストファイルで保存しておく

Hive用には、ORC形式の内部テーブルを作成する

抽出処理は段階を踏み、中間テーブルへインサートしていく

ことにしました。

また、先人・達人のWebを見ていると、抽出やロード等のETLの流れは、処理を再実行したときに、同じ結果になるように作っておくと、ChefやPowershell DSCが取り入れている冪等性(べきとうせい)のメリットが得られそうです。

ベクター化、Tezの有効化

今回作成したHadoopクラスターは、パフォーマンス向上に役立つ機能が使えるバージョンのため、これらを有効化します。
(デフォルトは、無効化されているため)

--

set hive.execution.engine=tez;

set hive.vectorized.execution.enabled = true;

--

Tezの有効化
https://azure.microsoft.com/ja-jp/documentation/articles/hdinsight-use-hive/#usetez

Hive最適化
https://azure.microsoft.com/ja-jp/documentation/articles/hdinsight-hadoop-optimize-hive-query/

外部テーブルの作成

BLOBストレージに格納したテキスト形式ファイルを、そのまま参照する外部テーブル「mydata_sv01」、「mydata_sv02」の2つを作成します

<データの説明>

  • 以下の2つフォルダーに、sv01とsv02という2台のサーバーで、日ごとに作成されたテキスト形式のログファイルが、複数個格納しています
    /mydata/sv01/
    /mydata/sv02/
  • ログファイルは、1データが1行になっている
  • 1行に、データ項目が29個含まれる
  • 各データ項目は、スペースで区切りられている

--

DROP TABLE mydata_sv01;
DROP TABLE mydata_sv02;

CREATE EXTERNAL TABLE mydata_sv01 (
t1 string, t2 string, t3 string, t4 string, t5 string, t6 string,
t7 string, t8 string, t9 string, t10 string, t11 string, t12 string,
t13 string, t14 string, t15 string, t16 string, t17 string, t18 string,
t19 string, t20 string, t21 string, t22 string, t23 string, t24 string,
t25 string, t26 string, t27 string, t28 string, t29 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION 'wasb:///mydata/sv01/';

CREATE EXTERNAL TABLE mydata_sv02 (
t1 string, t2 string, t3 string, t4 string, t5 string, t6 string,
t7 string, t8 string, t9 string, t10 string, t11 string, t12 string,
t13 string, t14 string, t15 string, t16 string, t17 string, t18 string,
t19 string, t20 string, t21 string, t22 string, t23 string, t24 string,
t25 string, t26 string, t27 string, t28 string, t29 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION 'wasb:///mydata/sv02/';

--

正しく、テーブルが定義されたか確認してみます

--

SELECT * FROM mydata_sv01 LIMIT 100;

SELECT COUNT(*) FROM mydata_sv01;

--

BLOBストレージのデータにアクセスするパス

今回は、Hiveのクラスター作成時に指定したBLOBストレージ内のテキストファイルを指定しましたが、他のストレージを指定することもできます。(そのBLOBストレージが、Publicアクセス等で読み取れることが前提です)

wasb[s]://<ContainerName>@<StorageAccountName>.blob.core.windows.net/<path>/<filename>

詳しくはこちら

データをすべてORC形式の内部テーブルへ格納

内部テーブル「mydata」を定義します。

外部テーブル「mydata_sv01」、「madta_sv02」のデータを抽出(select)し、内部テーブルへ書き込み(insert)ます。

データ項目は、文字列(string)以外も選べますが、今回は必要性がなかったため、すべて文字列にしてます。

--

CREATE TABLE IF NOT EXISTS mydata (
  t1 string, t2 string, t3 string, t4 string, t5 string, t6 string,
  t7 string, t8 string, t9 string, t10 string, t11 string, t12 string,
  t13 string, t14 string, t15 string, t16 string, t17 string, t18 string,
  t19 string, t20 string, t21 string, t22 string, t23 string, t24 string,
  t25 string, t26 string, t27 string, t28 string, t29 string)
STORED AS ORC;

INSERT OVERWRITE TABLE mydata
  SELECT
    t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
    t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29
  FROM mydata_sv01

  UNION ALL

  SELECT
    t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15,
    t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29
  FROM mydata_sv02;

--

抽出・集計の実行

t9ごとに、何件あるか集計

--

select t9, count(*) from mydata group by t9;

--

t13に「google.com」の文字列が含むことを条件に、データ項目t9、t10、t11を抽出

--

SELECT
   t9, t10, t11
 FROM mydata
 WHERE t13 like '%google.com%';

--

ここまで来ると、あとはいつものRDBと同じ感覚で使えますね

お疲れ様でした♪

目次
(1)HDInsight環境準備
(2)データの準備、SQL実行方法の確認
(3)データのロードと、抽出・集計の実行

続編
Azure HDInsight を、もっと使う