イクジニアブログ

育児 + エンジニア = イクジニア

CDH5.4 Hiveでのカラムずれ問題

ビールはキリン党のにいやんです。こんばんわ。

一番搾りが好きですが、プリン体がラガーの方が少ないと聞き、ラガーに浮気しようかと・・・

さてさて、先日CDH5.4のアップデート方法を書いて、特に問題なかったぜ!って思ったのですが。 後から大問題が確認されました。。。

なんとHiveのバグを思いっきり踏んでいたらしく、selectした際のカラムずれが起きてました...orz

バグは以下のチケットにあがっています。

[HIVE-9613] Left join query plan outputs wrong column when using subquery - ASF JIRA

どのようなバグかざっくりいうと、
「left outer joinを繰り返すと、select したのと違うカラムが表示される場合がある」
という、なんとも悲惨なバグです。

すでにチケットはクローズされ、Hive1.2では修正されているようなのですが、CDH5.4.2ではbackportされていないようで、バグが出てしまうようです。

回避策としてはleft outer join をする度に別名をつけると回避できるようです。

バグが出るSQL(バグのチケットより抜粋)

select
    a.category,
    a.city,
    a.rank,
    b.src_category_en,
    c.src_city_name_en
from
    hivetemp.category_city_rank a
left outer join
(select
    src_category_en,
    dst_category_en
from
    hivetemp.category_match) b
on  a.category = b.dst_category_en
left outer join
(select
    src_city_name_en,
    dst_city_name_en
from
    hivetemp.city_match) c
on  a.city = c.dst_city_name_en

以下のように修正することで回避

select
    aa.category,
    aa.city,
    aa.rank,
    aa.src_category_en,
    c.src_city_name_en
from
(
select
    a.category,
    a.city,
    a.rank,
    b.src_category_en
from
    hivetemp.category_city_rank a
left outer join
(select
    src_category_en,
    dst_category_en
from
    hivetemp.category_match) b
on  a.category = b.dst_category_en
) aa
left outer join
(select
    src_city_name_en,
    dst_city_name_en
from
    hivetemp.city_match) c
on  aa.city = c.dst_city_name_en

CDHでも早めにバグが修正されるとよいですね。

presto postgresql のデータ型変換一覧

prestoのcontributorにこっそり名前ののったにいやんです。こんばんわ。

ほんとに些細な修正なのですが、mergeされると嬉しいですね!

さて、postgresqlmysqlのデータをprestoから見るときは元の型と違った型で見える場合が多いです。
また、prestoからpostgresqlにデータを入れたときも型の変換が行われます。
いくつかの使われやすいpostgresqlの型がprestoでどう見えるのか。
また、presto経由でpostgresqlへデータを挿入した時には型がどうかわるのかを比較してみました。

postgresql -> presto
postgresql presto
bigint bigint
character varying varchar
character varchar
boolean boolean
date date
integer bigint
text varchar
timestamp without time zone timestamp
json 表示されず
xml 表示されず

なんとなく予想通りの変換ですが、残念ながら、json型とxml型はpresto上からは参照する事が出来ませんでした。 これらの型があるテーブルはそのカラムがないこととして扱われます。

presto -> postgresql
postgresql presto
bigint bigint
varchar character varying
boolean boolean
date date
timestamp timestamp without time zone

postgresqlのデータをpresto経由でpostgresqlに入れた際も上記テーブルに即した変換が行われます。

次回はmysqlの型変換についても検証してみたいと思います。

AWSSummitに参加してきました

ビールはキリン党のにいやんです。こんばんわ。

 

先日高輪プリンスホテルで行われたAWSSummitに参加してきました。

f:id:nii_yan:20150604224349j:plain

 

AWSSummitは6/2,3と2日間行われたのですが、私は3日の午後のみの参加でした。

 

ランチセッションから参加だったのですが、配られるお弁当がまいせんだったのは嬉しかったですねー。さすがAmazonさんですw

 

今回いくつかのセッションに参加したのですが、そのうち3つほどここで紹介したいと思います。

 

  • 開発生産性を上げるためのデプロイ戦略

amazonの吉羽さんによる講演だったのですが、聞いてる最中に思い出しました。

以前も聞いたことある内容でした・・・orz

すっかり忘れてましたよ、聞いたことあったの・・・

しかし、デプロイ自動化の原則は自分も全部守れていないなあと思いましたね。

これ、全部まもるの結構大変ですよね。

でもそこまでする価値はありそうですねー。

デプロイ自動化の原則は以下です

- 完全自動化

- 変更量最小化

- 高速完了

- 不可逆変更回避

- 成功失敗自動判定

- 失敗時ロールバック

- デプロイパターン集約

 

私のプロジェクトでは、完全自動化とかまだ出来てないですねー。

カピストラーノでデプロイしてますが、いくつか手動手順が入ってしまってます。

あとは、不可逆変更回避とか重要ですよね。

