SparkStreamingContext是在驱动程序上创建的,无法序列化。因此,我们无法在工人上访问此对象。现在,为了利用Spark的分布式特性,我们将处理工作者的数据/流。因此,直接从工作人员保存数据而不是将所有数据收集到可能给OOM的驱动程序是有意义的。
我有这样的场景,我需要应用一些业务逻辑,最后需要将数据存储到cassandra。那么,我该怎么做呢?
DStream.foreachRDD{ x => x.foreachPartition { some logic and finally Store the data to cassandra } }
答案 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连接配置的对象,因此请将其设置在那里。
SparkConf
是SparkContext
的一部分,但你真的不必担心它。如果您需要访问StreamingContext
或当前SparkContext
,那么您可以这样做
SparkConf
如何保存到Cassandra部分,可以这样做:
StreamingContext ssc = new StreamingContext(sparkConf, Seconds(1))
ssc.sparkContext => Your Spark Context object
ssc.sparkContext.getConf => Your SparkConf object