kafka spark mysql_消费kafka的消息,并将其SparkStreaming结果保存到mysql

将数据保存到mysql,需要用到jdbc。为了提高保存速度,我写了一个连接池

1.保存到mysql的代码

package test05

import org.apache.log4j.{Level, Logger}

import org.apache.spark.rdd.RDD

import org.apache.spark.sql.types._

import org.apache.spark.sql._

import org.apache.spark.streaming.dstream.DStream

import org.apache.spark.{SparkConf, SparkContext}

import org.apache.spark.streaming.{Seconds, StreamingContext}

import org.apache.spark.streaming.kafka.KafkaUtils

object SaveDataToMysql {

def main(args: Array[String]): Unit = {

// 屏蔽不必要的日志 ,在终端上显示需要的日志

Logger.getLogger("org.apache.spark").setLevel(Level.OFF)

Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)

Logger.getLogger("org.apache.kafka.clients.consumer").setLevel(Level.OFF)

//初始化sparkStreaming

val conf = new SparkConf().setAppName("SaveDataToMysql").setMaster("local[*]")

val sc = new SparkContext(conf)

val ssc = new StreamingContext(sc, Seconds(10))

//连接s3需要的key和密码

ssc.sparkContext.hadoopConfiguration.set("fs.s3a.access.key","aws的key")

ssc.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key","aws的密码")

ssc.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint", "s3.cn-north-1.amazonaws.com.cn")

//设置连接Kafka的配置信息

val zkQuorum = "192.168.1.112:2181" //zookeeper集群的IP:port,IP:port,IP:port

val group = "testgroup" //在consumer.properties配置group.id

val topics = "huiliyang" //选择要连接的producer,它是以topic来区分每个producer的。例如:我这里的创建的topic是huiliyang

val numThreads = 2 //线程

val topicpMap = topics.split("\n").map((_,numThreads.toInt)).toMap //这个是有可能有好几个topic同时提供数据,那么我们要把它用空格分割开,然后映射成(topic,2),再转换成map集合

ssc.checkpoint("checkpoint"

val lines: DStream[String] = KafkaUtils.createStream(ssc,zkQuorum,group,topicpMap).map(_._2) //创建流

lines.print()

//保存到mysql

lines.map(x=>x.split(",")).foreachRDD(line =>{

line.foreachPartition(rdd =>{

val conn = ConnectPoolUtil.getConnection //ConnectPoolUtil是我创建的一个数据库连接池,getConnection是它的一个方法

conn.setAutoCommit(false); //设为手动提交

val stmt = conn.createStatement()

rdd.foreach(word=>{

stmt.addBatch("insert into test_log2(time, ip, user_id, user_type, source, scene) values('" + word(0)+"','"+word(1)+"','"+word(2)+"','"+word(3)+"','"+word(4)+"','"+word(5) + "')")

})

stmt.executeBatch()

conn.commit()

conn.close()

})

})ssc.start()ssc.awaitTermination()

}

}

数据库连接池代码:

package test05

import java.sql.{Connection, PreparedStatement, ResultSet}

import org.apache.commons.dbcp.BasicDataSource

object ConnectPoolUtil {

private var bs:BasicDataSource = null

/**

* 创建数据源

* @return

*/

def getDataSource():BasicDataSource={

if(bs==null){

bs = new BasicDataSource()

bs.setDriverClassName("com.mysql.jdbc.Driver")

bs.setUrl("jdbc:mysql://localhost:3306/school")

bs.setUsername("root")

bs.setPassword("123456")

bs.setMaxActive(200) //设置最大并发数

bs.setInitialSize(30) //数据库初始化时,创建的连接个数

bs.setMinIdle(50) //最小空闲连接数

bs.setMaxIdle(200) //数据库最大连接数

bs.setMaxWait(1000)

bs.setMinEvictableIdleTimeMillis(60*1000) //空闲连接60秒中后释放

bs.setTimeBetweenEvictionRunsMillis(5*60*1000) //5分钟检测一次是否有死掉的线程

bs.setTestOnBorrow(true)

}

bs

}

/**

* 释放数据源

*/

def shutDownDataSource(){

if(bs!=null){

bs.close()

}

}

/**

* 获取数据库连接

* @return

*/

def getConnection():Connection={

var con:Connection = null

try {

if(bs!=null){

con = bs.getConnection()

}else{

con = getDataSource().getConnection()

}

} catch{

case e:Exception => println(e.getMessage)

}

con

}

/**

* 关闭连接

*/

def closeCon(rs:ResultSet ,ps:PreparedStatement,con:Connection){

if(rs!=null){

try {

rs.close()

} catch{

case e:Exception => println(e.getMessage)

}

}

if(ps!=null){

try {

ps.close()

} catch{

case e:Exception => println(e.getMessage)

}

}

if(con!=null){

try {

con.close()

} catch{

case e:Exception => println(e.getMessage)

}

}

}

}

