HDInsight 3.6 から HDInsight 4.0 への Hive ワークロードの移行に関するトラブルシューティング ガイド
この記事では、Hive ワークロードを HDInsight 3.6 から HDInsight 4.0 に移行するときにお客様が直面する最も一般的な問題の一部について、回答を示します。
DESCRIBE TABLE_NAME
の実行時に待機時間を短縮する
対応策 :
1 つのバッチでメタストアから取得できるオブジェクト (テーブルまたはパーティション) の最大数を増やします。 待機時間が十分なレベルに達するまで、大きな数値に設定します (既定値は 300)。 数値が大きいほど、必要とされる Hive メタストア サーバーへのラウンド トリップ数は減少しますが、クライアント側でより多くのメモリが必要になることもあります。
hive.metastore.batch.retrieve.max=2000
Hive と、古くなったすべてのサービスを再起動します
テーブルに対して skip.header.line.count と skip.footer.line.count が設定されている場合に GZip 圧縮されたテキスト ファイルのクエリを実行できない
問題は Interactive Query 4.0 で修正されましたが、Interactive Query 3.1.0 ではまだ修正されていません
対応策 :
"skip.header.line.count"="1"
と"skip.footer.line.count"="1"
を使用せずにテーブルを作成してから、元のテーブルから、クエリでヘッダーおよびフッター行を除外するビューを作成します。
Unicode 文字を使用できない
対応策 :
クラスターのハイブ メタストア データベースに接続します。
次のコマンドを使用して、
TBLS
テーブルとTABLE_PARAMS
テーブルのバックアップを作成します。select * into tbls_bak from tbls; select * into table_params_bak from table_params;
影響を受ける列の種類を手動で
nvarchar(max)
に変更します。alter table TABLE_PARAMS alter column PARAM_VALUE nvarchar(max); alter table TBLS alter column VIEW_EXPANDED_TEXT nvarchar(max) null; alter table TBLS alter column VIEW_ORIGINAL_TEXT nvarchar(max) null;
CREATE TABLE AS SELECT (CTAS) を実行すると同じ UUID を持つ新しいテーブルが作成される
Hive 3.1 (HDInsight 4.0) には、一意の UUID を生成する組み込み UDF が用意されています。 Hive UUID() メソッドでは、CTAS を指定しても一意の ID が生成されます。 これを次のように使用できます。
create table rhive as
select uuid() as UUID
from uuid_test
Hive ジョブの出力形式が HDInsight 3.6 とは異なっている
これは、HDInsight 3.6 と HDInsight 4.0 間で WebHCat(Templeton) に違いがあるために発生します。
Hive REST API -
arg=--showHeader=false -d arg=--outputformat=tsv2 -d
を追加します.NET SDK -
HiveJobSubmissionParameters
の引数を初期化しますList<string> args = new List<string> { { "--showHeader=false" }, { "--outputformat=tsv2" } }; var parameters = new HiveJobSubmissionParameters { Query = "SELECT clientid,market from hivesampletable LIMIT 10", Defines = defines, Arguments = args };
Hive 内部テーブル作成の待機時間を短縮する
Advanced hive-site と Advanced hivemetastore-site から
hive.metastore.transactional.event.listeners
の値org.apache.hive.hcatalog.listener.DbNotificationListener
を削除します。hive.metastore.event.listeners
に値がある場合は、それを削除します。DbNotificationListener は、REPL コマンドを使用する場合にのみ必要で、そうでない場合は削除しても安全です。
Hive テーブルの既定の場所を変更する
この動作変更は、HDInsight 4.0 (Hive 3.1) での設計によるものです。 この変更の主な理由は、ファイル アクセス許可の制御目的です。
カスタムの場所に外部テーブルを作成するには、create table ステートメントでその場所を指定します。
HDInsight 4.0 で ACID を無効にする
HDInsight 4.0 では ACID を有効にすることをお勧めします。 Hive での最近の機能強化は、機能とパフォーマンスのどちらについてもその大半が ACID テーブルに対してのみ使用できます。
HDInsight 4.0 で ACID を無効にする手順:
Ambari で以下のハイブ構成を変更します。
hive.strict.managed.tables=false hive.support.concurrency=false; hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager; hive.enforce.bucketing=false; hive.compactor.initiator.on=false; hive.compactor.worker.threads=0; hive.create.as.insert.only=false; metastore.create.as.acid=false;
Note
hive.strict.managed.tables が true の<既定値>に設定されている場合、マネージド テーブルと非トランザクション テーブルの作成は次のエラーで失敗します。
java.lang.Exception: java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. Table <Table name> failed strict managed table checks due to the following reason: Table is marked as a managed table but is not transactional.
- ハイブ サービスを再起動します。
重要
HDInsight 3.6 および HDInsight 4.0 の Hive で管理されているテーブルと、同じデータやストレージを共有しないことをお勧めします。これはサポートされていないシナリオです。
通常、上記の構成は、HDInsight 4.0 クラスターで Hive テーブルを作成する前に設定する必要があります。 マネージド テーブルが作成された後に ACID を無効にしないでください。 データ損失が発生したり、一貫性のない結果になる可能性があります。 そのため、新しいクラスターを作成するときにこれを一度設定し、後で変更しないことをお勧めします。
テーブル作成後に ACID を無効にすることは危険ですが、それを実行する場合は、データの損失や不整合が生じる可能性を回避するために以下の手順に従ってください。
- 同じスキーマを使用して外部テーブルを作成し、CTAS コマンド
create external table e_t1 select * from m_t1
を使用して元のマネージド テーブルからデータをコピーします。 drop table m_t1
を使用してマネージド テーブルを削除します。- 提示した構成を使用して ACID を無効にします。
- m_t1 を再度作成し、CTAS コマンド
create table m_t1 select * from e_t1
を使用して外部テーブルからデータをコピーします。 drop table e_t1
を使用して外部テーブルを削除します。
- 同じスキーマを使用して外部テーブルを作成し、CTAS コマンド
ACID を無効にする前に、すべてのマネージド テーブルが外部テーブルに変換され、削除されていることを確認してください。 また、各手順の後にスキーマとデータを比較して不一致を回避します。
755 アクセス許可を使用すると Hive 外部テーブルが作成される
この問題は、次の 2 つのオプションのいずれかによって解決できます。
フォルダーのアクセス許可を手動で 757 または 777 に設定して、ハイブのユーザーにディレクトリへの書き込みを許可します。
"Hive 承認マネージャー" を
org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider
からorg.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly
に変更します。
Hive メタストアは HDInsight 4.0 に埋め込まれていないため、MetaStoreAuthzAPIAuthorizerEmbedOnly を使用するとセキュリティ チェックは事実上に無効にされます。 ただし、これによって他の潜在的な問題が発生する可能性があります。 このオプションを使用する際は注意が必要です。
HDInsight 4.0 へのアップグレード後に Hive ジョブでアクセス許可エラーが発生する
HDInsight 4.0 では、Hive コンポーネントがあるすべてのクラスター図形が、次の新しい認可プロバイダーを使用して構成されます:
org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider
HDFS ファイルのアクセス許可は、アクセスされるファイルのハイブ ユーザーに割り当てられる必要があります。 エラー メッセージには、問題の解決に必要な詳細が記載されています。
HDInsight 3.6 Hive クラスターで使用されている
MetaStoreAuthzAPIAuthorizerEmbedOnly
プロバイダーに切り替えることもできます。org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly
OpenCSVSerde を使用してテーブルのクエリを実行できない
csv
形式のテーブルからデータを読み取ると、次のような例外がスローされる場合があります。
MetaException(message:java.lang.UnsupportedOperationException: Storage schema reading not supported)
対応策 :
Ambari UI で
Custom hive-site
に構成metastore.storage.schema.reader.impl
=org.apache.hadoop.hive.metastore.SerDeStorageSchemaReader
を追加します古くなったすべてのハイブ サービスを再起動します
次のステップ
問題がわからなかった場合、または問題を解決できない場合は、次のいずれかのチャネルでサポートを受けてください。
Azure コミュニティのサポートを通じて Azure エキスパートから回答を得る。
カスタマー エクスペリエンスを向上させるための Microsoft Azure の公式アカウントの @AzureSupport に連絡する。 Azure コミュニティで適切なリソース (回答、サポート、エキスパートなど) につながる。
さらにヘルプが必要な場合は、Azure portal からサポート リクエストを送信できます。 メニュー バーから [サポート] を選択するか、 [ヘルプとサポート] ハブを開いてください。 詳細については、「Azure サポート要求を作成する方法」を参照してください。 サブスクリプション管理と課金サポートへのアクセスは、Microsoft Azure サブスクリプションに含まれていますが、テクニカル サポートはいずれかの Azure のサポート プランを通して提供されます。