Jan 4, 2019

Try Apache Griffin

Currently, Griffin doesn't provide the binary, therefore you need to build it yourself. It's not difficult though. I tried it on hortonworks:sandbox-hdp container. Even if you're using default environment, additional steps are just adding Spark on Ambari and installing maven.

# Add Spark
login ambari (http://localhost:8080/#/login)
Spark2 -> Service Actions -> Start

# Login to hortonworks:sandbox-hdp using bash
docker exec -it sandbox-hdp bash

# Install maven if not installed on there
wget http://ftp.riken.jp/net/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
tar -xvf apache-maven-3.6.0-bin.tar.gz
cd apache-maven-3.6.0
mv apache-maven-3.6.0 /opt/apache-maven-3.6.0
vi /etc/environment
  M2_HOME="/opt/apache-maven-3.6.0"
  export PATH=$M3:$PATH

sudo update-alternatives --install "/usr/bin/mvn" "mvn" "/opt/apache-maven-3.6.0/bin/mvn" 0
sudo update-alternatives --set mvn /opt/apache-maven-3.6.0/bin/mvn

# Install griffin (http://griffin.apache.org/docs/quickstart.html)
wget https://www.apache.org/dist/incubator/griffin/0.3.0-incubating/griffin-0.3.0-incubating-source-release.zip
unzip griffin-0.3.0-incubating-source-release.zip
cd griffin-0.3.0-incubating
mvn clean install
  It takes about few minutes (my case was 14 min) and the size will be 660MB.
mv measure/target/measure-0.3.0-incubating.jar /usr/local/griffin-measure.jar

# Prepare demo data
wget --recursive --no-parent http://griffin.apache.org/data/batch
cd griffin.apache.org/data/batch
chmod +x *.sh
./gen_demo_data.sh

hive
CREATE EXTERNAL TABLE `demo_src`(
  `id` bigint,
  `age` int,
  `desc` string)
PARTITIONED BY (
  `dt` string,
  `hour` string)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '|'
;

CREATE EXTERNAL TABLE `demo_tgt`(
  `id` bigint,
  `age` int,
  `desc` string)
PARTITIONED BY (
  `dt` string,
  `hour` string)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '|'
;


LOAD DATA LOCAL INPATH 'demo_src' INTO TABLE demo_src PARTITION (dt='20180912',hour='09');
LOAD DATA LOCAL INPATH 'demo_tgt' INTO TABLE demo_tgt PARTITION (dt='20180912',hour='09');

# Create config file
vi env.json
{
  "spark": {
    "log.level": "WARN"
  },
  "sinks": [
    {
      "type": "console"
    },
    {
      "type": "hdfs",
      "config": {
        "path": "hdfs:///griffin/persist"
      }
    },
    {
      "type": "elasticsearch",
      "config": {
        "method": "post",
        "api": "http://es:9200/griffin/accuracy"
      }
    }
  ]
}


vi dq.json
{
  "name": "batch_accu",
  "process.type": "batch",
  "data.sources": [
    {
      "name": "src",
      "baseline": true,
      "connectors": [
        {
          "type": "hive",
          "version": "1.2",
          "config": {
            "database": "default",
            "table.name": "demo_src"
          }
        }
      ]
    }, {
      "name": "tgt",
      "connectors": [
        {
          "type": "hive",
          "version": "1.2",
          "config": {
            "database": "default",
            "table.name": "demo_tgt"
          }
        }
      ]
    }
  ],
  "evaluate.rule": {
    "rules": [
      {
        "dsl.type": "griffin-dsl",
        "dq.type": "accuracy",
        "out.dataframe.name": "accu",
        "rule": "src.id = tgt.id AND src.age = tgt.age AND src.desc = tgt.desc",
        "details": {
          "source": "src",
          "target": "tgt",
          "miss": "miss_count",
          "total": "total_count",
          "matched": "matched_count"
        },
        "out": [
          {
            "type": "metric",
            "name": "accu"
          },
          {
            "type": "record",
            "name": "missRecords"
          }
        ]
      }
    ]
  },
  "sinks": ["CONSOLE", "HDFS"]
}

# Run !
spark-submit --class org.apache.griffin.measure.Application --master yarn --deploy-mode client --queue default --driver-memory 1g --executor-memory 1g --num-executors 2 /usr/local/griffin-measure.jar /env.json /dq.json

# Result
data source timeRanges: src -> (1544668358323, 1544668358323], tgt -> (1544668358323, 1544668358323]
[1544668358323] batch_accu start: application_1544490410222_0011
batch_accu [1544668358323] metrics:
{"name":"batch_accu","tmst":1544668358323,"value":{"total_count":125000,"miss_count":512,"matched_count":124488}}

# Check above miss_count manually
select
 count(src.id) as total_count
 ,sum(if(tgt.id is null, 1, 0)) as miss_count
 ,sum(if(tgt.id is not null, 1, 0)) as matched_count
from demo_src src
left outer join demo_tgt tgt
on src.id = tgt.id AND src.age = tgt.age AND src.desc = tgt.desc
;

total_count, miss_count, matched_count
125000, 512, 124488

# Generated files on HDFS
[[email protected] /]# hdfs dfs -ls /griffin/persist/batch_accu/1544668358323
Found 5 items
-rw-r--r--   1 root hdfs          0 2018-12-13 02:33 /griffin/persist/batch_accu/1544668358323/_FINISH
-rw-r--r--   1 root hdfs        137 2018-12-13 02:33 /griffin/persist/batch_accu/1544668358323/_LOG
-rw-r--r--   1 root hdfs        113 2018-12-13 02:33 /griffin/persist/batch_accu/1544668358323/_METRICS
-rw-r--r--   1 root hdfs         30 2018-12-13 02:32 /griffin/persist/batch_accu/1544668358323/_START

-rw-r--r--   1 root hdfs      44543 2018-12-13 02:33 /griffin/persist/batch_accu/1544668358323/missRecords


hdfs dfs -cat /griffin/persist/batch_accu/1544668358323/_FINISH
(empty)

hdfs dfs -cat /griffin/persist/batch_accu/1544668358323/_LOG
================ log of Thu Dec 16 02:32:38 UTC 2018 ================
--- Thu Dec 16 02:33:18 UTC 2018 ---
process using time: 40444 ms


hdfs dfs -cat /griffin/persist/batch_accu/1544668358323/_METRICS
{"name":"batch_accu","tmst":1544668358323,"value":{"total_count":125000,"miss_count":512,"matched_count":124488}}


hdfs dfs -cat /griffin/persist/batch_accu/1544668358323/_START
application_1544490410222_0011



hdfs dfs -cat /griffin/persist/batch_accu/1544668358323/missRecords
{"id":124,"age":1273,"desc":"1273","dt":"20180912","hour":"09","__tmst":1544668358323}
{"id":124,"age":1065,"desc":"1065","dt":"20180912","hour":"09","__tmst":1544668358323}
{"id":124,"age":1798,"desc":"1798","dt":"20180912","hour":"09","__tmst":1544668358323}

Jan 1, 2019

Throw Back 2018


On
夏頃から転職活動を始めたこともあって、後半は仕事に集中できていたかと言われると怪しいなぁという1年でした。2018年はSQL, Java, Python, Javascriptとまんべんなく触っていたように思います。転職先ではJava, Pythonを書く量が多そうかなという印象です。
Off
今自分1人で住んでる実家の売却が決まってバタバタした1年でした。3月末までに引っ越す予定なので、そろそろ家を探さねば...。意識的に変化を起こそうといつもとは違う選択した年でもあり、iPhoneからPixelに変えたのもそういう表れだったりします。音楽を聴く量が増え、ゲームをやる時間はだいぶ減りました。

Music
  • RETURN TO SENDER
  • CAND¥¥¥LAND feat. LIZ (Pa's Lam System Remix)
  • 衣替え feat. BONNIE PINK
  • くりかえしのMUSIC feat. 岸田繁(くるり)- tofubeats REMIX
去年はtofubeatsの曲をひたすら聴いてました。今年こそはライブに行きたい...!

Book
  • 人間のように泣いたのか?
  • NETFLIXの最強人事戦略
  • シンドローム
  • 天空の矢はどこへ?
  • 暗号解読
  • 君の名は。
  • 君の名は。 Another Side:Earthbound
  • ニューエリート グーグル流・新しい価値を生み出し世界を変える人たち
  • 世界一速く結果を出す人は、なぜ、メールを使わないのか
  • 集中力はいらない
  • 女王の百年密室―GOD SAVE THE QUEEN―
  • 血か、死か、無か?
  • サルたちの狂宴
  • Effective Java 第3版
  • Java 逆引きレシピ
  • Javaによる関数型プログラミング
  • Go言語でつくるインタプリタ
  • Hadoop徹底入門
  • C++ プログラミング入門
ついにWシリーズが終わってしまって悲しい...。でも最終巻の"人間のように泣いたのか?"の終わり方はすごく好きな感じでホッとしました。勉強関連の本はJavaを中心に、気晴らしにC++の本を買ってみました。

Comic
  • それでも町は廻っている
  • VINLAND SAGA
  • BANANA FISH
  • ベルセルク
  • Jドリーム
  • AIの遺電子 RED QUEEN
  • さよなら私のクラマー
  • さよならフットボール
  • 日常
  • アルスラーン戦記
  • ヒナまつり
  • ダンジョン飯
  • タヌキとキツネ
  • 約束のネバーランド
  • NEW GAME!
  • 進撃の巨人
  • BLUE GIANT SUPREME
  • 岡崎に捧ぐ
  • 山本さんちのねこの話
  • 無慈悲な8bit
  • 静かなるドン
  • 囚人リク
  • 鮫島、最後の十五日
  • 3月のライオン
  • うちのトイプーがアイドルすぎる
  • まどろみマーメイド
"岡崎に捧ぐ"が面白くて、山本さほさんの本をまとめ買いしました。それ町は日常系だけど、だたほのぼのしてるだけでなく途中現実的な描写もあって、よつばと!とは違う面白さがあります。

Movie
Netflixやhuluを解約したのもあってあまり映画は観なかったんですが、シュガーラッシュは前作が好きだったので、上映開始日に観に行きました。 レビューを眺めてたところ、これは"プリンセスの再定義だ"と言ってる方がいてなるほどな〜と思いました。

Game
  • Red Dead Redemption 2
  • Shadow of the Tomb Raider
  • Spider-Man
  • Fallout 76
  • The Legend of Zelda: Breath of the Wild
ゲームは重めなものを4つ買ってみたもののSpider-ManとFalloutは酔いがひどく途中で止めちゃいました。RDR2は前作やっていなかったこともあり新鮮でした。

Gadget
  • Google Pixel 3
  • iPhone XS
  • Clova Friends Mini (Brown) + Clova Friends Dock
  • デロンギ オイルヒーター
  • Beats X 
  • LG 4K ディスプレイ
  • Apple Pencil
Pixel 3を買おうとしたところ手元に届くまで1ヶ月近くかかるということでiPhone XSを買ったんですが、重くて手に馴染まないのとちょうど長めの風邪を引いてFace IDが使えない不便さもあって結局Pixel 3を買いました。カメラが綺麗で写真撮るのが楽しいです。