聞いたの2回目の講演でしたが、勉強になりました!

 

  • なぜクックパッドは開発しやすいのか

クックパッドはエンジニアの中でも評判のいい会社ですよねー。

私はクックパッドの方の講演はほぼ聞いたことなかったので、かなり楽しみにしてました。

 

主にクックパッドの開発手法の紹介だったのですが、本番データで開発しよう!とかほんとに共感です。

これで私もどれだけバグを踏んできたか・・・

 

クックパッドでは本番データを開発環境にレプリケーション貼って開発を行っているみたいです。

 

さらに開発環境でデータのinsert行う際はidに600000などの数字をたして、シフトさせ、本番データとかぶらないようにしてると。

 

DBはmysqlを使っているようでしたが、このやり方だと開発環境のみでギャップロック起こりそうだけど大丈夫なのかな・・・

 

これでクックパッドはうまくいってるぜい!って言ってたので、なんかうまくやっているんでしょうねー。

 

そもそも、mysqlのギャップロックとかネクストキーロックで悩まされてる人はほとんどいないのかな・・・

 

  • サーバにログインしない・させないサービス運用

これは最近上場したので有名はGunosyの発表だったのですが、サーバにログインさせてしまうと、勝手にyum installしたり、cron書き換えられたり、いいことないので、サーバにログインさせないようにしよう!って話でした。

 

ただ、どうやってログインさせないようにするかってのが、ソースmergeしたらビルド、テスト、デプロイを自動でやるとか、ミドルウェア使ってログ取集するとか、結構すでにどこもやってる事だなーって話でした・・・

 

うーむ、ちょっと期待はずれでしたね・・・

 

他にもgitflowの話やらなんやら聞いたのですが、なかなか楽しいカンファレンスでした!

ただ、人が多すぎて、立ち見や座り見が多かったので、もう少し席増やすなりしてほしかったですねー。

 

みんな地べたに座ってご飯食べてたし・・・

 

とにかく来年も行きたいなと思えるカンファレンスでしたね!

 

ピジョン ランフィに合うレインカバー

5月から30度越えで夏が来るのが恐ろしくてしょうがないにいやんです。

 

こんばんわ。

 

我が家ではベビーカーにピジョンのランフィを使用してます。

 

そこまで大きくなく、取り回しがよいのに、軽くてしっかりしていてとても重宝しています。

大きめタイヤとサスペンション付きなのも段差乗り越えやすくていいですね。

 

しかし、ランフィには専用レインカバーが今の所発売されていません。

これからの梅雨の季節にやはりレインカバー欲しいなぁと思って、試したところアップリカのソラリア用レインカバーがほぼぴったり使えました。

ソラリア レインカバー【送料無料】

ソラリア レインカバー【送料無料】
価格:4,102円(税込、送料込)

 

 

 

ランフィでの使用時の写真は以下です

 

対面時

f:id:nii_yan:20150531225158j:plain

 

背面時

f:id:nii_yan:20150531225035j:plain

 

 

これで梅雨の時期にもお散歩にいけますね!

 

CDH5.4 アップデート方法

CDH5.4が出たので動作検証してる最中に5.4.1が出て、うわーまだ間に合うーって動作検証してる最中に5.4.2が出て途方にくれたにいやんです。

こんばんわ。

 

よく見たら5.4.2は5.3以前のバージョンから5.4.1へのアップデート時のバグ対応なんで、5.4.1の人は5.4.2にしなくていいのね。

よかった。。。

 

CDH5.4が出ましたね!!

 

さてさて、CDH5.4へのアップデート方法ですが、以下のサイトまたは公式サイトを参照してもらうと詳しくのってますw

Quickstart VMをCloudera 5.4にアップデート(前編) | Tech Blog

Upgrading Cloudera Manager 5 to the Latest Cloudera Manager

 

5.4へのアップデート時にはHDFSメタデータの更新が必要なので、「何それ怖い!」ってなりますが、アップデート手順にメタデータのバックアップ方法などものっていますので、この手順通りやれば大きな心配なく出来るかと。

 

私のとこでも上記手順で更新したのですが、更新した後に別途対応が必要になった場所が2点だけ出たので、そこの共有です。

 

  • oozieから呼んでるhiveアクションでsqlファイル中の「hiveconf」が使えなくなった
  • oozieのシェルアクション経由で呼んでいるsqoopが動かなくなった

 

hiveconfに関してはhivevarに変えたら使えるようになりました。

または、hiveconf ってつけるの止めて変数名だけにしてもoozieの設定変えれば動くように。

 

sqoopについてはシェル経由で呼ぶのはイレギュラーだったので、sqoopアクションで呼ぶようにしたら動きました。

 

CDH5.4にするとHive on Sparkなど魅力的な機能が盛りだくさんなので、皆さんも是非使ってみてくださいね!

 

-- 2015/06/12追記

上記問題の他にHiveのカラムずれ問題が発覚しました。

詳細は

CDH5.4 Hiveでのカラムずれ問題 - イクジニアブログ

