6

Amazon Elastic Map Reduce 4.7.1、Hadoop 2.7.2、Hive 1.0.0、および Spark 1.6.1 を使用しています。

ユースケース: データの処理に使用する Spark クラスターがあります。そのデータは S3 に Parquet ファイルとして保存されます。ツールが、Hive メタストアに登録されている名前を使用してデータをクエリできるようにしたい (たとえば、作業スタイルでfooはなく、テーブルを検索parquet.`s3://bucket/key/prefix/foo/parquet`する)。また、EMR クラスターを破棄して、同じメタストアに接続された新しいクラスターをスピンアップしても、Hive メタストア (別の RDS インスタンス) の存続期間中、このデータを保持したいと考えています。

問題: そのようなsqlContext.saveAsTable("foo")ことをすると、デフォルトで、Hive メタストアにマネージド テーブルが作成されます ( https://spark.apache.org/docs/latest/sql-programming-guide.htmlを参照)。これらのマネージド テーブルは、データを S3 から EMR クラスターの HDFS にコピーします。つまり、EMR クラスターを破棄した後、メタデータは役に立たなくなります。

4

3 に答える 3

4

解決策は、S3 ファイルを外部テーブルとして登録することでした。

sqlContext.createExternalTable("foo", "s3://bucket/key/prefix/foo/parquet")

ファイルを S3 に保存して外部テーブルとして登録する方法を一度に理解できませんでしたが、createExternalTableオーバーヘッドが大きくなりません。

于 2016-07-21T00:36:10.913 に答える
4

この問題を解決する方法は次のとおりです。まず、スパークでハイブテーブルを作成します。

schema = StructType([StructField("key", IntegerType(), True),StructField("value", StringType(), True)])
df = spark.catalog \
          .createTable("data1", "s3n://XXXX-Buket/data1",schema=schema)

次に、Hive に、上記のように spark から作成したテーブルが表示されます。(この場合は data1)

さらに、他のハイブ エンジンでは、spark: コマンドで作成されたものと同じタイプの外部テーブル データを作成することで、このデータに S3 をリンクできます。

CREATE EXTERNAL TABLE data1 (key INT, value String) STORED AS PARQUET LOCATION 's3n://XXXX-Buket/data1’
于 2018-05-04T21:51:37.347 に答える