使用 Iceberg on Kubernetes 打造新一代云原生数据湖 (3)

当前 TKE k8s-big-data-suite 1.0.3 在初始化 Postgresql 时,缺少对 Hive transaction 的支持,从而导致 Iceberg 表创建失败。请先执行以下命令手动修复:

$ kubectl get pod | grep postgresql tkbs-postgresql-5b9ddc464c-xc5nn 1/1 Running 1 7d18h $ kubectl exec tkbs-postgresql-5b9ddc464c-xc5nn -- psql -c "UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'metastore';SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'metastore'"; kubectl exec tkbs-postgresql-5b9ddc464c-xc5nn -- psql -c "drop database metastore"; kubectl exec tkbs-postgresql-5b9ddc464c-xc5nn -- psql -c "create database metastore" $ kubectl get pod | grep client tkbs-client-844559f5d7-r86rb 1/1 Running 7 7d18h $ kubectl exec tkbs-client-844559f5d7-r86rb -- schematool -dbType postgres -initSchema 集成 Iceberg

当前 Iceberg 对 Spark 3.0 有较好支持,对比 Spark 2.4 有以下优势:

使用 Iceberg on Kubernetes 打造新一代云原生数据湖


所以我们默认采用 Spark 3.0 作为计算引擎。Spark 集成 Iceberg,首先需引入 Iceberg jar 依赖。用户可在提交任务阶段手动指定,或将 jar 包直接引入 Spark 安装目录。为了便于使用,我们选择后者。笔者已打包 Spark 3.0.1 的镜像,供用户测试使用:ccr.ccs.tencentyun.com/timxbxu/spark:v3.0.1。

我们使用 Hive MetaStore 管理 Iceberg 表信息,通过 Spark Catalog 访问和使用 Iceberg 表。在 Spark 中做如下配置:

spark.sql.catalog.hive_prod = org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.hive_prod.type = hive spark.sql.catalog.hive_prod.uri = thrift://metastore-host:port

若使用 TKE k8s-big-data-suite 套件部署 Hadoop 集群,可通过 Hive Service 访问 Hive MetaStore:

$ kubectl get svc | grep hive-metastore tkbs-hive-metastore ClusterIP 172.22.255.104 <none> 9083/TCP,8008/TCP 6d23h

Spark 配置变更为:

spark.sql.catalog.hive_prod = org.apache.iceberg.spark.SparkCatalog spark.sql.catalog.hive_prod.type = hive spark.sql.catalog.hive_prod.uri = thrift://tkbs-hive-metastore 创建和使用 Iceberg 表

执行 spark-sql 进行验证:

$ spark-sql --master k8s://{k8s-apiserver} --conf spark.kubernetes.container.image=ccr.ccs.tencentyun.com/timxbxu/spark:v3.0.1 --conf spark.sql.catalog.hive_prod=org.apache.iceberg.spaparkCatalog --conf spark.sql.catalog.hive_prod.type=hive --conf spark.sql.catalog.hive_prod.uri=thrift://tkbs-hive-metastore --conf spark.sql.warehouse.dir=hdfs://tkbs-hadoop-hdfs-nn/iceberg

各参数含义如下:

--master k8s://{k8s-apiserver}:Kubernetes 集群地址

--conf spark.kubernetes.container.image=ccr.ccs.tencentyun.com/timxbxu/spark:v3.0.1:Spark Iceberg 镜像

--conf spark.sql.catalog.hive_prod.type=hive:Spark Catalog 类型

--conf spark.sql.catalog.hive_prod.uri=thrift://tkbs-hive-metastore:Hive MetaStore 地址

--conf spark.sql.warehouse.dir=hdfs://tkbs-hadoop-hdfs-nn/iceberg:Spark 数据地址

创建 Iceberg 表:

spark-sql> CREATE TABLE hive_prod.db.table (id bigint, data string) USING iceberg;

查看是否创建成功:

spark-sql> desc hive_prod.db.table; 20/11/02 20:43:43 INFO BaseMetastoreTableOperations: Refreshing table metadata from new version: hdfs://10.0.1.129/iceberg/db.db/table/metadata/00000-1306e87a-16cb-4a6b-8ca0-0e1846cf1837.metadata.json 20/11/02 20:43:43 INFO CodeGenerator: Code generated in 21.35536 ms 20/11/02 20:43:43 INFO CodeGenerator: Code generated in 13.058698 ms id bigint data string # Partitioning Not partitioned Time taken: 0.537 seconds, Fetched 5 row(s) 20/11/02 20:43:43 INFO SparkSQLCLIDriver: Time taken: 0.537 seconds, Fetched 5 row(s)

查看 HDFS 是否存在表信息:

$ hdfs dfs -ls /iceberg/db.db Found 5 items drwxr-xr-x - root supergroup 0 2020-11-02 16:37 /iceberg/db.db/table

查看 Postgresql 是否存在表元数据信息:

$ kubectl get pod | grep postgresql tkbs-postgresql-5b9ddc464c-xc5nn 1/1 Running 1 7d19h$ kubectl exec tkbs-postgresql-5b9ddc464c-xc5nn -- psql -d metastore -c 'select * from "TBLS"'

向 Iceberg 表插入数据:

spark-sql> INSERT INTO hive_prod.db.table VALUES (1, 'a'), (2, 'b');

查看是否插入成功:

spark-sql> select * from hive_prod.db.table; ... 1 a 2 b Time taken: 0.854 seconds, Fetched 2 row(s) 20/11/02 20:49:43 INFO SparkSQLCLIDriver: Time taken: 0.854 seconds, Fetched 2 row(s)

查看 Kubernetes 集群 Spark 任务运行状态:

$ kubectl get pod | grep spark sparksql10-0-1-64-ed8e6f758900de0c-exec-1 1/1 Running 0 86s sparksql10-0-1-64-ed8e6f758900de0c-exec-2 1/1 Running 0 85s

Iceberg Spark 支持的更多操作可见:https://iceberg.apache.org/spark/

通过以上步骤,我们即可在 Kubernetes 上快速部署生产可用的实时数据湖平台。

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxpjy.html