を参考にしてください。

統計検定 2級 おすすめテキスト

密かに最近色々な試験を受けているにいやんです。こんばんわ。

 

統計検定、簿記、FP、ビール検定・・・

さて、私の職業は何でしょう?って感じですねw

 

その中で統計検定の私なりの勉強方法を紹介したいと思います。

1度落ちましたが、この勉強方法により2度目の挑戦で無事に合格しました!

 

 

テキストですが、公式のテキストは難しすぎてとっかかりにくいので、買うのはやめましょうw(あくまで個人的意見です)

 

私は買って必死に読みましたが、眠くなるだけでした・・・

 

なので、非常にとっかかりやすく、なおかつ2級の試験範囲にかなり合致していたのが以下の2冊になります。

 

まずは

これは弁当屋の娘が統計を駆使して弁当をいっぱい売るって話なのですが、統計の基礎から、簡単な検定までしっかりカバーされています。

本もストーリーがあって読みやすいので、これを何度も読むとかなりいい勉強になりました。

 

次に

これはかなり有名な統計の本ですが、漫画なのでとても読みやすいです。

それでいて、かなりしっかりと統計の事も学べるので、こちらもくまなく読みましょう。

 

上記の2冊を何度も読めば2級の範囲はほぼカバー出来るので、最後に問題集ですね。

問題集は公式の過去問がオススメです

過去問は100点を取れるようになるまで何度もやりましょう。

出題される問題の傾向は過去と似ているので、問題集に出てくる問題がすべて解けるようになっていれば2級は受かったも同然だと思います!

 

私は2冊の本を10回以上は読んで、あとはひたすら過去問を解いてなんとか合格出来ました。

 

勉強の目安としては試験の2ヶ月前ぐらいからなんとなく初めて、直前2週間で追い込みぐらいでいけると思います。

 

是非とも皆さん統計検定受けてみてください!

 

 

 

 

 

JavaDayTokyo2015行ってきました

「したたか」を漢字で書くと「強か」って書くことを初めて知ったにいやんです。こんばんわ。

 

ソースはわかる人にはわかりますかねw

 

 

さて、ちょっと前の話ですが、JavaDayTokyoに行ってきました。

 

去年も行ったのですが、話題は今回もJAVA8に関する事が多かったですねー。

 

前回も思ったのですが、やはりstreamAPIは便利そうですね。

今あるファイル処理がメインのバッチ処理を全部これで書き直したくなりましたよ。

 

map,distinct,sort,filterなど使えば今まで使っていたループ処理など使わなくてよくなりますし、parallel使えば速度向上も図れそうですしね!

 

parallelについてはオーバーヘッドあるので、遅くなる場合もあるから注意してね!との事でしたが。

 

もちろん、ラムダ式やデフォルトメソッドの話もありましたよ。

 

ゴールドマンサックスの話ではstreamAPIで書くのは綺麗じゃない!みたいな事を言っていて(独自に作ったGS Collectionsのがいい!)正面から喧嘩売ってるなーって思って面白かったですねw

 

発表された資料は以下のサイトから見る事が出来ます。

Java Day Tokyo 2015

 

デフォルトメソッドについては他のブログで以前に私が書いた記事があったので、引用しておきます

以下引用----------------------------------------------------------------

default methodsとはなんぞやというと、Interfaceクラスで関数の前にdefaultとつけるとなんと実装が書けるようになりました!
こんな感じ

1 public interface HogeInterface {  
2     void hello();
3     default void say(String str) {
4         System.out.println("Hoge " + str);
5     }
6 }

Interfaceに実装を書いても、もちろんオーバーライド出来ます。
なので、defaultの動きは決めといて、違う動きしたい時はオーバーライドしてって事が出来るようになりました。

え?これって抽象クラスと一緒じゃないの??って思ったあなた。
とっても鋭いです!

実は抽象クラスと決定的な違いは多重継承(のようなもの)が出来るようになったのです!

たとえばHogeInterfaceの他にMogeInterfaceを作ってみましょう

1 public interface MogeInterface {
2     void hello();
3     default void say(String str) {
4         System.out.println("Moge " + str);
5     }
6 }

そして、HogeとMogeの実装するクラスを以下のように作る事が出来ます。

1 public class HogeMogeImpl implements HogeInterface,MogeInterface {
2     @Override
3     public void hello() {
4         System.out.println("I am HogeMoge");
5     }
6      
7     @Override
8     public void say(String str) {
9         HogeInterface.super.say(str);
10     }
11 }

実装のないhelloメソッドについては実装を記述し、sayメソッドについてはどちらのクラスのメソッドを呼ぶか記述することが出来るようになりました。

実際にこのクラスを呼んでみると

1 HogeMogeImpl hogemoge = new HogeMogeImpl();
2 hogemoge.say("hogemoge test");

きちんとHogeInterfaceのsayメソッドが呼ばれているのがわかると思います。

1 Hoge hogemoge test