从Apache Kafka到Apache Spark安全地读取数据
Posted 大数据技术汇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Apache Kafka到Apache Spark安全地读取数据相关的知识,希望对你有一定的参考价值。
随着CDH平台上物联网用例数量的不断增加,此类工作负载的安全性至关重要。本章描述了如何以安全的方式从Spark中的Kafka(这是物联网用例的两个关键组件)中消费数据。
Apache Kafka 2.0.0的Cloudera发行版(基于Apache Kafka 0.9.0)引入了一个新的Kafka使用者API,允许消费者从安全的Kafka集群读取数据。这允许管理员锁定他们的Kafka集群,并要求客户端通过Kerberos进行身份验证。它还允许客户在与Kafka代理(通过SSL / TLS)通信时通过网络加密数据。随后,在Apache Kafka 2.1.0的Cloudera Distribution中,Kafka引入了对通过Apache Sentry进行授权的支持。这使Kafka管理员可以锁定某些主题并将权限授予特定角色和用户,从而利用基于角色的访问控制。
现在,从Cloudera Distribution of Spark 2.1 release 1开始,我们可以从Spark中的Kafka安全地读取功能。要详细了解Spark 2的Cloudera Distribution,请参阅文档。
要求
Cloudera发布Spark 2.1版本1或更高版本。
Cloudera发布的Kafka 2.1.0或更高版本。
建筑
在安全的Kafka集群中使用Spark中的新直接连接器(此处提供了源代码)支持。直接连接器不使用单独的进程(AKA 接收器)来读取数据。相反,Spark驱动程序会跟踪各种Kafka主题分区的偏移量,并将偏移量发送给直接从Kafka读取数据的执行程序。下面显示了一个直接连接器的简单描述。
图1:Spark中的Kafka直接连接器。
重要的一点是Spark要以分布的方式访问Kafka的数据。Spark中的每个任务都会从Kafka主题的特定分区(称为主题分区)中读取数据。主题分区在卡夫卡经纪人中是理想的均匀分布。你可以阅读Spark如何将执行者放置在这里。
但是,为了以分布式方式从安全的Kafka读取数据,我们需要在Kafka(KAFKA-1696)中使用Hadoop风格的代理令牌,在撰写本文时(2017年春季),对此尚不存在支持。
我们考虑了多种方法来解决这个问题,但最终决定推荐的解决方案是从Kafka安全地读取数据(至少引入Kafka委托令牌支持),Spark应用程序将分发用户的密钥表,以便执行者可以访问它。然后,执行者将使用与他们共享的用户密钥表来与Kerberos密钥分发中心(KDC)进行身份验证,并从卡夫卡经纪商处读取。YARN分布式缓存用于从客户端(即网关节点)发送并与驱动程序和执行程序共享密钥表。下图显示了当前解决方案的概述。
图2:当前解决方案(假设YARN集群模式)。
这种方法常常引起一些担忧:
它不被认为是运送密钥表的最佳安全措施。
如果有大量Kafka主题分区,则所有执行者可能会同时尝试登录到KDC,这可能会导致所谓的重播攻击(类似于DDOS攻击)。
关于第一点,Spark已经使用分布式缓存将用户的keytab从客户端(AKA网关)节点发送给驱动程序,并且由于缺乏委托令牌,因此无法绕过它。管理员可以选择将密钥表分发给Spark之外的各种Spark执行程序节点(即YARN节点,因为Spark在YARN上运行),并调整共享示例应用程序(请参阅下面的示例应用程序)以减轻这种担忧。
关于第二点,我们在Kafka主题中测试了超过1,000个主题分区,并通过增加分区数量来看到对KDC服务器没有不利影响。
示例应用程序
一个示例Spark Streaming应用程序可从此处获取Kerberos使用SSL保护的Kafka数据。
与Apache Sentry集成
示例应用程序假定未使用Kafka授权。如果使用Kafka授权(通过Apache Sentry),则必须确保应用程序中指定的使用者组在Sentry中获得授权。例如,如果您的应用程序消费者组的名称是my-consumer-group
,则您必须同时访问这两者my-consumer-group
和spark-executor-my-consumer-group
(即前缀为的用户组名称spark-executor-
)。这是因为Spark驱动程序使用应用程序指定的使用者组,但Spark执行程序在此集成中使用不同的使用者组,该组中的前缀spark-executor-
位于驱动程序使用者组的名称前面。
您可以在文档中找到有关Kafka Sentry集成的更多信息。
结论
回顾一下,您可以使用Apache Kafka 2.1.0(或更高版本)的Cloudera Distribution和Apache Spark 2.1 release 1(或更高版本)的Cloudera Distribution以安全的方式使用来自Kafka的Spark中的数据 - 包括身份验证(使用Kerberos),授权(使用Sentry)以及通过线路加密(使用SSL / TLS)。
以上是关于从Apache Kafka到Apache Spark安全地读取数据的主要内容,如果未能解决你的问题,请参考以下文章
在执行spar-sql程序中报错:java.lang.NoSuchMethodError: org.apache.spark.internal.Logging.$init$(Lorg/apache/s
使用 Apache Camel Source 从 S3 到 Kafka
如何从 Kafka JSON 消息中获取 org.apache.kafka.connect.data.Decimal 值 [重复]
使用 Apache Kafka 将数据从 MSSQL 同步到 Elasticsearch