文章目录
业务
将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)
}
}