Amazon EMR の Hive および Spark を使用して、異なる AWS アカウントにある AWS Glue データカタログにクエリを実行する方法を教えてください。

最終更新日: 2020 年 8 月 31 日

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

簡単な説明

Hive と Spark の設定で、プロパティ「aws.glue.catalog.separator": "/」を追加します。このプロパティは、新しいクラスターまたは実行中のクラスターで設定できます。

注: このソリューションは、Amazon EMR リリース 5.28.0 以降で有効です。EMR クラスターと AWS Glue データカタログは同じリージョンにある必要があります。

解決方法

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

次に、Hive と Spark の aws.glue.catalog.separator プロパティを / に設定します。

新しいクラスターの場合

クラスターを起動するときに、次のような設定オブジェクトを追加します。

[
    {
        "Classification": "hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    },
    {
        "Classification": "spark-hive-site",
        "Properties": {
            "aws.glue.catalog.separator": "/"
        }
    }    
]

実行中のクラスターの場合

  1. Amazon EMR コンソールを開きます。
  2. クラスタリストの [名前] で、再設定するアクティブなクラスターを選択します。
  3. クラスターのクラスター詳細ページを開き、[設定] タブを選択します。
  4. [フィルター] ドロップダウンリストで、再設定するインスタンスグループを選択します。
  5. [再設定] ドロップダウンリストで、[テーブルで編集] を選択します。
  6. 設定分類テーブルで、[設定の追加] を選択し、以下を入力します。
    [分類] には、「hive-site」
    [プロパティ] には、「aws.glue.catalog.separator」
    [] には、「 /」

    [分類] には、「spark-hive-site」
    [プロパティ] には、「aws.glue.catalog.separator」
    [] には、「 /」
  7. [この設定をすべてのアクティブなインスタンスグループに適用] を選択してから、[変更を保存] をクリックします。

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

別の AWS アカウントにあるテーブルをクエリするには、クエリでアカウント番号を指定します。アカウント番号は、カタログ ID と同じです。例えば、Hive のアカウント 111122223333demodb.tab1 をクエリするには:

select * from `111122223333/demodb.tab1` limit 5;

Spark の例 (これを spark-submit スクリプトで実行するか、ノートブックシェルコマンドとして実行します) :

spark.sql("select * from `111122223333/demodb`.tt1 limit 5").show()

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

select * from `111122223333/demodb.tab1` t1 inner join  `444455556666/demodb.tab2` t2 on t1.col1 = t2.col2

Spark の例 (これを spark-submit スクリプトで実行するか、ノートブックシェルコマンドとして実行します):

spark.sql(select * from `111122223333/demodb.tab1` t1 inner join  `444455556666/demodb.tab2` t2 on t1.col1 = t2.col2).show()

または、spark-submit スクリプトの -conf オプションを使用するか、ノートブックシェルコマンドとしてパラメータを渡します。例:

pyspark --conf spark.hadoop.aws.glue.catalog.separator="/"

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?