flum到kafka 收集数据 存储到redis 案例 (ip.txt)
ip.scala
package ip import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.dstream.InputDStream
import org.apache.spark.streaming.kafka010._
import org.apache.spark.streaming.{Seconds, StreamingContext} object ip {
Logger.getLogger("org").setLevel(Level.WARN)
def main(args: Array[String]): Unit = {
//new sc
val conf = new SparkConf ()
.setAppName ( this.getClass.getSimpleName )
.setMaster ( "local[*]" )
val ssc=new StreamingContext(conf,Seconds()) //创建topic
val topic="ip01"
val topics=Array(topic)
//创建groupid
val groupid="IPoffsets"
//创建kafka链接参数
val params=Map(
"bootstrap.servers" -> "hadoop01:9092,hadoop02:9092,hadoop03:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> groupid,
//告诉大家从哪里消费
"auto.offset.reset" -> "earliest",
//是否自动提交偏移量
"enable.auto.commit" -> (false: java.lang.Boolean)
)
//创建kafka直连方式 //判断偏移量是否存在
val stream: InputDStream[ConsumerRecord[String, String]] =
KafkaUtils.createDirectStream(
ssc,
LocationStrategies.PreferConsistent,
ConsumerStrategies.Subscribe[String,String](topics,params)
) stream.foreachRDD(rdd=>{
rdd.foreach(println(_))
//开启偏移量
val ranges: Array[OffsetRange] = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
//去获取数据
val ip1:RDD[((String,String,String),Int)] = rdd.map ( tp => {
val splits = tp.value().split ( "[|]" )
val prive=splits()
val city = splits ( )
val fangshi=splits()
((prive,city,fangshi),)
} ).reduceByKey(_+_) //写一个方法,存储数据与偏移量信息
DateMyRedis.saveDataOffset(ip1,ranges,groupid) })
ssc.start()
ssc.awaitTermination() }
}
DataMyRedis.scala
package ip import java.util import day15.Jpoods
import org.apache.kafka.common.TopicPartition
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.kafka010.OffsetRange import scala.collection.mutable object DateMyRedis {
//保存数据到redis
def saveDataOffset(result: RDD[((String,String, String),Int)],ranges: Array[OffsetRange],groupingID: String): Unit ={
result.foreachPartition(filter=>{
//获取jedis对象
val jedis = Jpoods.getJedis ()
//redis开启事务
val transaction = jedis.multi()
filter.foreach(tp=>{
try {
//存储数据
transaction.hincrBy("IP1", tp._1._1+":"+tp._1._2+":"+tp._1._3, tp._2)
//存储偏移量
for (o <- ranges) {
transaction.hset(groupingID, o.topic + ":" + o.partition, o.untilOffset.toString)
}
}catch {
case _ =>
println("报错了,需要回滚")
transaction.discard()
}
})
transaction.exec()
jedis.close()
}) } //从redis中获取偏移量信息
def getOffset(groupid: String, topic: String): mutable.Map[TopicPartition, Long] = {
val offset = mutable.Map [TopicPartition, Long]()
//tp._1 topic+partition tp._2 offset
import scala.collection.JavaConversions._
val jedis = Jpoods.getJedis ()
//导入转换list隐士转换
val map: util.Map[String, String] = jedis.hgetAll ( groupid )
val list = map.toList
for (o <- list) {
offset += new TopicPartition ( o._1.split ( ":" )( ), o._1.split ( ":" )( ).toInt ) -> o._2.toLong
}
offset
} }
Jpoods.scala
package day15 import org.apache.commons.pool2.impl.GenericObjectPoolConfig
import redis.clients.jedis.{Jedis, JedisPool} object Jpoods {
//设置参数
private val conf=new GenericObjectPoolConfig()
conf.setMaxIdle()
conf.setMaxTotal() //获取jedis的连接对象
private val jpoods=new JedisPool("192.168.186.150",) //获取jedis对象的方法
def getJedis():Jedis={
val jedis=jpoods.getResource()
jedis.select()
jedis
} }
shell脚本 flum-kafka.conf
a1.sources = r1
a1.channels = c1 #定义source
a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile = /usr/local/apache-flume-1.8.-bin/taildir_position.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /root/myde/logs/access.log #定义channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = hadoop01:,hadoop02:,hadoop03:
a1.channels.c1.kafka.topic = ip01
a1.channels.c1.parseAsFlumeEvent = false #将Source和channle组装在一起
a1.sources.r1.channels = c1
flum到kafka 收集数据 存储到redis 案例 (ip.txt)的更多相关文章
- Spring Boot 揭秘与实战(二) 数据存储篇 - Redis
文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用 redisTemplate 操作4. 总结 3.1. 工具类 ...
- Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例
1. 把集合中的数据存储到文本文件案例: 需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...
- Python 抓取数据存储到Redis中
redis是一个key-value存储结构.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- redis使用日志(二) 数据存储到redis
一段简短的代码,来展示如何把爬取内容写到redis里面: #! /usr/bin/env python # -*- coding=utf-8 -*- import requests import js ...
- ELK+Redis+Nginx服务数据存储以及Nginx日志的收集
PS:此片文章是承接上篇ELK部署文档,再次便不详细说明了 [安装Redis] [root@Redis ~]# wget http://download.redis.io/releases/redi ...
- Spark Streaming消费Kafka Direct保存offset到Redis,实现数据零丢失和exactly once
一.概述 上次写这篇文章文章的时候,Spark还是1.x,kafka还是0.8x版本,转眼间spark到了2.x,kafka也到了2.x,存储offset的方式也发生了改变,笔者根据上篇文章和网上文章 ...
- Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考
Kafka session.timeout.ms heartbeat.interval.ms参数的区别以及对数据存储的一些思考 在计算机世界中经常需要与数据打交道,这也是我们戏称CURD工程师的原因之 ...
- 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端
1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...
- 解决KafKa数据存储与顺序一致性保证
“严格的顺序消费”有多么困难 下面就从3个方面来分析一下,对于一个消息中间件来说,”严格的顺序消费”有多么困难,或者说不可能. 发送端 发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息 ...
随机推荐
- 双向链表/list
双向链表结构如下 双向链表结构中元素在内存中不是紧邻空间,而是每个元素中存放上一个元素和后一个元素的地址 第一个元素称为头(head)元素,前连接(前置指针域)为nil 最后一个元素称为尾(foot) ...
- ImportError: attempted relative import with no known parent package
或者检查所导包是否存在__init__.py文件,没有则添加上即可使当前文件夹变为包.
- maven地址配置为阿里maven仓库,附ali maven官方指南链接
一.参考链接 官方指南 链接地址:https://help.aliyun.com/document_detail/102512.html?spm=a2c40.aliyun_maven_repo.0.0 ...
- Kattis - itsamodmodmodmodworld It's a Mod, Mod, Mod, Mod World (类欧几里得)
题意:计算$\sum\limits_{i=1}^n[(p{\cdot }i)\bmod{q}]$ 类欧模板题,首先作转化$\sum\limits_{i=1}^n[(p{\cdot}i)\bmod{q} ...
- document.writeln绑定数据 --点击跳转添加样式
document.writeln(" "); document.writeln(" "); document.writeln(" "); d ...
- OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)
一.图片读取和显示 import cv2 as cv # 图片读取cv.imread(img_path) car_img = cv.imread("car1.png") # 图片显 ...
- #5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25232 Accepted: 7503 Descr ...
- centos 中 redis 的安装
安装流程 Wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar xzf redis-5.0.4.tar.gz mv redis-5 ...
- Acwing:137. 雪花雪花雪花(Hash表)
有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6ai,1,ai,2,…,ai,6. 因为雪花的形状是封闭的环形,所以 ...
- 关于MYSQL日期 字符串 时间戳互转
时间转字符串: select date_format(now(), '%Y-%m-%d'); #结果:2016-01-05 时间转时间戳: select unix_timestamp(now()); ...