S-JIS[2023-10-02/2023-10-08] 変更履歴

Embulk Hadoop SequenceFileの入力

EmbulkのSequenceFile読み込みのメモ。


概要

HadoopSequenceFileを読み込むパーサープラグインを作ってみた。
プラグイン名はembulk-parser-hadoop-seqfile。

このプラグインはEmbulk 0.10以降で、Java8以降に対応。
ただしJava8の場合、jre1.8には対応しておらず、jdk1.8のjavaコマンドを使用する必要がある。
(Embulk用のWritableクラスを生成する為にToolProvider.getSystemJavaCompiler()を使っているんだけど、jre1.8ではこれがnullを返すので使えない)
Java9以降では使用できるらしい(Java11で動作確認済み)。


読み込む元のファイルはファイル入力プラグイン(ローカルファイルとか)で指定する。

このプラグインを使う為には、embulk-parser-hadoop-seqfileプラグインをインストールしておく必要がある。


インストール方法

Embulk 0.10以降ではgemを使わないインストール方法になったが、公式なインストール方法は発表されていない。
とりあえず以下のようにすればインストールできる。(この例では、バージョンは0.1.0。最新バージョンはMavenセントラルリポジトリーで確認できる)

  1. プラグイン本体と依存ライブラリーをMavenローカルリポジトリーにインストールする。[2023-10-08]
    $ export m2_repo=〜
    $ mvn dependency:get -Dartifact=io.github.hishidama.embulk:embulk-parser-hadoop-seqfile:0.1.0
  2. Embulkのプロパティーファイル(Linuxの場合は$HOME/.embulk/embulk.properties、Windowsの場合は%USERPROFILE%\.embulk\embulk.properties)に設定を追加する。
    plugins.parser.hadoop_seqfile=maven:io.github.hishidama.embulk:hadoop-seqfile:0.1.0

WordCountの例

key: Text, value: IntWritbleのSequenceFileを読み込む例。

config.yml:

in:
  type: file
  path_prefix: /tmp/example/wordcount.dat
  parser:
    type: hadoop_seqfile
    key_class: org.apache.hadoop.io.Text
    value_class: org.apache.hadoop.io.IntWritable
    columns:
    - {name: word, type: string, key: true, wtype: text}
    - {name: count, type: long, key: false, wtype: int}

out:
  type: stdout

key_classとvalue_classでSequenceFileのキークラス名と値クラス名を指定する。
これはSequenceFile内に保持されているクラス名と一致しなければならない。

columnsの「key: true」でキーのカラム名とデータ型を指定する。
「key: false」で値のカラム名とデータ型を指定する。

wtypeでSequenceFileのWritableのデータ型を指定する。textはTextで、intはIntWritable。
ただ、実のところ、key_classとvalue_classがシンプルな(1カラム分の)Writableクラスの場合は、wtypeは無視され、key_class・value_classで指定したWritableがそのまま使われる。


Asakusa Frameworkのデータモデルの例

key: NullWritable, value: Asakusa FrameworkのデータモデルのSequenceFileを読み込む例。

config.yml:

in:
  type: file
  path_prefix: /tmp/example/datamodel.dat
  parser:
    type: hadoop_seqfile
    value_class: com.example.asakusafw.dmdl.model.WordCount
    columns:
    - {name: word, type: string, wtype: stringOption}
    - {name: count, type: long, wtype: intOption}

out:
  type: stdout

key_class(およびvalue_class)は、NullWritableの場合は省略できる。
値用のcolumnsの「key: false」も省略可能。

Asakusa Frameworkのデータモデルクラスの各フィールドはWritableクラスになっている。
wtypeのstringOptionがAsakusaFWのStringOptionクラス、intOptionはIntOptionクラス。


Embulk目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま