You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dataproc集群中配置Kerberos并运行SQL Server读取脚本

Dataproc集群Kerberos配置与Spark作业迁移方案

1. Dataproc集群的Kerberos整体配置步骤

  • 创建带Kerberos的Dataproc集群:用gcloud命令创建时关联你的AD域(适配Windows身份验证服务账号),命令示例:
    gcloud dataproc clusters create <集群名> \
      --region <区域> \
      --kerberos-realm <你的AD域> \
      --kerberos-kdc <AD域控制器地址> \
      --kerberos-admin-server <AD域控制器地址> \
      --service-account <Dataproc服务账号>
    
  • 配置krb5.conf:登录集群主节点,编辑/etc/krb5.conf,替换为和本地一致的AD域配置,核心内容示例:
    [libdefaults]
      default_realm = YOUR_AD_REALM.COM
      dns_lookup_kdc = true
      dns_lookup_realm = true
    [realms]
      YOUR_AD_REALM.COM = {
        kdc = ad-controller.your-ad-realm.com
        admin_server = ad-controller.your-ad-realm.com
      }
    
  • 上传服务账号keytab:将本地生成的服务账号keytab(如sql_service.keytab)上传至集群统一路径(比如/etc/security/keytabs/),设置权限为600,确保仅root和Spark进程可访问。
  • 同步SQL Server权限:确认服务账号已在SQL Server中配置登录权限,且SQL Server已加入AD域、SPN配置正确。

2. 集群创建后的令牌刷新处理

  • 定时自动刷新:给Spark用户配置crontab定时任务,定期执行kinit刷新令牌,示例:
    # 切换到Spark用户
    su spark
    # 编辑定时任务
    crontab -e
    # 添加每日凌晨2点刷新的任务
    0 2 * * * kinit -kt /etc/security/keytabs/sql_service.keytab <服务账号@YOUR_AD_REALM.COM>
    
  • 用k5start工具自动维持令牌:安装k5start后后台运行,每12小时自动刷新,命令示例:
    # 安装k5start
    apt-get install k5start
    # 后台启动,每12小时刷新一次令牌
    k5start -f /etc/security/keytabs/sql_service.keytab <服务账号@YOUR_AD_REALM.COM> -K 43200 -D
    
  • Spark作业级自动认证:提交作业时指定--keytab和--principal参数,让作业自动获取令牌,无需手动执行kinit。

3. Dataproc上运行的PySpark代码示例

PySpark脚本(sql_server_kerberos.py)

from pyspark.sql import SparkSession

def main():
    spark = SparkSession.builder \
        .appName("SQLServerKerberosRead") \
        .getOrCreate()

    # JDBC连接参数
    jdbc_url = "jdbc:sqlserver://<SQL_SERVER_IP>:1433;databaseName=<DB_NAME>;integratedSecurity=true;authenticationScheme=JavaKerberos"
    connection_properties = {
        "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver",
        "principal": "<服务账号@YOUR_AD_REALM.COM>"
    }

    # 读取SQL Server表
    df = spark.read.jdbc(
        url=jdbc_url,
        table="<TABLE_NAME>",
        properties=connection_properties
    )

    # 打印前10条数据验证
    df.show(10)
    spark.stop()

if __name__ == "__main__":
    main()

作业提交命令

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --keytab /etc/security/keytabs/sql_service.keytab \
  --principal <服务账号@YOUR_AD_REALM.COM> \
  --jars /path/to/mssql-jdbc-<版本号>.jar,/path/to/sqljdbc_auth-<版本号>.so \
  sql_server_kerberos.py

注:需提前将SQL Server JDBC驱动(mssql-jdbc.jar)和Linux版认证库(sqljdbc_auth.so)上传至集群并指定路径。

内容的提问来源于stack exchange,提问作者saravana ir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:00:16