スキップしてコンテンツを表示

Amazon EMR の Hive と Spark を使用して、別のアカウント内のデータカタログをクエリする方法を教えてください。

所要時間2分
0

Apache Hive と Apache Spark を使用して、Amazon EMR で別の AWS アカウント内にある AWS Glue データカタログにアクセスしてクエリを実行しようとしています。

簡単な説明

複数アカウント内のデータカタログに動的にアクセスするには、Hive または Spark の設定で aws.glue.catalog.separator プロパティを指定します。設定で hive.metastore.glue.catalogid プロパティを指定しても、別のアカウント内の特定のデータカタログにアクセスできます。

解決策

AWS Glue へのクロスアカウントアクセスを許可します。AWS Glue テーブルが指す Amazon Simple Storage Service (Amazon S3) バケットがクロスアカウントアクセス用に設定されていることを確認してください。詳細については、「EMR ファイルシステムにクロスアカウントアクセスを設定する方法を教えてください」を参照してください。

複数アカウント内のデータカタログに動的にアクセスする

設定変更を新しいクラスターに適用する

EMR クラスターを起動する際、次の例のような設定オブジェクトを追加します。詳細については、「クラスター作成時にアプリケーションを構成する」を参照してください。

[
    {
        "Classification": "hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/",
            "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
        }
    },
    {
        "Classification": "spark-hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/",
            "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory"
        }
    }
]

実行中のクラスターに設定変更を適用する

次の手順を実行します。

  1. Amazon EMR コンソールを開きます。
  2. クラスターリストの [クラスター ID] から、再構成対象のアクティブなクラスターを選択します。
  3. クラスターの詳細ページで [アプリケーション] タブを選択します。
  4. [インスタンスグループ設定] で該当するインスタンスグループを選択し、[再構成] を選択します。
  5. [新しい設定を追加] を選択し、次の情報を入力します。
    [分類] に、hive-site と入力します。
    [プロパティ]aws.glue.catalog.separator と入力します。
    [値]/ を入力します。
    [分類] に、hive-site と入力します。
    [プロパティ]hive.metastore.client.factory.class と入力します。
    [値]com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory と入力します。
    [分類]spark-hive-site と入力します。
    [プロパティ]aws.glue.catalog.separator と入力します。
    [値]/ を入力します。
    [分類]spark-hive-site と入力します。
    [プロパティ]hive.metastore.client.factory.class と入力します。
    [値]com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory と入力します。
  6. [この設定をすべてのアクティブなインスタンスグループに適用] を選択し、[変更を保存] を選択します。詳細については、「Reconfigure an instance group in a running cluster (実行中のクラスターでインスタンスグループを再構成する)」を参照してください。

別のアカウント内のテーブルをクエリする

注: Amazon EMR バージョン 6.5 で Spark ジョブを実行する場合、設定プロパティ spark.sql.catalogImplementation=hive を渡してください。詳細については、Apache Spark のウェブサイトで「Spark プロパティを動的にロードする」を参照してください。

別のアカウントにあるテーブルをクエリするには、クエリでアカウント番号を指定します。アカウント番号はカタログ ID と同じです。たとえば、アカウント 111122223333 内の demodb.tab1 をクエリするには、次のコマンドを実行します。

Hive:

SELECT * FROM `111122223333/demodb.tab1` LIMIT 5;

Spark:

spark.sql("SELECT * FROM `111122223333/demodb`.tt1 LIMIT 5").show()

上記の Spark コマンドを spark-submit スクリプトで実行するか、ノートブックのシェルコマンドとして実行します。

2 つのカタログのテーブルを結合することもできます。

Hive:

SELECT * FROM `111122223333/demodb.tab1` t1 INNER JOIN `444455556666/demodb.tab2` t2 ON t1.col1 = t2.col2

Spark:

spark.sql(SELECT * FROM `111122223333/demodb.tab1` t1 INNER JOIN `444455556666/demodb.tab2` t2 ON t1.col1 = t2.col2).show()

上記の Spark コマンドを spark-submit スクリプトで実行するか、ノートブックのシェルコマンドとして実行します。

別のアカウント内の特定のデータカタログにアクセスする

設定変更を新しいクラスターに適用する

EMR クラスターを起動する際、次の例のような設定オブジェクトを追加します。詳細については、「クラスター作成時にアプリケーションを構成する」を参照してください。

[
    {
        "Classification": "hive-site",
        "Properties": {
            "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
            "hive.metastore.glue.catalogid": "account-id"
        }
    },
    {
        "Classification": "spark-hive-site",
        "Properties": {
            "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
            "hive.metastore.glue.catalogid": "account-id"
        }
    }
]

実行中のクラスターに設定変更を適用する

次の手順を実行します。

  1. Amazon EMR コンソールを開きます。
  2. クラスターリストの [クラスター ID] から、再構成対象のアクティブなクラスターを選択します。
  3. クラスターの詳細ページで [アプリケーション] タブを選択します。
  4. [インスタンスグループ設定] で該当するインスタンスグループを選択し、[再構成] を選択します。
  5. [新しい設定を追加] を選択し、次の情報を入力します。
    [分類] に、hive-site と入力します。
    [プロパティ]hive.metastore.glue.catalogid と入力します。
    [値]account-id と入力します。
    [分類] に、hive-site と入力します。
    [プロパティ]hive.metastore.client.factory.class と入力します。
    [値]com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory と入力します。
    [分類]spark-hive-site と入力します。
    [プロパティ]hive.metastore.glue.catalogid と入力します。
    [値]account-id と入力します。
    [分類]spark-hive-site と入力します。
    [プロパティ]hive.metastore.client.factory.class と入力します。
    [値]com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory と入力します。
  6. [この設定をすべてのアクティブなインスタンスグループに適用] を選択し、[変更を保存] を選択します。詳細については、「Reconfigure an instance group in a running cluster (実行中のクラスターでインスタンスグループを再構成する)」を参照してください。

別のアカウント内のテーブルをクエリする

指定されたデータカタログに保存されているテーブルをクエリするには、次の例のようなコマンドを実行します。

Hive:

SELECT * FROM `demodb.tab1` LIMIT 5;

Spark:

spark.sql("SELECT * FROM `demodb`.tt1 LIMIT 5").show()
AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