spark2.0 用socket接收数据并处理

假如你想监听一个数据服务器上的TCP Socket来获取源源不断的数据流,同时你想要实时的计算单词的数量。

object SocketComplete {
  def main(args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.WARN)
    //首先,我们需要导入必要的classes,并且创建一个本地运行的SparkSession,它是链接到Spark的程序入口。
    val spark = SparkSession.builder.
      appName("Spark shell").
      getOrCreate()
    import spark.implicits._
    //接收数据类型是socket,IP是slave6,端口号是8008
    val lines: DataFrame = spark.readStream.format("socket").option("host", "192.168.0.56").option("port", 8008).load()
    //这个Lines DataFrame表示了一个包含了流式数据的无边界表。此表包含一列的字符串,名字为value,数据流中的每一行变成了表中的一个Row。
    // 注意,现在还没有接收任何的数据,仅仅是定义了转换操作的流程,并没有启动转换操作。
    // 接下来我们使用lines.as[String]将DataFrame转换成String类型的Dataset
    // (注:Spark2.0中DataFrame和DataSet的API整合到了一起,DataFrame作为Dataset的一个特例存在,DataFrame=Dataset[Row]),
    // 因此我们可以对Dataset应用flatMap操作来分割一行数据,转化为单词的集合,
    // 结果集words Dataset包含了所有的单词。最终,我们通过groupingby(vlaue)将单词进行分组,然后使用count来计算它们。
    // 注意,这是一个流式的DataFrame,表示了计算一个源源不断的文本数据流中单词的数量。
    val words: Dataset[String] = lines.as[String].flatMap(_.split(" "))
    // 结果集words Dataset包含了所有的单词。最终,我们通过groupingby(vlaue)将单词进行分组,然后使用count来计算它们。
    // 注意,这是一个流式的DataFrame,表示了计算一个源源不断的文本数据流中单词的数量。
    val wordCounts: DataFrame = words.groupBy("value").count()
    //我们将会把全量的结果打印到控制台,(结果集的输出操作有三种模式,complete mode,append mode和update mode,
    // 稍后会详细介绍,指定mode使用outputMode(“complete”)),每次结果集更新,都会把所有的结果都打印一次。
    // 使用start()来启动流式数据计算流程。
    val query: StreamingQuery = wordCounts.writeStream.outputMode("complete").format("console").start()
    query.awaitTermination()

  }
}



 
 
OutPut可以定义不同的存储方式,有如下3种:

1:Complete Mode – 整个更新的结果集都会写入外部存储。整张表的写入操作将由外部存储系统的连接器Connector。

2:Append Mode – 当时间间隔触发时,只有在Result Table中新增加的数据行会被写入外部存储。这种方式只适用于结果集中已经存在的内容不希望发生改变的情况下,如果已经存在的数据会被更新,不适合适用此种方式。

3:Update Mode – 当时间间隔触发时,只有在Result Table中被更新的数据才会被写入外部存储系统(在Spark2.0中暂时尚未可用)。注意,和Complete Mode方式的不同之处是不更新的结果集不会写入外部存储。*/

猜你喜欢

转载自blog.csdn.net/zmc921/article/details/76436604
今日推荐