pom文件

2.11.8

2.2.0

2.7.2

compile

org.apache.spark

spark-core_2.11

${spark.version}

org.apache.spark

spark-streaming_2.11

${spark.version}

org.apache.spark

spark-streaming-kafka-0-8_2.11

2.2.0

org.apache.spark

spark-sql_2.11

${spark.version}

mysqlmysql-connector-java5.1.39

将sparkStreaming结果保存到Redshift数据库

1.保存到redshift数据库的代码 package test05 import org.apache.log4j.{Level, Logger}import org.apache.spark.rd ...

17-Flink消费Kafka写入Mysql

戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

storm消费kafka实现实时计算

大致架构 * 每个应用实例部署一个日志agent * agent实时将日志发送到kafka * storm实时计算日志 * storm计算结果保存到hbase storm消费kafka 创建实时计算项 ...

Kafka创建&查看topic,生产&消费指定topic消息

启动zookeeper和Kafka之后,进入kafka目录(安装/启动kafka参考前面一章:https://www.cnblogs.com/cici20166/p/9425613.html) 1.创 ...

kafka创建topic,生产和消费指定topic消息

启动zookeeper和Kafka之后,进入kafka目录(安装/启动kafka参考前面一章:https://www.cnblogs.com/cici20166/p/9425613.html) 1.创 ...

kafka消费者客户端启动之后消费不到消息的原因分析

如果你发现你的一个消费者客户端A已经启动了,但是就是不消费消息,此时你应该检查一下该消费者所在的组中(ConsumerGroup)是否还有其他的消费者,topic的分区可能被组中其他的消费者线程抢走( ...

SparkStreaming消费kafka中数据的方式

有两种:Direct直连方式.Receiver方式 1.Receiver方式: 使用kafka高层次的consumer API来实现,receiver从kafka中获取的数据都保存在spark exc ...

kafka flumn sparkstreaming java实现监听文件夹内容保存到Phoenix中

ps:具体Kafka Flumn SparkStreaming的使用  参考前几篇博客 2.4.6.4.1 配置启动Kafka (1) 在slave机器上配置broker 1) 点击CDH上的kafk ...

Spark Streaming消费Kafka Direct方式数据零丢失实现

使用场景 Spark Streaming实时消费kafka数据的时候,程序停止或者Kafka节点挂掉会导致数据丢失,Spark Streaming也没有设置CheckPoint(据说比较鸡肋,虽然可以 ...

随机推荐

sphinx搜索实例

多个关键词搜索一个字段的几种方式测试 @proname "ygm" "磨粉机" "2" //搜索结果proname字段必须同时包含3个词,有 ...

寒假学习计划(c++作业2)

C++学习计划 一.课程概况 1.课程名称:c++远征攻略 2.授课人姓名:james_yuan 3.课程链接地址:http://www.imooc.com/course/programdetail/ ...

hibernate 实现多表连接查询(转载)

http://www.cnblogs.com/lihuiyy/archive/2013/03/28/2987531.html 为了方便,直接粘过来,方便查看.不收藏了 Hibernate主要支持两种查 ...

什么是ajax,ajax原理是什么 ,优缺点是什么

AJAX工作原理及其优缺点   1.什么是AJAX?AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页 ...

JS Event事件流(冒泡机制、捕获机制、事件绑定)

1.事件流 事件流:从页面中接收事件的顺序.也就是说当一个事件产生时,这个事件的传播过程,就是事件流. IE的事件流 IE中的事件流叫事件冒泡:事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播 ...

Go语言数组和切片的原理

目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

记 Swagger 2

Maven坐标: io.springfoxspringfox- ...

UGUI血条

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; pu ...

Spring data JPA中使用Specifications动态构建查询

有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...

标准时间转YYYY-MMM-DD

// 时间处理 formatDate(date, fmt) { let o = { 'M+': date.getMonth() + 1, //月份 'd+': date.getDate(), //日 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值