如何使用pyspark流应用程序中具有不同主题的两个不同流将数据从Kafka存储到Redis?

时间:2016-02-10 22:26:32

标签: apache-spark redis apache-kafka pyspark spark-streaming

我有一个配置2个数据流的pyspark应用程序:

数据流A)从kafka读取(主题1和2) - >合并主题DStreams - >做东西 - >输出到REDIS。

数据流B)从kafka读取(主题3,4和5) - >合并主题DStreams - >做东西 - >输出到同一个REDIS。

我只能在配置其中一个数据时才能获取REDIS内的数据,但不能同时获取这两个数据。

实际上,即使我将REDIS输出更改为pprint,也会发生这种情况。如果两个流中只有一个是活动的,我只会打印输出。

我缺少什么?

2 个答案:

答案 0 :(得分:1)

问题是可用的执行线程数。

Spark文档说每个接收者使用一个专用线程来获取数据。我在本地模式下运行这个应用程序,主URL为“local [*]”,因为我的PC有4个核心,所以给了我4个线程。

由于我的应用程序配置了5个不同的kafka主题来读取,我需要至少6个线程(5 + 1用于驱动程序)才能运行我的程序。因为我只有4,并且DStreams在下游合并,所以计算永远不会开始。

解决方案:MASTER_URL = local[10]

答案 1 :(得分:0)

您是否尝试加入2 Dstream我的意思是第一个流点指向topicA,返回(K,V),第二个DStream监控topicB返回(K,V1)。如果是,则可以使用join()方法加入2 DStream,该方法将返回(K(V,V1))。

或者你想在创建流(KafkaUtils.createStream())时传递TopicA,TopicB,然后将(K,V)后面的(K,V1)插入Redis?