spark-streaming 编程(四)自定义输出foreachRDD
来源:互联网 发布:linux tgz 编辑:程序博客网 时间:2024/06/05 19:47
foreachRDD可以自定义将结果输出到外部系统,比如hbase,mysql,hdfs等。
对于数据库之类的连接,错误的写法是为每一条数据创建一个数据库连接,那样将会导致严重的性能问题。正确的用法是为每一个DStream的分区创建一个连接,这个分区的数据处理完毕后释放。
dstream.foreachRDD { rdd => rdd.foreachPartition { partitionOfRecords => // 创建数据库连接池 val connection = ConnectionPool.getConnection() //插入该分区中的每条数据 partitionOfRecords.foreach(record => connection.send(record)) //将connection返回到连接池 ConnectionPool.returnConnection(connection) // return to the pool for future reuse }}
简易的示例代码
package com.lgh.sparkstreamingimport java.sql.DriverManagerimport org.apache.spark.SparkConfimport org.apache.spark.streaming.dstream.DStreamimport org.apache.spark.streaming.{Minutes, Seconds, StreamingContext}import org.apache.spark.streaming.kafka.KafkaUtils/** * Created by Administrator on 2017/8/23. */object ForeachRDD { def main(args: Array[String]): Unit = { if (args.length < 4) { System.err.println("Usage: KafkaWordCount <zkQuorum> <group> <topics> <numThreads>") System.exit(1) } //参数分别为 zk地址,消费者group名,topic名 多个的话,分隔 ,线程数 val Array(zkQuorum, group, topics, numThreads) = args //setmaster,local是调试模式使用 val sparkConf = new SparkConf().setAppName("KafkaWordCount").setMaster("local[2]") val ssc = new StreamingContext(sparkConf, Seconds(2)) ssc.checkpoint("checkpoint") //Map类型存储的是 key: topic名字 values: 读取该topic的消费者的线程数 val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap //参数分别为StreamingContext,kafka的zk地址,消费者group,Map类型 val kafkamessage = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap) //_._2取出kafka的实际消息流 val lines=kafkamessage.map(_._2) val words = lines.flatMap(_.split(" ")) val wordCounts: DStream[(String, Long)] = words.map(x => (x, 1L)) .reduceByKey(_ + _) //以hbase为例, wordCounts.foreachRDD( rdd=>{ rdd.foreachPartition( rddpartition=>{ //创建mysql连接 Class.forName("com.mysql.jdbc.Driver").newInstance val conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "username", "password") //使用conn插入数据 rddpartition.foreach(record => { val prep = conn.prepareStatement("insert INTO t1 (key, value) VALUES (?, ?) ") prep.setString(1, record._1) prep.setLong(2,record._2) prep.executeUpdate }) // 关闭连接 conn.close() } ) } ) ssc.start() ssc.awaitTermination() }}
阅读全文
0 0
- spark-streaming 编程(四)自定义输出foreachRDD
- Spark Streaming之foreachRDD性能优化
- Spark Streaming之妙用foreachRDD和foreachPartition
- Spark Streaming的foreachRDD算子的正确使用
- spark-streaming-[5]-Design Patterns for using foreachRDD
- spark-streaming-[7]-Output Operations on DStreams-foreachRDD写Mysql
- Spark Streaming编程指南(四)
- Spark Streaming 自定义接收器
- Spark Streaming 自定义接收器
- Spark Streaming 自定义接收器
- Spark Streaming-1:Spark Streaming编程指南
- Spark Streaming编程指南
- Spark Streaming编程讲解
- spark streaming 编程
- Spark Streaming编程指南
- Spark Streaming编程一
- Spark Streaming编程指南
- Spark Streaming编程指南
- 百度地图LocType=162引发的坑------>>libs和jniLibs的区别
- 1px(1像素)边框问题
- JAVA互联网架构学习之SpringMVC其三
- 网站建设公司该不该把web前端外包出来!精辟
- LDA(Latent Dirichlet Allocation)简介
- spark-streaming 编程(四)自定义输出foreachRDD
- keras tensorboard的使用, 设置GPU使用的内存, 强制只使用cpu
- 微信小程序周报(第十二期)-极乐小程序商店出品
- 26.odoo入门——工作杂记之many2one
- 直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置
- 必须掌握的八种排序(1-2)--插入排序,希尔排序
- C++项目中的extern "C" {}
- 语义网简介(二)—XML与XML Schema
- 怎样才算是做好了站内SEO?老专家这么说