将数据从SparkStreaming保存到Spark Workers的Cassandra是否可行

时间:2016-09-09 13:17:36

标签: java apache-spark cassandra spark-streaming datastax-enterprise

SparkStreamingContext是在驱动程序上创建的,无法序列化。因此,我们无法在工人上访问此对象。现在,为了利用Spark的分布式特性,我们将处理工作者的数据/流。因此,直接从工作人员保存数据而不是将所有数据收集到可能给OOM的驱动程序是有意义的。

我有这样的场景,我需要应用一些业务逻辑,最后需要将数据存储到cassandra。那么,我该怎么做呢?

DStream.foreachRDD{ x => x.foreachPartition {  some logic and finally Store the data to cassandra }  } 

2 个答案:

答案 0 :(得分:3)

您可以使用datastax的spark-cassandra-connector(https://github.com/datastax/spark-cassandra-connector),它允许将JavaDStream直接存储到Cassandra DB中。

import static com.datastax.spark.connector.japi.CassandraStreamingJavaUtil.javaFunctions;

Map<String, String> columnNameMappings;
JavaDStream<MyTableData> myDStream;
javaFunctions(myDStream).writerBuilder("mykeyspace", "my_table",
            CassandraJavaUtil.mapToRow(MyTableData.class, columnNameMappings)).saveToCassandra();

答案 1 :(得分:1)

template <std::size_t ... Is>
constexpr fibVals ( indexSeq<Is...> const & )
   : vals { { fib<Is, T>::value ... } }
 { }

constexpr fibVals () : fibVals { typename indexSeqHelper<I>::type { } }
 { }

val sparkConf = new SparkConf().setAppName("Test App") sparkConf.set("spark.cassandra.connection.host", "X.X.X.X") sparkConf.set("spark.cassandra.auth.username", "xxxxx") sparkConf.set("spark.cassandra.auth.password", "xxxxx") 是上下文中保存Cassandra连接配置的对象,因此请将其设置在那里。

SparkConfSparkContext的一部分,但你真的不必担心它。如果您需要访问StreamingContext或当前SparkContext,那么您可以这样做

SparkConf

如何保存到Cassandra部分,可以这样做:

StreamingContext ssc = new StreamingContext(sparkConf, Seconds(1))
ssc.sparkContext   => Your Spark Context object
ssc.sparkContext.getConf   => Your SparkConf object