【spark】pyspark kerberos 案例,即pyspark-utils客户端工具类

xml_utils.py文件:

python 复制代码
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET

def parse_xml(file_path):
    map = {}
    tree = ET.parse(file_path)
    root = tree.getroot()
    props = root.findall("property")
    for prop in props:
        name = prop.find('name').text
        value = prop.find('value').text
        map[name] = value
    return map

# test only
if __name__ == '__main__':
    xml_file = 'D:\hive\conf\hive-site.xml'
    map = parse_xml(xml_file)
    print(map)

spark_utils.py文件:

python 复制代码
# -*- coding: utf-8 -*-
import os
from pyspark.sql import SparkSession
from pyspark import SparkContext, SparkConf
from src.xml_utils import parse_xml

metastore_uris_key = "hive.metastore.uris"
metastore_princiapl_key = "hive.metastore.kerberos.principal"
metastore_sasl_enabled_key = "hive.metastore.sasl.enabled"


class SparkUtils(object):

    def __init__(self, hadoop_home
                 , hadoop_conf_dir
                 , principal
                 , keytab_path
                 , krb5_realm
                 , krb5_kdc
                 , krb5_conf
                 , hive_conf_dir
                 , log_level="INFO"):
        self.hadoop_home = hadoop_home
        self.hadoop_conf_dir = hadoop_conf_dir
        self.principal = principal
        self.keytab_path = keytab_path
        self.krb5_realm = krb5_realm
        self.krb5_kdc = krb5_kdc
        self.krb5_conf = krb5_conf
        self.hive_conf_dir = hive_conf_dir
        hive_site_map = parse_xml(f"{hive_conf_dir}/hive-site.xml")
        self.metastore_uris = hive_site_map.get(metastore_uris_key)
        self.metastore_princiapl = hive_site_map.get(metastore_princiapl_key)
        self.metastore_sasl_enabled = hive_site_map.get(metastore_sasl_enabled_key)
        self.java_options = f"-Djava.security.krb5.conf={krb5_conf} -Djava.security.krb5.realm={krb5_realm} -Djava.security.krb5.kdc={krb5_kdc}"
        self.log_level = log_level

    def get_spark(self):
        os.environ['HADOOP_HOME'] = self.hadoop_home
        os.environ['HADOOP_CONF_DIR'] = self.hadoop_conf_dir
        conf = SparkConf().setAppName("pyspark-sql") \
            .setSparkHome("local[*]") \
            .set("spark.sql.catalogImplementation", "hive") \
            .set(metastore_uris_key, self.metastore_uris) \
            .set(metastore_princiapl_key, self.metastore_princiapl) \
            .set(metastore_sasl_enabled_key, self.metastore_sasl_enabled) \
            .set("spark.driver.extraJavaOptions", self.java_options) \
            .set("spark.executor.extraJavaOptions", self.java_options) \
            .set("spark.yarn.keytab", self.keytab_path) \
            .set("spark.yarn.principal", self.principal)

        sc = SparkContext(conf=conf)
        sc.setLogLevel(self.log_level)
        spark = SparkSession(sc)
        return spark
python 复制代码
# -*- coding: utf-8 -*-

from pyspark.sql.types import *

from src.spark_utils import SparkUtils
import pandas as pd

if __name__ == '__main__':
    keytab_path = '/D:/kerberos/user.keytab'  # keytab位置
    principal = 'user@XXXXX.COM'
    hadoop_home = '/D:\env\components\hadoop'
    hadoop_conf_dir = 'D:\env\components\hadoop\etc\hadoop-exp'
    krb5_realm = "XXXXX.COM"
    krb5_kdc = "kdc.xxx.com"
    krb5_conf = "/D:\xxx\krb5.conf"
    hive_conf_dir = "D:\hive\conf"
    log_level = "INFO"

    spark_utils = SparkUtils(hadoop_home
                             , hadoop_conf_dir
                             , principal
                             , keytab_path
                             , krb5_realm
                             , krb5_kdc
                             , krb5_conf
                             , hive_conf_dir
                             , log_level)
    spark = spark_utils.get_spark()

    pd01 = spark.sql('select id,name,score from default.tbl1').toPandas()
    pd02 = spark.sql('select id,name,score from default.tbl2').toPandas()

    union_pd = pd.concat([pd01, pd02], ignore_index=True)
    agg_pd = union_pd.groupby(['id','name']).agg({'age': 'sum'}).reset_index()

    agg_pd_schema=StructType([
      StructField('id', StringType(), True),
      StructField('name', StringType(), True),
      StructField('total_score', LongType(), True)
      ])
    agg_df=spark.createDataFrame(agg_pd,schema=agg_pd_schema)
    # agg_df.show()
    agg_df.write.mode('overwrite').saveAsTable('default.tbl3')
    spark.stop()
相关推荐
try2find1 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
Qdgr_2 小时前
价值实证:数字化转型标杆案例深度解析
大数据·数据库·人工智能
选择不变2 小时前
日线周线MACD指标使用图文教程,通达信指标
大数据·区块链·通达信指标公式·炒股技巧·短线指标·炒股指标
博观而约取2 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
高山莫衣2 小时前
git rebase多次触发冲突
大数据·git·elasticsearch
链上Sniper2 小时前
智能合约状态快照技术:实现 EVM 状态的快速同步与回滚
java·大数据·linux·运维·web3·区块链·智能合约
wx_ywyy67983 小时前
推客系统小程序终极指南:从0到1构建自动裂变增长引擎,实现业绩10倍增长!
大数据·人工智能·短剧·短剧系统·推客系统·推客小程序·推客系统开发
蚂蚁数据AntData3 小时前
从性能优化赛到社区Committer,走进赵宇捷在Apache Fory的成长之路
大数据·开源·apache·数据库架构
精灵vector3 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习4 小时前
Python入门Day2
开发语言·python