如何将Spark数据帧写入Kinesis Stream?

时间:2019-07-08 21:31:43

标签: scala apache-spark apache-kafka kafka-consumer-api amazon-kinesis

我正在使用Spark Streaming从kafka主题创建数据框。 我想将数据框写入Kinesis Producer。 我了解到目前尚无官方API。但是,互联网上有多种API,但可惜的是,它们都不适合我。 Spark版本:2.2 斯卡拉:2.11

我尝试使用https://github.com/awslabs/kinesis-kafka-connector来构建jar。但是由于此jar和spark API之间的程序包名称冲突而导致错误。请帮忙。

###########这是其他代码:
spark-shell --jars spark-sql-kinesis_2.11-2.2.0.jar,spark-sql-kafka-0-10_2.11-2.1.0.jar,spark-streaming-kafka-0-10-assembly_2.10-2.1.0.jar --files kafka_client_jaas_spark.conf --properties-file gobblin_migration.conf --conf spark.port.maxRetries=100 --driver-java-options "-Djava.security.auth.login.config=kafka_client_jaas_spark.conf" --conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas_spark.conf" --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=kafka_client_jaas_spark.conf"

import java.io.File
import org.apache.commons.lang3.exception.ExceptionUtils
import org.apache.spark.SparkException
import org.apache.spark.deploy.SparkHadoopUtil
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import scala.sys.process._
import org.apache.log4j.{ Logger, Level, LogManager, PropertyConfigurator }
import org.apache.spark.sql.streaming.Trigger

val streamingInputDF =spark.readStream.format("kafka").option("kafka.bootstrap.servers","bootstrap server").option("subscribe", "<kafkatopic>").option("startingOffsets", "latest").option("failOnDataLoss", "false").option("kafka.security.protocol", "SASL_PLAINTEXT").load()

val xdf=streamingInputDF.select(col("partition").cast("String").alias("partitionKey"),col("value").alias("data"))

xdf.writeStream.format("kinesis").option("checkpointLocation", "<hdfspath>").outputMode("Append").option("streamName", "kinesisstreamname").option("endpointUrl","kinesisendpoint").option("awsAccessKeyId", "accesskey").option("awsSecretKey","secretkey").start().awaitTermination()

对于jar spark-sql-kinesis_2.11-2.2.0.jar,请转到quoble,下载适用于您的Spark版本的软件包,然后构建jar。

如果您在公司网络后面,请在启动spark之前设置代理。 导出http_proxy = http://server-ip:port/ 导出https_proxy = https://server-ip:port/

1 个答案:

答案 0 :(得分:1)

Kafka Connect是一项服务,您可以在该服务中发布连接器规范(在这种情况下为运动),然后该服务将运行连接器。在处理记录时,它还支持许多转换。 Kafka Connect插件不适用于Spark应用程序。

如果您的用例要求您在处理记录时执行一些业务逻辑,则可以采用Spark流式处理或结构化流式处理方法。

如果您想采用基于Spark的方法,以下是我能想到的两个选择。

  1. 使用结构化流。您可以为Kinesis使用Strucuted流式连接器。您可以找到一个here。可能还有其他人。这是我所知道的唯一稳定且开源的连接器。您可以找到将Kinesis用作接收器here的示例。

  2. 使用Kinesis Producer Libraryaws-java-sdk-kinesis库从您的Spark Streaming应用程序发布记录。在这里,使用KPL是首选方法。您可以执行mapPartitions并为每个分区创建Kinesis客户端,并使用这些库发布记录。 AWS文档中有很多关于这两个库的示例。