Apache spark 融合云Kafka连通性问题的Spark结构化流
我正在用PySpark编写一个Spark结构化流媒体应用程序,以从融合云中的Kafka读取数据。sparkApache spark 融合云Kafka连通性问题的Spark结构化流,apache-spark,pyspark,apache-kafka,spark-streaming,Apache Spark,Pyspark,Apache Kafka,Spark Streaming,我正在用PySpark编写一个Spark结构化流媒体应用程序,以从融合云中的Kafka读取数据。sparkreadstream()函数的文档太浅,没有对可选参数部分特别是auth机制部分进行太多的说明。我不确定哪个参数出错并导致连接崩溃。在Spark有经验的人能帮我建立这个连接吗 所需参数 /usr/hdp/2.6.1.0-129/spark2/bin/spark-submit --packages com.databricks:spark-avro_2.11:3.2.0,org.apache.
readstream()
函数的文档太浅,没有对可选参数部分特别是auth机制部分进行太多的说明。我不确定哪个参数出错并导致连接崩溃。在Spark有经验的人能帮我建立这个连接吗
所需参数
/usr/hdp/2.6.1.0-129/spark2/bin/spark-submit --packages com.databricks:spark-avro_2.11:3.2.0,org.apache.spark:spark-avro_2.11:2.4.0,org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0 --conf spark.ui.port=4055 --files /home/jass/path,/home/bdpda/bdpda.headless.keytab --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/home/jass/path" --conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=/home/jass/path" pysparkstructurestreaming.py
这是我的Pypark代码:
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "cluster.gcp.confluent.cloud:9092") \
.option("subscribe", "test-topic") \
.option("kafka.sasl.mechanisms", "PLAIN")\
.option("kafka.security.protocol", "SASL_SSL")\
.option("kafka.sasl.username","xxx")\
.option("kafka.sasl.password", "xxx")\
.option("startingOffsets", "latest")\
.option("kafka.group.id", "python_example_group_1")\
.load()
display(df)
但是,我不断得到一个错误:
kafkashaded.org.apache.kafka.common.KafkaException:未能
建构卡夫卡消费者
数据块笔记本-用于测试
文档
此错误表示您的Kafka消费者看不到JAAS配置。要解决此问题,请根据以下步骤包括JAS: Step01:为以下JAAS文件创建文件:/home/jass/path
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="kafka";
};
Step02:根据下面的conf参数调用spark submit中的JASS文件路径
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/home/jass/path"
满火花提交命令:
/usr/hdp/2.6.1.0-129/spark2/bin/spark-submit --packages com.databricks:spark-avro_2.11:3.2.0,org.apache.spark:spark-avro_2.11:2.4.0,org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0 --conf spark.ui.port=4055 --files /home/jass/path,/home/bdpda/bdpda.headless.keytab --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/home/jass/path" --conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=/home/jass/path" pysparkstructurestreaming.py
Pyspark结构化流媒体示例代码:
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark.streaming import StreamingContext
import time
# Spark Streaming context :
spark = SparkSession.builder.appName('PythonStreamingDirectKafkaWordCount').getOrCreate()
sc = spark.sparkContext
ssc = StreamingContext(sc, 20)
# Kafka Topic Details :
KAFKA_TOPIC_NAME_CONS = "topic_name"
KAFKA_OUTPUT_TOPIC_NAME_CONS = "topic_to_hdfs"
KAFKA_BOOTSTRAP_SERVERS_CONS = 'kafka_server:9093'
# Creating readstream DataFrame :
df = spark.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", KAFKA_BOOTSTRAP_SERVERS_CONS) \
.option("subscribe", KAFKA_TOPIC_NAME_CONS) \
.option("startingOffsets", "earliest") \
.option("kafka.security.protocol","SASL_SSL")\
.option("kafka.client.id" ,"Clinet_id")\
.option("kafka.sasl.kerberos.service.name","kafka")\
.option("kafka.ssl.truststore.location", "/home/path/kafka_trust.jks") \
.option("kafka.ssl.truststore.password", "password_rd") \
.option("kafka.sasl.kerberos.keytab","/home/path.keytab") \
.option("kafka.sasl.kerberos.principal","path") \
.load()
df1 = df.selectExpr( "CAST(value AS STRING)")
# Creating Writestream DataFrame :
df1.writeStream \
.option("path","target_directory") \
.format("csv") \
.option("checkpointLocation","chkpint_directory") \
.outputMode("append") \
.start()
ssc.awaitTermination()
我们需要指定
kafka.sasl.jaas.config
为合流的kafka-sasl-SSL auth方法添加用户名和密码。它的参数看起来有点奇怪,但它工作正常
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "pkc-43n10.us-central1.gcp.confluent.cloud:9092") \
.option("subscribe", "wallet_txn_log") \
.option("startingOffsets", "earliest") \
.option("kafka.security.protocol","SASL_SSL") \
.option("kafka.sasl.mechanism", "PLAIN") \
.option("kafka.sasl.jaas.config", """kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="xxx" password="xxx";""").load()
display(df)
您是否尝试过使用其他消费者@cricket_007,还没有,因为其中一个要求是流连接,它仅由结构化流支持。直接流在连接两个流时有限制。因此,这就是为什么我需要使用
readStream()
。在线资源只提供更多的数据流。很难找到答案谢谢你精心编辑的答案。它实际上在Spark Cluster中工作。对于sparkshell
用例,我们可能需要添加--驱动程序java选项“-Djava.security.auth.login.config=/home/jass/path”