Apache Beam 入門(1) ~テキスト読み書き~

# 全体の目的

Apache Beam の簡単なプログラムを作成して，仕組みを理解していく

# 今回の目的
ローカルのテキストファイルを読み込んでそのまま書き出すプログラムを作成する

# 本編

## 環境

```:IntelliJ
IntelliJ IDEA 2017.3.3 (Ultimate Edition)
Build #IU-173.4301.25, built on January 16, 2018
Licensed to kaito iwatsuki
Subscription is active until January 24, 2019
For educational use only.
JRE: 1.8.0_152-release-1024-b11 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.12.6
```
Maven : 3.5.2

## 手順

### 準備

* File => New => Project...

[![https://gyazo.com/d68a0b28e4f5a49ddcf77b8ae350ddb3](https://i.gyazo.com/d68a0b28e4f5a49ddcf77b8ae350ddb3.png)](https://gyazo.com/d68a0b28e4f5a49ddcf77b8ae350ddb3)

* Maven を選択し，`Project SDK` は `1.8` \<Next\>

*  `GroupId` と `ArtifactId` を入力し \<Next\> (今回はどちらも`beamSample`)

* `Project name` を入力し \<Finish\> (今回は`beamSampleProject`)

* `~/beamSample/src/main/java/SimpleBeam.java`を追加

[![https://gyazo.com/9f3c75bb7289d485d09bee88b662663b](https://i.gyazo.com/9f3c75bb7289d485d09bee88b662663b.png)](https://gyazo.com/9f3c75bb7289d485d09bee88b662663b)

```java:SimpleBeam.java
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.values.PCollection;

public class SimpleBeam {
    public static void main(String[] args){
        PipelineOptions options = PipelineOptionsFactory.create();

        Pipeline p = Pipeline.create(options);
        // テキスト読み込み
        PCollection<String> textData = p.apply(TextIO.read().from("Sample.txt"));
        // テキスト書き込み
        textData.apply(TextIO.write().to("wordcounts"));
        // Pipeline 実行
        p.run().waitUntilFinish();
    }
}

```

依存関係が解決されていないライブラリは適宜，`command` + クリックして画像のようにAddしてください．

[![https://gyazo.com/62d3d70f83834da1d5cd610a056d2333](https://i.gyazo.com/62d3d70f83834da1d5cd610a056d2333.png)](https://gyazo.com/62d3d70f83834da1d5cd610a056d2333)

[![https://gyazo.com/323bde1aca3e1cff001c792f0f80e767](https://i.gyazo.com/323bde1aca3e1cff001c792f0f80e767.png)](https://gyazo.com/323bde1aca3e1cff001c792f0f80e767)

* `~/beamSample/Sample.txt`を追加(読み取り用テキスト)

[![https://gyazo.com/c31e09c23800d61222d87624844c8be3](https://i.gyazo.com/c31e09c23800d61222d87624844c8be3.png)](https://gyazo.com/c31e09c23800d61222d87624844c8be3)

### 実行

* 右上のプルダウンメニューから `Edit Configurations...` を選択

[![https://gyazo.com/c8896bc73119d76b1d95e2b75e510819](https://i.gyazo.com/c8896bc73119d76b1d95e2b75e510819.png)](https://gyazo.com/c8896bc73119d76b1d95e2b75e510819)

* 左上の`+` => Maven を選択

[![https://gyazo.com/cb53ea8efadaf6e488f9fe5acc2cdf52](https://i.gyazo.com/cb53ea8efadaf6e488f9fe5acc2cdf52.png)](https://gyazo.com/cb53ea8efadaf6e488f9fe5acc2cdf52)

* 任意の `Name` を選択
* `Working directory` が `~/beamSample` に設定
* `Command line` に `compile exec:java -Dexec.mainClass=SimpleBeam`を入力
    * [こちら](http://web-dev.hatenablog.com/entry/maven/plugin/exec-java)を参考にさせていただきました
* \<OK\>

[![https://gyazo.com/3c554c5e5c91074019bf8efc3dbab101](https://i.gyazo.com/3c554c5e5c91074019bf8efc3dbab101.png)](https://gyazo.com/3c554c5e5c91074019bf8efc3dbab101)

* 右上のプルダウンが作成したものになっているか確認し，実行ボタンをクリック

[![https://gyazo.com/666109229175f8ffa1ca57640a0a1e88](https://i.gyazo.com/666109229175f8ffa1ca57640a0a1e88.png)](https://gyazo.com/666109229175f8ffa1ca57640a0a1e88)

出力が以下のようになっており，`~/beamSample`ディレクトリ内に``wordcounts-.*`ファイルが作成されていたら成功

```
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.827 s
[INFO] Finished at: 2018-02-27T02:46:10+09:00
[INFO] Final Memory: 21M/373M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0
```

[![https://gyazo.com/01ec441970c699e8a2d440f1b1c9e667](https://i.gyazo.com/01ec441970c699e8a2d440f1b1c9e667.png)](https://gyazo.com/01ec441970c699e8a2d440f1b1c9e667)

## つまりそうなところ

今回は特筆して躓きそうなところは無いけれど，IntelliJの中身の理解が浅いので，未知のエラーで焦ることは何度かあった．けれど，大半は依存関係が解決できてないのが原因だったので，`Add_Maven`すればなんとかなった．

## 次回以降

今回は動かしただけになってしまったので，次回以降はMapReduceの考え方のおさらいも兼ねて簡単なPipelineを構成したい．