从kafka中获取数据写入到redis中
来源:互联网 发布:手机电玩城刷分币软件 编辑:程序博客网 时间:2024/06/07 01:18
大家:
好!从kafka中获取数据写入到redis中,需要用到spark中的redis客户端配置,请参考前面的博客。
package Traffic
import java.text.SimpleDateFormat
import java.util.Calendar
import kafka.serializer.{StringDecoder, StringEncoder}
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
import net.sf.json.JSONObject
/**
* Created by Administrator on 2017/10/14.
* 功能: 从kafka中获取数据写入到redis中
*
*/
object CarEventAnalysis {
def main(args: Array[String]): Unit = {
//配置SparkStrteaming
val conf=new SparkConf().setAppName("CarEventAnalysis").setMaster("local[2]")
val sc=new SparkContext(conf)
val ssc=new StreamingContext(sc,Seconds(5))
val dbindex=1 //指定是用哪个数据库进行连接
//从kafka中读取数据(用直连的方法)
val topics=Set("car_event")
// 只要和brokers相关的都要写全
val brokers="192.168.17.108:9092"
//配置kafka参数
val kafkaParams=Map[String,String](
"metadata.broker.list"->brokers,
"serializer.class"->"kafka.serializer.StringEncoder"
)
//创建一个流 这是一个模板代码 参数中的两个String代表的是kafka的键值对的数据,及key和value
val kafkaStream=KafkaUtils.createDirectStream[String,String,
StringDecoder,StringDecoder](ssc,kafkaParams,topics)
//从kafka中将数据读出
val events=kafkaStream.flatMap(line=>{
//转换为object
val data=JSONObject.fromObject(line._2) // ._2是真正的数据
// println(data)
//必须用Some修饰data option有两个子类 none 代表无值 some代表有值
// 加上some表示一定有值,后面有x.getString和x.getInt,保证程序能知道有值
Some(data)
})
//从kafka中取出卡口编号和速度数据
val carspeed=events.map(x=>(x.getString("camer_id"),x.getInt("car_speed")))
//把数据变成(camer_id,(car_speed,1))
.mapValues((x:Int)=>(x,1.toInt))
//每隔10秒计算一次前20秒的速度(4个rdd) Tuple2表示两个参数
// (速度,数量) (速度,数量)
.reduceByKeyAndWindow((a:Tuple2[Int,Int], b:Tuple2[Int,Int]) =>
{(a._1 + b._1,a._2 + b._2)},Seconds(20),Seconds(10))
// carspeed 速度之和 数量之和
// carspeed.map{case(key,value)=>(key,value._1/value._2.toFloat)}
carspeed.foreachRDD(rdd=>{
rdd.foreachPartition(partitionofRecords=>{
//得到连接池的一个资源
val jedis=RedisClient.pool.getResource
// camer_id 卡口以及总的速度
partitionofRecords.foreach(pair=>{
val camer_id=pair._1 //卡口
val total_speed=pair._2._1 //总的速度
val count=pair._2._2 //总的数量
val now=Calendar.getInstance().getTime() //获取当前的时间
val minuteFormat=new SimpleDateFormat("HHmm") //获取分钟格式
val dayFormat=new SimpleDateFormat("yyyyMMdd") //获取天格式
val time = minuteFormat.format(now) //获取分钟
val day = dayFormat.format(now) //获取天
//开始往redis中插入数据
if(count!=0){
jedis.select(dbindex) //用选择的数据库
// set进去一个map
jedis.hset(day + "_" + camer_id, time ,total_speed + "_" + count)
// 从redis中取数据
val foreachdata=jedis.hget(day + "_" + camer_id, time)
println(foreachdata)
}
})
RedisClient.pool.returnResource(jedis)
})
})
println("----------计算结束---------------------------")
ssc.start()
ssc.awaitTermination()
}
}
- 从kafka中获取数据写入到redis中
- spark从kafka中获取数据
- kafka中写入avro数据
- 将从数据库中获取的数据写入到Excel表中
- 利用Flink stream从kafka中写数据到mysql
- 从redis的hash结构中获取数据
- 从Mysql将数据快速导入到redis中
- 从Mysql将数据快速导入到redis中
- 从Kafka topic中获取数据并在Storm中进行分析
- 从Kafka topic中获取数据并在Spark中进行分析
- ibm streams处理kafka数据并放入到redis中去
- 使用Apache POI创建Excel,并从数据库中读取数据写入到Excel文件中
- 把数据库文件写入csv文件和从csv文件中导入数据到数据库中
- hadoop MR从hbase中读取数据写入到hbase中
- gams 从表格中读取 写入数据
- 从网络里面获取数据写入到文件
- docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据
- Http Get 从服务器中获取数据 存储到本地
- sizeof用法
- Linux缓冲区
- Haskell语言学习笔记(34)System.Environment
- Vue 2.0 监听文本框内容变化及 ref的使用说明
- JAVA BIO 回顾
- 从kafka中获取数据写入到redis中
- Linux mysql数据库设置区分大小写lower_case_table_names
- Maximum Depth of Binary Tree
- ubuntu下配置python开发环境
- 冒泡排序及C++/java代码实现(BubbleSort)
- 三诺·珊瑚群创新加速器正式启动:新一代生态型创新加速器 中国创业创新
- 行业首款智能手表跟拍与避障无人机XEagle亮相高交会
- 艾瑞数据:解读各家在线音乐应用用户活跃度
- Liferay文件的上传