KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

[Hadoop] Cloudera CDH3 -> CDH4のバージョンアップ方法


こんにちわ!ClouderaManagerの便利さに驚愕している山田(@nii_yan)です。

いやー、ほんとにこれ使ってしまうともう元には戻れないですね。
今までは1台1台がんばって設定変えたり、シェル作ったりしてたのに、
GUIでクリック1発ですから。これは便利だわー。
ただ、最初からClouderaManager使ってしまうと、コマンド覚えられなさそうですが。。。

さてさて、そんなわけで私は現在Hadoopを使用した仕事をしておりまして、
今日はHadoopのバージョンアップ方法を紹介しようと思います。

使用してるのはのはClouderaで、CDH3 -> CDH4のバージョンアップについて
書かせていただこうと思います。

なになに?CDH5が出たじゃないかって?何古い話してるのかって?
(∩ ゚д゚) アーアーきこえなーい

やっとのことでCDH4にバージョンアップした1カ月後にCDH5が出るとかね。。。ToT

今回バージョンアップする際に選んだ方法として、
CDH3とCDH4のクラスタを両方用意して、段々と移行していくという方法をとりました。

こんなイメージ

CDH

その際にやはり気になるのがどうやってHDFSのデータ移行をするかということです。

これは実はとても簡単。
distcpを使いましょう。
distcpはHDFS間のデータ転送をしてくれるコマンドでして、
バージョンの違うHadoop間でも使用できます。

コマンドは以下のような感じ

hadoop distcp -i -m 5 -update -skipcrccheck hftp://src-hogehoge hdfs://dist-hogehoge

distcpでは転送速度の制御が出来ないため(最近のは出来るversionもあるっぽい)
-mオプションでマップ数を制御し、転送速度を抑えます。

また、distcpはrsyncのように差分更新してくれるのですが、
なんとcdh3とcdh4ではCRCの取り方が違い、skipcrccheckをつけないと、
差分更新でなく、全更新となってしまう罠が待ってます。

日次処理でデータ移行しようとする際は注意してください。

さて、これでデータの移行は終わりました。
この後Hiveを使っている方はHiveのメタデータを作成しないといけません。
テーブル定義はおそらくDDLが残っているでしょうから
それを使っていただければいいと思うのですが、
問題はパーティション情報です。

Hiveはパーティション情報もメタデータに持っているため、
パーティション通りのディレクトリ構成でデータ移行しても
勝手にパーティションを認識してくれません。

地道にディレクトリ構造を探って

ALTER TABLE table_name ADD PARTITION....

とかやっていると日が暮れてしまうのでここは

MSCK REPAIR TABLE table_name;

このコマンドを使いましょう。
これをhiveで叩けばパーティションを自動的に認識してメタデータに追加してくれます。
このコマンド知らないときは本気でディレクトリ構造から
alter table文を作成するスクリプト組もうかと思った。。。

今回紹介した方法ではクラスタ2つ作らないといけないという欠点がありますが、
比較的安全に出来る方法だとは思いますので参考にしてみてください。

そのうちCDH5へのバージョンアップにも挑戦したいと思います。。。