如何连接火花流与卡桑德拉?

时间:2016-01-25 13:00:59

标签: apache-spark cassandra pyspark spark-streaming datastax

我正在使用

Cassandra v2.1.12
Spark v1.4.1
Scala 2.10

和cassandra正在倾听

rpc_address:127.0.1.1
rpc_port:9160

例如,要连接kafka和spark-streaming,每隔4秒听一次kafka,我就有以下火花工作

sc = SparkContext(conf=conf)
stream=StreamingContext(sc,4)
map1={'topic_name':1}
kafkaStream = KafkaUtils.createStream(stream, 'localhost:2181', "name", map1)

Spark-streaming每隔4秒就会继续收听kafka经纪人并输出内容。

同样,我希望spark streaming能够收听cassandra并输出指定表格的内容,每次说4秒

如何转换上面的流媒体代码,使其与cassandra而不是kafka一起使用?

非流媒体解决方案

我显然可以在无限循环中继续运行查询,但这不是正确的流式传输吗?

火花工作:

from __future__ import print_function
import time
import sys

from random import random
from operator import add
from pyspark.streaming import StreamingContext
from pyspark import SparkContext,SparkConf
from pyspark.sql import SQLContext
from pyspark.streaming import *

sc = SparkContext(appName="sparkcassandra")
while(True):
    time.sleep(5)
    sqlContext = SQLContext(sc)
    stream=StreamingContext(sc,4)
    lines = stream.socketTextStream("127.0.1.1", 9160)
    sqlContext.read.format("org.apache.spark.sql.cassandra")\
                 .options(table="users", keyspace="keyspace2")\
                 .load()\
                 .show()

像这样跑

sudo ./bin/spark-submit --packages \
datastax:spark-cassandra-connector:1.4.1-s_2.10 \
examples/src/main/python/sparkstreaming-cassandra2.py

我得到表值,其粗略看起来像

lastname|age|city|email|firstname

那么"流媒体"的正确方法是什么?来自cassandra的数据?

2 个答案:

答案 0 :(得分:2)

目前从C *流式传输数据的“正确方法”不是来自C *的流数据:)相反,将消息队列(如Kafka)放在C *和Stream之前通常更有意义。那。 C *不容易支持增量表读取,但如果聚类键基于插入时间,则可以执行此操作。

如果您对使用C *作为流媒体资源感兴趣,请务必查看并发表评论 https://issues.apache.org/jira/browse/CASSANDRA-8844 更改数据捕获

您最有可能寻找的是什么。

如果你实际上只是想定期阅读整个表并做一些事情,你可能最好只用一个cron作业启动一个批处理操作,因为你真的无法恢复状态。

答案 1 :(得分:0)

目前Cassandra本身不支持Spark 1.6中的流媒体源,您必须为自己的案例(listen to cassandra and output the contents of the specified table every say 4 seconds.)实现自定义接收器。

请参阅实施指南:

Spark Streaming Custom Receivers