1:写到外部数据源,表面上看是spark去写,实际上就是jvm去操作。jvm写数据库,spark streaming就可以写数据库。jvm如果能写到Hbase或者Redius中,Spark也能。

2:spark streaming中我们使用Dstream.foreachRDD(),来把Dstream中的数据发送到外部的文件系统中,外部文件系统主要是数据库,Hbase,Redius,数据库比较少量的数据,Redius,中等规模的分布式数据。Hbase则是超大规模的数据。实际生产环境下如果你数据真的非常大,一般首先放在kafka中。然后再通过kafka给Hbase。

将数据结果通过socket写到web  Server上

3:Dstream是在Driver上执行,是RDD的一种封装,实际上执行在Cluster上执行的是RDD,而Dstream是RDD的一种封装所以不是在Worker的Excutor上执行的,一个在Driver中,一个Excutor要用到连接器,那么要求Connector必须要序列化,但是数据库的句柄不能在socket中序列化,连接上数据库,这个数据库的句柄一般没听说过可以序列化或者反序列化。连接数据库一般在什么地方执行,在什么地方链接数据库。而不是在这里链接过数据库之后,弄一个序列化传到另外一台机器jvm中,让他反序列化继续链接,因为RDD在foreach的时候,在Executor中执行,它要这个connector的话,connection必须随着我们的任务广播到我们集群的Executor中。一广播就需要序列化和反序列化。所以connector不是可序列化的。再者connection是和网络通信有关,你怎么序列化。

4:链接上数据库的时候,如果每条数据都建立一个新的connection,内存很快就会耗光。

5:partition肯定是在一台机器上的。一台机器上可能有很多partition,我们有必要复用这个连接器connection。

6:rdd.foreachPartition()可以构建神奇的功能,就是它可以让底层的数据变化,它不会导致整个Dstream的执行,必须由foreach等action触发。spark基于rdd编程的时候,rdd数据是不变的。这是rdd的规则,但是如果你擅长使用foreachPartition的话,底层的数据可以改变,去进行计算。因为spark 的rdd是分布式函数编程。有时候底层的数据改变是一种业务的需要。foreachPartition是通过操作一个具体的数据结构来实现的。正常认为的rdd中是一条一条的数据,这一条条的数据从rdd的角度看,不变就不变。但一条条记录里面的内容是可以变得。即spark可以运行在动态数据源上。或者数组的内容不变,指向的索引可以变。

7:Dstream.foreachRDD();和transform一样,可以直接基于RDD编程。这里主要是写入了数据库中