6

我正在使用 Amazon Elastic Map Reduce 4.7.1、Hadoop 2.7.2、Hive 1.0.0 和 Spark 1.6.1。

用例:我有一个用于处理数据的 Spark 集群。该数据作为 Parquet 文件存储在 S3 中。我希望工具能够使用在 Hive Metastore 中注册的名称来查询数据(例如,查找foo表而不是parquet.`s3://bucket/key/prefix/foo/parquet`做事的风格)。我还希望这些数据在 Hive Metastore(一个单独的 RDS 实例)的生命周期内保持不变,即使我拆除了 EMR 集群并启动了一个连接到同一个 Metastore 的新集群。

问题:如果我这样做sqlContext.saveAsTable("foo"),默认情况下会在 Hive Metastore 中创建一个托管表(请参阅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

我解决这个问题的方法是:首先在spark中创建hive表:

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

接下来,在 Hive 中,将出现如上从 spark 创建的表。(在这种情况下数据1)

另外,在另一个 hive 引擎中,您可以通过创建与 spark: 命令中创建的类型相同的外部表数据来链接到此数据是 S3:

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

你不需要电子病历。只需启动 Athena,创建一个表以读取 Parquet 格式的数据。这是一个比 EMR 便宜得多的选择,而且也是可持续的。您可以使用 JDBC 通过 Athena 实时访问这些数据。

于 2017-04-26T23:51:20.637 回答