在PySpark作业上打印Kafka调试消息

时间:2019-04-30 04:46:33

标签: apache-spark pyspark apache-kafka apache-spark-sql spark-structured-streaming

在运行PySpark作业时,是否可以打印Kafka调试消息(我正在考虑类似于librdkafka调试消息或kafkacat -D选项的日志消息)?

问题是我在PySpark上使用以下代码连接到名为A的Kafka集群,它可以工作,并且每当有新消息传入时,将内容打印到控制台上。但是当我切换到另一个集群时, B并以与群集A相同的方式进行设置,当有新消息传入时它没有将任何内容打印到屏幕上,我可以看到在两个群集上使用kafkacat工具都可以正常运行该消息。

consumer.py

from pyspark import SparkContext
from pyspark.sql import SQLContext, SparkSession

from pyspark.sql import SparkSession
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils

spark = SparkSession.builder.appName("KafkaConsumer").getOrCreate()
sc = spark.sparkContext
sqlc = SQLContext(sc)

hosts = "host1:9092,host2:9092,host3:9092"
topic = "myTopic"
securityProtocol = "SASL_PLAINTEXT"
saslMechanism = "PLAIN"

try:
  df = sqlc \
    .readStream \
    .format("kafka") \
    .option("kafka.bootstrap.servers", hosts) \
    .option("kafka.security.protocol", securityProtocol) \
    .option("kafka.sasl.mechanism", saslMechanism) \
    .option("startingOffsets", "earliest") \
    .option("subscribe", topic) \
    .load()

  dss = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)") \
    .writeStream.outputMode('append') \
    .format("console") \
    .start()

  dss.awaitTermination()
except KeyboardInterrupt:    
  print 'shutting down...'

kafka.jaas

KafkaClient {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="user1"
   password="sssshhhh"
   serviceName="kafka";
};

shell命令:

spark-submit \
    --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.3.1 \
    --files "kafka.jaas" \
    --driver-java-options "-Djava.security.auth.login.config=kafka.jaas" \
    --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=kafka.jaas" \
    "./consumer.py"

似乎kafka群集B可以访问,因为我能够从中获取偏移量信息,但是它只是不读取消息。

1 个答案:

答案 0 :(得分:0)

此问题是由于工作程序节点连接到Kafka集群而引起的,工作程序节点IP地址不在Kafka集群的防火墙白名单中。上面的代码导致工作节点超时,并继续尝试连接到Kafka集群,直到发出中断信号为止。

关于错误消息本身,由于工作程序节点仍在尝试连接到Kafka群集,因此未向主节点生成任何错误消息,但是在主控制台上偶尔会打印出一条消息,指出该失败与工作节点通信(或诸如“收集信息”之类的消息)。

注意:这是我假定在工作程序节点中发生的(由于管理员权限而无法登录),但是可能在工作程序节点上存储了日志。 (如果有人可以支持或证明其他方式,将不胜感激)

对于Kafka调试消息本身,如果根据记录器级别的设置发生错误,信息或警告,则默认情况下好像已经打印到屏幕上,在这种情况下,日志消息可能不会在屏幕上直接可见。