配置Spark对接LakeFormation
使用pyspark时,需要将以下配置中“spark.hadoop”开头的参数去掉“spark.hadoop”后配置到hive-site.xml配置文件中。
对接通用配置
在“spark/conf/spark-defaults.conf”中添加以下配置:
# 项目ID,必选参数,此处配置值仅作为参考 spark.hadoop.lakeformation.project.id=项目ID # LakeFormation实例ID,可选参数,通过LakeFormation实例界面获取,如不填写则连接到默认实例,此处配置值仅作为参考 spark.hadoop.lakeformation.instance.id=LakeFormation实例ID #访问lakeformation IAM认证AK信息,可选参数,若自定义认证信息获取类可忽略 spark.hadoop.lakeformation.authentication.access.key=AK信息 #访问lakeformation IAM认证SK信息,可选参数,若自定义认证信息获取类可忽略 spark.hadoop.lakeformation.authentication.secret.key=SK信息 #访问lakeformation IAM认证信息securitytoken,可选参数,搭配临时AK/SK使用,若使用永久AK/SK或自定义认证信息获取类可忽略 spark.hadoop.lakeformation.authentication.security.token=securitytoken信息
其中项目ID为必选配置,其他为可选配置,根据实际情况进行填写。
- 项目ID:可参考获取项目ID获取。
- LakeFormation实例ID:可参考如何获取LakeFormation实例ID获取。
- AK/SK信息可参考如何获取AK/SK获取。
- securitytoken可参考通过token获取临时访问密钥和securitytoken获取。
将上述配置添加到hive-site.xml或core-site.xml中亦可生效,添加时需要去除“spark.hadoop”前缀。
对接OBS
在“spark/conf/spark-defaults.conf”中添加以下配置:
# 对接OBS固定配置,Endpoint需要根据区域进行配置 spark.hadoop.fs.obs.impl=org.apache.hadoop.fs.obs.OBSFileSystem spark.hadoop.fs.AbstractFileSystem.obs.impl=org.apache.hadoop.fs.obs.OBS spark.hadoop.fs.obs.endpoint=obs.xxx.huawei.com # 指定访问OBS凭证获取类为LakeFormationObsCredentialProvider spark.hadoop.fs.obs.credentials.provider=com.huawei.cloud.dalf.lakecat.client.obs.LakeFormationObsCredentialProvider # 可选参数,关闭OBS文件系统缓存,长任务需要增加该配置,避免缓存中的临时AKSK失效 spark.hadoop.fs.obs.impl.disable.cache=true
Endpoint:不同服务不同区域的Endpoint不同。您可以从地区和终端节点中获取。
将上述配置添加到core-site.xml文件中亦可生效,添加时需要去除“spark.hadoop”前缀。
对接LakeFormation元数据
Spark对接LakeFormation有以下两种对接方式,建议根据需要选择其中一种方式进行对接。
- 使用SparkCatalogPlugin方式对接:SparkCatalogPlugin方式对接基于Spark SessionCatalogV2,支持对接多个Catalog,社区仍在持续开发当中,存在部分不支持的SQL语句。
- 使用MetastoreClient方式对接:MetastoreClient方式对接基于Spark HiveExternalCatalog机制与Hive MetastoreClient机制,支持Hive大部分SQL语句,但无法同时对接多个Catalog。
- 在“spark/conf/spark-defaults.conf”配置文件中补充以下配置,如需对接多个catalog,以下配置需要配置多行:
# 指定catalog实现类,必选配置(spark_catalog_name为spark中的catalog名称。根据实际需要替换,下同) spark.sql.catalog.${spark_catalog_name}=com.huawei.cloud.dalf.lakecat.client.spark.LakeFormationSparkCatalog # 需要对接的Catalog名称(lakeformation_catalog_name为lakeFormation中的catalog),可选配置,若不配置则对接到hive catalog中,此处配置值仅作为参考 spark.sql.catalog.${spark_catalog_name}.lakecat.catalogname.default=${lakeformation_catalog_name}
- 对接后验证。
对接后可通过spark-shell、spark-submit或spark-sql访问LakeFormation,以下以spark-sql为例:
- 在spark-defaults.conf中补充如下配置:
spark.sql.catalogImplementation=hive
- 在“spark/conf/”文件夹下新增文件hive-site.xml(如果已有该文件则编辑此文件),并在hive-site.xml中补充以下配置:
<configuration> <!--固定配置,开启自定义metastore客户端--> <property> <name>hive.metastore.session.client.class</name> <value>com.huawei.cloud.dalf.lakecat.client.hiveclient.LakeCatMetaStoreClient</value> </property> <!--需要对接的lakeformationCatalog名称,可选配置,若不配置则对接到hive catalog中,此处配置值仅作为参考--> <property> <name>lakecat.catalogname.default</name> <value>hive</value> </property> <!--hive执行路径,可选配置,未对接HDFS时默认为本地路径/tmp/hive,此处配置值仅作为参考--> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> </property> </configuration>
除在hive-site.xml中添加配置外,也可通过在spark-defaults.conf配置文件中以“spark.hadoop”开头添加配置,如添加“spark.hadoop.hive.metastore.session.client.class=com.huawei.cloud.dalf.lakecat.client.hiveclient.LakeCatMetaStoreClient”。
- “hive.exec.scratchdir”路径权限需要修改为777,否则会导致Hive客户端初始化异常。
- 需要在“lakecat.catalogname.default”对应的catalog中创建名称为“default”的数据库(已创建可忽略),否则会导致spark-sql初始化异常或spark-shell无法对接。
- 对接后验证。
集成SQL鉴权插件
- 使用鉴权插件必须实现并指定自定义用户信息获取类,详细操作请参考自定义用户信息获取类。
- 在spark-default.conf配置文件中添加如下配置:
com.huawei.cloud.dalf.lakecat.client.spark.v31.authorizer.LakeFormationSparkSQLExtension spark.sql.extensions=com.huawei.cloud.dalf.lakecat.client.spark.authorizer.LakeFormationSparkSQLExtension
- 集成权限插件后,若当前用户(通过自定义用户信息获取类指定)无对应元数据权限,在执行SQL时将抛出异常。
- 当前用户如果拥有IAM LakeFormation:policy:create权限,且当前用户(可通过自定义用户信息获取类指定)和认证信息(可通过自定义认证信息获取类指定)为统一用户,将跳过SQL鉴权。
- 当前,过滤相关功能暂未支持,包括库、表、行过滤,列掩码等。
日志打印
通过在log4j.properties中添加配置“log4j.logger.org.apache=WARN”,可关闭LakeFormation客户端httpclient请求日志。