
# Spark on iceberg最佳实践
#### 概述
Iceberg是一种开放的数据湖表格式。您可以借助Iceberg快速地在HDFS或者华为云OBS上构建自己的数据湖存储服务，并借助开源大数据生态的Spark、Flink、Hive和Trino等计算引擎来实现数据湖的分析。
#### 前提条件
- 完成Hadoop部署和对接OBS，详情参考[Hadoop对接OBS](https://support.huaweicloud.com/bestpractice-obs/obs_05_1507.html)。
- 完成Spark部署。 如果数据目录Catalog选择Hive，Spark请使用预构建的包含Hive的Spark版本，可以spark-xxx-bin-hadoop3.tgz或者使用以下命令构建：
  ```
  mvn -DskipTests clean package -Phive -Phive-thriftserver
  ```
  注意，spark-xxx-bin-without-hadoop.tgz预构建没有包含Hive，请避免使用。
  
 
#### 配置spark on iceberg环境
1. [下载](https://iceberg.apache.org/docs/nightly/spark-getting-started/)iceberg-spark-runtime-xxx.jar。
2. 将iceberg-spark-runtime-xxx.jar复制到${SPARK_HOME}/jars
 
#### 创建Spark Catalog
您可以根据自身业务环境选择使用HMS或者Hadoop提供Catalog。
**选项一：使用HMS（Hive MetaStore** **Service** **）提供Catalog**
1. 部署HMS，推荐您使用远程模式部署。
2. 配置HMS和OBS。 
   执行以下命令，进入配置文件编辑页面：
   ```
   vim ${SPARK_HOME}/conf/spark-defaults.conf
   ```
   在配置文件中写入以下配置项：
   ```
   spark.sql.catalog.hive_prod = org.apache.iceberg.spark.SparkCatalog
   spark.sql.catalog.hive_prod.type = hive
   spark.sql.catalog.hive_prod.uri = thrift://jtc-vm:9083
   spark.sql.catalog.hive_prod.warehouse = obs://jtc-pfs001/warehouse/spark-iceberg
   ```
   其中uri参数为HMS服务的URI，warehouse参数为OBS桶内目录的路径，您需要结合自身的业务和环境进行配置。
   修改完成后，按"Esc"，输入**:wq**保存并退出文件编辑。
   
   
3. 启动spark-sql，命令如下： 
   ```
   ${SPARK_HOME}/bin/spark-sql
   ```
   
   
4. 启动成功后，指定catalog，命令如下： 
   ```
   use hive_prod;
   ```
   
   
5. 创建数据库和表，命令如下： 
   ```
   CREATE DATABASE db_xxx;
   use db_xxx;
   CREATE TABLE tbl_xxx(...);
   ```
   
   
**选项二：使用Hadoop提供Catalog**
1. 配置Hadoop和OBS。 
   执行以下命令，进入配置文件编辑页面：
   ```
   vim ${SPARK_HOME}/conf/spark-defaults.conf
   ```
   在配置文件中写入以下配置项：
   ```
   spark.sql.catalog.hadoop_prod = org.apache.iceberg.spark.SparkCatalog
   spark.sql.catalog.hadoop_prod.type = hadoop
   spark.sql.catalog.hadoop_prod.warehouse = obs://jtc-pfs001/warehouse/spark-iceberg-hadoop-prod
   ```
   其中warehouse参数为OBS桶内目录的路径，您需要结合自身的业务和环境进行配置。
   修改完成后，按"Esc"，输入**:wq**保存并退出文件编辑。
   
   
2. 启动spark-sql，命令如下： 
   ```
   ${SPARK_HOME}/bin/spark-sql
   ```
   
   
3. 启动成功后，指定Catalog，命令如下： 
   ```
   use hadoop_prod;
   ```
   
   
4. 创建数据库和表，命令如下： 
   ```
   CREATE DATABASE db_xxx;
   use db_xxx;
   CREATE TABLE tbl_xxx(...);
   ```
   
   
 
