从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集群模式)。

这种方法常常引起一些担忧:

  1. 它不被认为是运送密钥表的最佳安全措施。

  2. 如果有大量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-groupspark-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

[译]从LinkedIn,Apache Kafka到Unix哲学

如何使用 Apache Kafka 使用 SpringBoot 将数据从一个微服务发送到另一个微服务?