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个方面来分析一下,对于一个消息中间件来说,”严格的顺序消费”有多么困难,或者说不可能. 发送端 发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息 ...
随机推荐
- C#制作的屏幕取色器
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System ...
- mybatis 关联查询和嵌套查询的简单示例
两个表: Customer 顾客表 create table if not exists customer( customer_id int primary key auto_increment, f ...
- mysql常用查询命令
转引自:https://www.cnblogs.com/widows/p/7137184.html 常用mysql命令 show variables like 'character_set_clien ...
- 将TextEdit设置为密码框
属性--Properties--UseSystemPasswordChar设置为true
- LINUX装机问题:无法使用“Ctrl+Alt+[F1~F6]”快捷键切换到终端
用VMware装LINUX虚拟机之后,你会发现在X Window的登陆界面无法使用“Ctrl+Alt+[F1~F6]”快捷键切换到终端,这是因为VMware默认的快捷键也是Ctrl+Alt,所以你只需 ...
- AOP 实现日志
package com.foen.foensys.config; import com.alibaba.fastjson.JSON;import com.foen.foensys.model.SysL ...
- CSS的相关知识——背景,超链接,列表,表格,奇偶选择器
接着上一篇总结一些css的相关知识 ㈠背景 背景属性 1.background-color 背景颜色 rgb函数设置 2.background-image 背景图片 url(“logo.jp ...
- 在linux 下安装mysql
1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6.33,通用版,linux下64位 也可 ...
- HDU 6438 Buy and Resell ( 2018 CCPC 网络赛 && 贪心 )
题目链接 题意 : 给出一些数.你可以从左到右对这些数进行三种操作花费 Ai 买入东西.以 Ai 价格卖出你当前有的东西.或者什么都不做.现在问你可以获取的最大利益是多少? 分析 : 和 CF 867 ...
- [AGC034D]Manhattan Max Matching:费用流
前置姿势 \(k\)维空间内两点曼哈顿距离中绝对值的处理 戳这里:[CF1093G]Multidimensional Queries 多路增广的费用流 据说这个东西叫做ZKW费用流? 流程其实很简单, ...