[云框架]SMACK大数据架构
SMACK并非单一技术,而是由Spark、Mesos、Akka、Cassandra、Kafka组成的大数据架构,适用于广泛的数据处理场景,可完成低延迟扩展及数据复制、统一管理异构负载集群,并通过单一平台满足不同架构设计和不同应用的需求。(A Brief History of the SMACK Stack)主要特点如下:
架构灵活多变 | 每个组件都可以集群化部署;组件之间可以自由组合;可随意对架构进行无中断升级 |
支持数据管道 | 数据以数据流的形式进行流转;上一个组件的输出等于下一个组件的输入 |
多种模式数据处理 | 支持秒级流式处理;支持批处理 |
多种方式数据接入 | 支持文件、消息、http请求等方式的数据采集 |
系统可交互 | 可以与系统进行实时交互,提供REST API |
部署简单 | 以二进制方式部署;以容器化方式部署 |
在面对数据源数量急剧增加、数据样本获取难度升高、数据分析时效性差、数据分析投资回报率低等一系列挑战时,SMACK可以解决Hadoop等熟知技术无法解决的诸多问题,特别是物联网化、API化趋势下big data向fast data转变所带来的新需求,以及大数据处理对于Data Pipeline的依赖。
我们可以把SMACK看作是一种框架组合**,其中技术可以增加或被更适合的技术替代,以便我们更好的完成大数据处理。本篇云框架即在引擎层增加了Flink用于处理实时数据,使用Kubernetes替换Mesos作为容器层,以某网站数据为例,提供SMACK大数据框架的最佳实践,包括SMACK、数据接入、数据展示在内的完整框架,适合以下应用场景:
- 实时计算
- 时间窗口分析
- 应用日志分析
- 项目风控管理
- 智能预测
- 实时推荐
在学习和使用SMACK业务和框架之前,建议先行了解Fast Data、Data Pipeline、Lambda Architecture等相关背景说明,这三点可以说是SMACK的灵魂,也是选择使用SMACK的重要原因。
内容概览
快速部署
一键部署
本地部署
最小环境要求:4 CPUs & 8GB Memory
-
准备Docker环境,并为Docker分配至少
4 CPUs
&8GB Memory
-
克隆完整代码
git clone https://github.com/cloudframeworks-smack/user-guide-smack.git
-
使用docker-compose运行如下命令(docker-compose.yml)
docker-compose -f docker-compose.yml up -d
-
访问路径
访问 路径 方法 参数 最近10条日志 http://DOCKER_HOST:9091/msg/data/nginx_log/test/test/1/10 GET 最新状态统计信息 http://DOCKER_HOST:9091/msg/data/status_real_statics/test/test/1/10 GET 最新请求统计信息 http://DOCKER_HOST:9091/msg/data/request_real_statics/test/test/1/10 GET 历史统计信息 http://DOCKER_HOST:9090/msg/push/statics POST 见下方 -
POST请求参数
namespace:test serviceName:test start_time:2017-06-01 01:00:18 end_time:2017-07-22 01:25:10 cmd:uv|pv|avgtime time_type:day|hour|minute
框架说明-业务
某网站需对其nginx日志进行实时数据和历史数据进行分析统计,实时数据包括——
- 过去15s中的请求数及每个请求的平均响应时间
- 过去15s中各网站访问状态(3xx、4xx、5xx)出现频率
- 过去某时间段中网站访问PV(天/小时/分钟统计)
历史数据包括——
- 过去某时间段中网站访问UV(以IP地址进行唯一性判断,天/小时/分钟统计)
- 过去某时间段中请求总数、总时间、最大响应时间、最小响应时间(天/小时/分钟统计)
业务架构如下图所示:
框架说明-组件
SMACK
本项目中SMACK用到了Spark、Flink、Kubernetes、Akka、Cassandra、Kafka,这一组合在技术成熟度、易用性、组合自由性、自动化程度上极具优势。对于数据的实时处理能力是该组合取代Hadoop的重要原因,在Spark基础上增加Flink而不是完全取代Spark的原因则是,Flink处理数据可达秒级(Spark为分钟级),但Spark在数据批处理成熟度上目前整体要强于Flink。
组件 | 功能/任务 | 组件 | 功能/任务 |
---|---|---|---|
File System | nginx日志路径 | Cassandra | 数据持久化 |
Akka-Http | 数据增强、数据再处理、restful api接口 | Spark | 历史数据批处理 |
Kafka | 消息队列 | InfluxDb | 实时数据统计后汇总的地方 |
Flink | 消息流式处理 | Grafana | 整合InfluxDb进行数据展示 |
SMACK整体结构如下图所示:
- File System向用户提供底层数据访问机制,即nigix日志存放目录
- Akka-http从File system加载日志,进行数据增强、数据再处理,并向外部访问提供REST API接口
- 数据通过Akka消息队列处理后,由Kafka执行消息传输
- Flink利用窗口CP机制对数据进行流式处理及实时状态统计
- 经过Flink处理的非统计信息将被存储至Cassandra
- 经过Flink处理的统计信息将被存储至InfluxDB(用来储存实时数据的数据库)
- Spark从Cassandra获取数据,进行历史数据的批量分析
- 数据通过Grafana(或其他可视化工具)进行展示
SMACK涉及技术要点概览
数据接入
-
准备访问日志并命名为
log.log
此处注意,使用本项目需对日志格式进行调整,典型日志结构如下所示:
172.10.36.32 - - [08/Jun/2017:16:36:46 +0800] "GET /winprize/index?id=aafe-uuawef--afewa HTTP/1.1" 200 2215 "-" "-" "172.11.161.17, 172.10.226.13, 10.208.26.230" 938 0.004 172.11.6.9:10055 172.10.36.62 - - [08/Jun/2017:16:37:43 +0800] "GET /index HTTP/1.1" 200 56 "-" "-" "172.11.137.181, 172.10.226.14, 10.208.26.226" 947 0.001 172.11.30.144:10055 172.10.37.46 - - [08/Jun/2017:16:37:43 +0800] "GET /prize/index HTTP/1.1" 200 56 "-" "-" "172.11.97.82, 172.10.226.11, 10.208.26.234" 952 0.001 172.11.6.9:10055 172.10.36.46 - - [08/Jun/2017:16:37:43 +0800] "GET /prize/rank?r=latest HTTP/1.1" 200 54 "-" "-" "172.11.152.137, 172.10.230.13, 10.208.26.241" 1208 0.001 172.11.9.81:10055 172.10.37.46 - - [08/Jun/2017:16:36:44 +0800] "GET /prize/rank?r=latest HTTP/1.1" 200 2221 "-" "-" "172.11.97.56, 172.10.226.11, 10.208.26.228" 955 0.003 172.11.14.209:10055 172.10.36.67 - - [08/Jun/2017:16:36:44 +0800] "GET /index HTTP/1.1" 500 2299 "-" "-" "172.11.152.140, 172.10.230.191, 10.208.26.243" 1024 0.003 172.11.2.194:10055 172.10.36.32 - - [08/Jun/2017:16:36:46 +0800] "GET /winprize/index?id=aafe-uuawef--afewaaa HTTP/1.1" 404 56 "-" "-" "172.11.161.17, 172.10.230.12, 10.208.26.241" 997 0.001 172.11.23.140:10055 172.10.36.32 - - [08/Jun/2017:16:37:43 +0800] "GET /prize/index HTTP/1.1" 200 56 "-" "-" "172.10.36.34, 172.10.226.13, 10.208.26.235" 946 0.002 172.11.2.194:10055 172.10.36.32 - - [08/Jun/2017:16:36:47 +0800] "GET /prize/index HTTP/1.1" 200 56 "-" "-" "172.11.97.88, 172.10.226.13, 10.208.26.229" 1294 0.002 172.11.23.140:10055
字段 表示 字段 表示 remoteAddr -----IP地址 httpReferer -----refer remoteUser -----用户 httpUserAgent -----ua timeLocal -----服务时间 httpXForwardedFor -----refer request -----请求地址 requestLength -----请求长度 status -----请求状态 upstreamResponseTime ------响应时间 bodySize ----内容大小 upstreamAddr -----响应地址 -
确保数据格式正确,可通过正则表达式验证
reg=`(\d+.\d+.\d+.\d+)\s-\s(.*)\s\[(.+)\]\s\"(.*)\"\s(\d{3,})\s(\d+)\s\"(.*)\"\s\"(.*)\"\s\"(.*?)\"\s(.*)\s(.*)\s(.*)$`
-
修改docker-compose.yml文件,找到
akka-instream
并添加volumes: - 你本地日志所在目录:/opt/akka/data/
数据展示
本项目未封装数据展示组件,可使用Grafana或接入其他可视化工具。
使用Grafana步骤如下:
-
下载Grafana镜像
docker pull grafana/grafana
-
下载并解压Grafana初始化数据(实例日志)到
/tmp
目录(该目录可根据业务实际情况进行自定义,注意相应修改下一步骤中的挂载目录/tmp/grafana:/var/lib/grafana
) -
执行命令
docker run -d -v /tmp/grafana:/var/lib/grafana --publish 3000:3000 grafana/grafana
-
登陆访问数据展示界面
http://DOCKER_HOST:3000/login ---(默认账号密码:admin/admin)
-
或直接访问数据展示界面
http://DOCKER_HOST:3000/dashboard/db/data_statics?refresh=5s&orgId=1
更新计划
CODE
完善数据展示界面CODE
完善集群部署支持
社群贡献
云框架系列主题,遵循APACHE LICENSE 2.0协议发布。