测试环境

  • AWS EMR : 6.2.0
  • Iceberg : 0.11.1
  • EMR Spark: 3.0.1-amzn-0

注意:如果使用 AWS EMR 6.3.0 版本,使用 EMR 默认的 iceberg 0.11.1 版本则可能碰到这个 issue。这时,应该手动把如下iceberg jar删除掉,然后指定用master分支的iceberg runtime jar来运行spark-sql:

  1. [hadoop@ip-172-31-33-131 ~]$ locate iceberg
  2. /emr/instance-controller/lib/bootstrap-actions/1/bootstrap-with-iceberg.sh
  3. /usr/share/aws/aws-java-sdk/iceberg-flink-runtime-0.11.1.jar
  4. /usr/share/aws/aws-java-sdk/iceberg-spark3-runtime-0.11.1.jar

运行 spark-sql 的方式:

  1. spark-sql --jars /path/to/iceberg-spark3-runtime-25eaeba.jar \
  2. --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  3. --conf spark.sql.catalog.hive_prod=org.apache.iceberg.spark.SparkCatalog \
  4. --conf spark.sql.catalog.hive_prod.type=hive \
  5. --conf spark.sql.catalog.hive_prod.uri=thrift://ip-172-31-34-107.ap-northeast-1.compute.internal:9083 \
  6. --conf spark.sql.catalog.hive_prod.warehouse=s3://dw-ali/warehouse

第一步:打开spark-sql

在启动spark-sql时指定如下参数:

  1. spark-sql --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
  2. --conf spark.sql.catalog.hive_prod=org.apache.iceberg.spark.SparkCatalog \
  3. --conf spark.sql.catalog.hive_prod.type=hive \
  4. --conf spark.sql.catalog.hive_prod.uri=thrift://ip-172-31-34-107.ap-northeast-1.compute.internal:9083 \
  5. --conf spark.sql.catalog.hive_prod.warehouse=s3://dw-ali/warehouse
  • hive_prod 表示你想要创建的catalog名字
  • spark.sql.catalog.hive_prod.type: 表示创建的catalog类型,目前iceberg支持:hive、hadoop、custom三种。
  • spark.sql.catalog.hive_prod.uri : 表示hive-metastore的thrift地址。对于AWS EMR集群来说,可以在 /usr/lib/hive/conf/hive-site.xml 文件中的搜索 ‘hive.metastore.uris’ ,获取到对应的value。
  • spark.sql.catalog.hive_prod.warehouse: 表示 iceberg 的数据存在在哪个目录下。

第二步:创建对应的 database

执行如下 SQL:

  1. CREATE DATABASE hive_prod.iceberg_db

这时候,可以在 s3 的路径下看到具体的文件:

[hadoop@ip-172-31-33-131 ~]$ hdfs dfs -ls s3://dw-ali/warehouse
Found 1 items
drwxrwxrwx   - hadoop hadoop          0 1970-01-01 00:00 s3://dw-ali/warehouse/iceberg_db.db
[hadoop@ip-172-31-33-131 ~]$ hdfs dfs -ls -R s3://dw-ali/warehouse
drwxrwxrwx   - hadoop hadoop          0 1970-01-01 00:00 s3://dw-ali/warehouse/iceberg_db.db
drwxrwxrwx   - hadoop hadoop          0 1970-01-01 00:00 s3://dw-ali/warehouse/iceberg_db.db/sample
drwxrwxrwx   - hadoop hadoop          0 1970-01-01 00:00 s3://dw-ali/warehouse/iceberg_db.db/sample/data
-rw-rw-rw-   1 hadoop hadoop        636 2021-07-12 11:37 s3://dw-ali/warehouse/iceberg_db.db/sample/data/00000-0-7072f1c0-330c-4eaf-9096-47fd5b4e3cf6-00001.parquet
drwxrwxrwx   - hadoop hadoop          0 1970-01-01 00:00 s3://dw-ali/warehouse/iceberg_db.db/sample/metadata
-rw-rw-rw-   1 hadoop hadoop        825 2021-07-12 11:37 s3://dw-ali/warehouse/iceberg_db.db/sample/metadata/00000-1a9e72e3-8549-4713-8e3b-22a1b76bd49e.metadata.json
-rw-rw-rw-   1 hadoop hadoop       1739 2021-07-12 11:37 s3://dw-ali/warehouse/iceberg_db.db/sample/metadata/00001-06443d34-8ada-40b1-8d3d-2c8381073ed2.metadata.json
-rw-rw-rw-   1 hadoop hadoop       5570 2021-07-12 11:37 s3://dw-ali/warehouse/iceberg_db.db/sample/metadata/830162e3-ed03-42f0-8ad5-ffebdb44706b-m0.avro
-rw-rw-rw-   1 hadoop hadoop       3500 2021-07-12 11:37 s3://dw-ali/warehouse/iceberg_db.db/sample/metadata/snap-929163357221233223-1-830162e3-ed03-42f0-8ad5-ffebdb44706b.avro

第三步:创建测试用的 iceberg 表

执行如下 SQL:

CREATE TABLE hive_prod.iceberg_db.sample 
    (
    id bigint,
    data string
  ) 
USING iceberg;

第四步:插入测试数据

执行如下 SQL:

INSERT INTO hive_prod.iceberg_db.sample VALUES (1, 'aaa');

第五步:查询测试数据

执行如下 SQL:

SELECT * FROM hive_prod.iceberg_db.sample;