2017-01-03 9 views
0

多くのHiveテーブルの場所でバケット名を変更したいと思います。私たちがmySQLデータベースに接続して更新することは可能でしょうか?それは可能だと思います。しかし、実動データベースでそれを行うのが安全かどうかを知りたいと思います。多くのテーブルのHiveメタデータの場所を更新する

答えて

0

はい、可能ですが、私はそれを完了しました。しかし

(a)のは、メタストアスキーマが文書化されておらず、各ハイブのバージョンはいくつかのマイナーな変更をもたらしますので、あなたがどこ/ StorageDescriptorオブジェクトを永続化する方法を見つけるために、独自の探査をしなければならない - その後、いくつかのユニットテスト/非回帰テストをDevシステムにインストールする - さらに、DBバックアップを実行してからProdシステムを操作することを忘れないでください(また、Devシステムの緊急修復のリハーサルも必要です)。

(b) 012を更新する必要がありますテーブルの場合はだけでなく、パーティションの場合 - パーティションテーブルの場合、テーブルレベルLOCATIONは、将来のパーティションのデフォルトルートディレクトリとして使用されます。一度作成されると、パーティションは明示的に変更されるまでその位置を保持します。レコードの


、一括更新のための好ましい方法は、(理論的に) Hive MetaToolあるが、残念ながら、それはあなたが必要とする更新の種類をサポートしていません。
今それが本当の pain pointだったので、それは、すべてのHDFSパスに名前ノードの別名を変更するための唯一の良いことだ...

残忍なSQLのアップデートに有効な代替はハイブを使用して、カスタムJavaプログラムを開発するだろうMetaStore APIを使用してすべてのテーブルをスキャンする&パーティションでStorageDescriptorを読み取り、次にその場所でRegExの変更を実行してから、変更を書き戻します。(これはMetaToolの機能とまったく同じですが、下位レベルのみ)しかし、それは過度のことです。


最後に、可能 妥協は( regexp_replace()で)ハイブCLIで、後に実行するコマンド ALTER Table/Partition LOCATIONの連鎖を発生させるために、適切なMySQLのテーブルにSQLを選択だろう。
緊急ロールバックが必要な場合に備えて、元の場所に戻すためのALTERチェインを追加しました :-/

関連する問題