摩拜单车项目05-Redis集群

业务

将kafka中的数据存入Hdfs

Flume方案

目的:采集kafka中的数据,保存到Hdfs中。
kafka-hdfs.conf

#bin/flume-ng agent -n a1 -f /home/lys/kafka-hdfs.conf -c conf -Dflume.root.logger=INFO,console
#channels,sinks
a1.channels = c1
al.sinks = k1

#channel
a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
#数据的保存方式:true,以event形式保存;false,以字符串的形式保存
a1.channels.c1.parseAsFlumeEvent = false
a1.channels.c1.kafka.bootstrap.servers = n1:9092,n2:9092,n3:9092
a1.channels.c1.kafka.topic = p_index
a1.channels.c1.kafka.consumer.group.id = kafka2hdfs-p_index2

#sinks
a1.sinks = k1
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://n1:9000/bike/log/p_index/%y%m%d
a1.sinks.k1.hdfs.useLocalTimeStamp = true
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.filePrefix = log-
a1.sinks.k1.hdfs.rollInterval = 0
a1.sinks.k1.hdfs.rollSize = 2097152
a1.sinks.k1.hdfs.rollCount = 0


a1.sinks.k1.channel = c1

优化方案

优化:
1.将数据存储了类型转换成parquet格式(列式存储)
2.在采集数据时转换(数据已经存储在kafka中了)
2.1将数据同步到HDFS中,然后写sparksql,将json的数据转成parquet
2.2编写一段sparkSteaming程序,实时的进行数据的转换

数据处理的流程

数据处理的流程?
数据怎么来的? 各种终端设备产生的日志(用户点触发了特定的事件,然后在对应的事件进程埋点,就是讲触发事件是产生的数据发送给日志采集服务器,是一个Nginx,可以将数据写入到kafka中,如果是离线,在将数据同步到HDFS中)
有哪些关键字段? 时间、地点(省、市、区)、金额、app类型(IOS、Android、微信小程序)
怎么处理的?数据的预处理(清洗 -> 转换(json -> parquet)) sparksql(离线) sparkSteaming(实时)
计算完保存到哪里?聚合后的数据保存在关系数据库中(集群)、明细数据保存到Hbase、存储到mongo、Elasticsearch中

指标计算

今天收集的用户充值的数据可以计算出哪些指标

实时指标

	1.当天截止到当前时间的充值中金额
	2.各个省、市的充值金额
	3.各个终端类型的充值金额
	4.充值的成功率
	5.充值的渠道
	6.充值笔数
	7.省、市的充值笔数
离线指标
	1.某一天的充值金额
	2.各个省、市的充值金额
	3.各个终端类型的充值金额
	4.充值的成功率
	5.充值的渠道
	6.充值笔数
	7.省、市的充值笔数

保修指标

收集用户的报修事件的日志
数据怎么来的?各种终端设备产生的日志,发现单车不能使用,然后点击报修按钮、智能锁上报车辆状态
有哪些关键字段?时间、地点(省、市、区)、用户id、车辆id、原因(部件)、app类型
怎么处理的?数据的预处理(清洗 -> 转换(json -> parquet)) sparksql
计算完保存到哪里?聚合后的数据保存在关系数据库中(集群)、明细数据保存到Hbase、存储到mongo、Elasticsearch中

能计算哪些指标
	1.报修次数
	2.报修的区域
	3.损坏的部件
活动参与
1.活动的点击次数
2.活动的参与次数
3.参会活动积分兑换
4.哪些用户对哪些活动感兴趣

Redis集群

主从结构示意图

在这里插入图片描述

一致性hash

在这里插入图片描述

搭建Redis集群

搭建集群

1.下载redis3的稳定版本,下载地址http://download.redis.io/releases/redis-3.2.10.tar.gz
2.上传redis-3.2.10.tar.gz到服务器
3.解压redis源码包
tar -zxvf redis-3.2.10.tar.gz -C /usr/local/src/
4.进入到源码包中,编译并安装redis
cd /usr/local/src/redis-3.2.10/
make && make install
5.报错,缺少依赖的包
在这里插入图片描述
6.配置本地YUM源并安装redis依赖的rpm包
yum -y install gcc
7.编译并安装
make && make install
8.报错,原因是没有安装jemalloc内存分配器,可以安装jemalloc或直接输入
在这里插入图片描述
9.重新编译安装
make MALLOC=libc && make install
10.用同样的方式在其他的机器上编译安装redis
11.在所有机器的/usr/local/下创建一个redis目录,然后拷贝redis自带的配置文件redis.conf到/usr/local/redis
mkdir /usr/local/redis
cp /usr/local/src/redis-3.2.10/redis.conf /usr/local/redis
12.修改所有机器的配置文件redis.conf
daemonize yes #redis后台运行
cluster-enabled yes #开启集群把注释去掉
appendonly yes #开启aof日志,它会每次写操作都记录一条日志
sed -i ‘s/daemonize no/daemonize yes/’ /usr/local/redis/redis.conf
sed -i “s/bind 127.0.0.1/ bind $HOST/” /usr/local/redis/redis.conf
sed -i ‘s/# cluster-enabled yes/cluster-enabled yes/’ /usr/local/redis/redis.conf
sed -i ‘s/appendonly no/appendonly yes/’ /usr/local/redis/redis.conf
sed -i ‘s/# cluster-node-timeout 15000/cluster-node-timeout 5000/’ /usr/local/redis/redis.conf
13.启动所有的redis节点
cd /usr/local/redis
redis-server redis.conf
14.查看redis进程状态
ps -ef | grep redis
在这里插入图片描述
15.(只要在一台机器上安装即可)配置集群:安装ruby和ruby gem工具(redis3集群配置需要ruby的gem工具,类似yum)
yum -y install ruby rubygems

16.使用gem下载redis集群的配置脚本
gem install redis
ruby --version

17.安装RVM:安装失败参考Spark10
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.3.4
#用ruby的工具安装reids
gem install redis
18.使用脚本配置redis集群
cd /usr/local/src/redis-3.2.10/src/
#service iptables stop
#在第一机器上执行下面的命令
./redis-trib.rb create --replicas 1 192.168.145.201:7000 192.168.145.202:7000 192.168.145.203:7000 192.168.145.201:7001 192.168.145.202:701 192.168.145.203:7001
19.测试(别忘加-c参数:开启集群模式)
redis-cli -c -h 192.168.145.201 -p 7000
20.查看集群的主从配置关系
参考连接:https://blog.csdn.net/Aquester/article/details/82319819

Jedis连接集群API

package day10
import java.util
import redis.clients.jedis.{JedisCluster, _}

/**
 * redis集群的连接
 */
object JedisConnectionPool2 {

  private val config: JedisPoolConfig = new JedisPoolConfig()


  val jedisClusterNodes = new util.HashSet[HostAndPort]()
  //Jedis Cluster will attempt to discover cluster nodes automatically
  jedisClusterNodes.add(new HostAndPort("192.168.145.201", 7000))
  jedisClusterNodes.add(new HostAndPort("192.168.145.202", 7000))
  jedisClusterNodes.add(new HostAndPort("192.168.145.203", 7000))
  jedisClusterNodes.add(new HostAndPort("192.168.145.201", 7001))
  jedisClusterNodes.add(new HostAndPort("192.168.145.202", 7001))
  jedisClusterNodes.add(new HostAndPort("192.168.145.203", 7001))
  val jedisCluster = new JedisCluster(jedisClusterNodes)


  def main(args: Array[String]): Unit = {
    val str = jedisCluster.get("xiaoming")

    println(str)
    
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值