摘要: 原作者:阿里云解决方案架构师,陆宝。通过阅读本文,您可以学会怎样使用阿里云的maxcompute搭建一套数据分析系统。

一、总览

一个游戏/系统的业务数据分析,总体可以分为图示的几个关键步骤:
1、数据采集:通过SDK埋点或者服务端的方式获取业务数据,并通过分布式日志收集系统,将各个服务器中的数据收集起来并送到指定的地方去,比如HDFS等;(注:本文Demo中,使用flume,也可选用logstash、Fluentd等)
2、数据同步:构建数据通道,接受数据采集agent的数据流,并且分发到不同的存储/计算引擎中去;(注:本文Demo中,使用阿里云datahub作为通道,maxcompute作为存储/计算引擎)
3、数据开发:按照日志格式、业务领域,构建数据模型;(注:本文Demo中,在maxcompute中创建对应的project、table)
4、数据计算/分析:按照业务场景的分析要求,编写SQL脚本 或者 使用工具,完成数据的分析及展现;(注:本文Demo中,基于阿里云quickBI,完成多维分析、仪表盘的配置)
接下来按照上述步骤,给大家具体介绍,如何利用相关的平台/工具,实现一个简单的数据分析场景。

二、环境准备

首先,需要准备一台服务器,作为日志采集的agent,此处选用阿里云的ECS(具体ECS选购过程不再赘述),服务器配置信息:
实例规格:4 核 16GB
地域:华东 1(华东 1 可用区 F)
操作系统:CentOS 7.4 64位
网络类型:专有网络
安全组:允许远程ssh
本地远程登录ECS服务器
ssh  {username}@{host}

Step1:安装JDK

Flume运行依赖java环境,因此需要在服务器安装SDK,本文采用先下载到本地,再上传服务器的方式安装。
1、下载并上传SDK (demo选用jdk1.8.0_151,可至oracle官网下载)
scp {本地文件路径}  {username}@{host}:{服务器目录}

2、上传完成,解压并设置相应的环境变量:
1、tar -zxvf  {jdk压缩包名}
2、环境变量设置
# vi /etc/profile
增加:
export JAVA_HOME={jdk目录}
export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#source /etc/profile
3、检查SDK是否安装完成:
java -version

Step2:安装flume

同样,对于flume,也可采用先下载到本地,再上传服务器的方式安装。
1、下载并上传flume安装文件 (demo选用apache-flume-1.8.0,可至apache官网下载)
scp {本地文件路径}  {username}@{host}:{服务器目录}
2、上传完成,解压并设置相应的环境变量
1、tar -zxvf  {flume压缩包名}
2、环境变量设置
# vi /etc/profile
增加:
export FLUME_HOME=/usr/local/flume
修改:
path= $path :$FLUME_HOME/bin
#source /etc/profile
3、检查flume是否安装完成:
#此处注意,需要写flume安装的全路径
{flume安装路径}/bin/flume-ng version

Step3:安装Datahub Sink插件

因为Demo选用datahub作为数据通道,所以还需要安装flume-datahub的插件,该文件不大,此处可以选择直接在服务器下载安装。
1、下载flume-datahub插件包
wget https://github.com/aliyun/aliyun-odps-flume-plugin/releases/download/1.1.0/flume-datahub-sink-1.1.0.tar.gz

2、解压并部署插件
1、tar zxvf flume-datahub-sink-1.1.0.tar.gz
2、将解压后的插件文件夹移动到Flume安装目录下
# mkdir /usr/local/flume/plugins.d
# mv flume-datahub-sink  /usr/local/flume/plugins.d/
OK,环境准备工作,到此就基本完成了。

三、数据开发

Demo使用阿里云大数据服务maxCompute作为存储计算引擎。

Step1:开通maxcompute服务

阿里云实名认证账号访问https://www.aliyun.com/product/odps ,开通maxcompute,此处选择按量付费进行购买。

Step2:创建项目及业务模型

1、进入数加控制台 https://data.aliyun.com/console ,点击“dataworks->项目列表” ;

2、点击页面“创建项目”按钮,输入project的基本信息,点击确定,会有一个短暂的初始化过程;

3、点击项目列表下对应项目操作栏,进入dataworks的数据开发页面;

4、创建脚本文件:点击顶部菜单栏中的数据开发,点击“新建”处新建脚本,也可直接点击“新建脚本”任务框;

5、按照需求,设计对应的业务模型,并通过脚本完成模型创建;
#此处按照场景示例,选择创建
1、 事实表:充值记录,与日志文件recharge_record_log对应;
2、 维表:商品信息;
#建表语句示例(同时维表可做数据初始化)
create table if not exists recharge_record_log(
recharge_time string comment '充值时间',
…     
item_id string   comment '商品ID'   
)
注:具体可以参考对应的建表脚本(建表及维表初始化脚本.sql)
可在数据开发的IDE环境编写、调测脚本:

OK,数据建模的工作,到此就基本完成了。

四、数据同步

step1:数据通道设置

Demo使用阿里云datahub作为数据同步的通道。
1、首先,申请开通datahub服务(公测中,链接);
2、进入Datahub的管理控制台-项目管理(链接),创建project;

3、进入创建好的project,点击“创建topic”;
需要注意,此处的topic内容需要与日志文件、表的结构一致,此处可以选择“导入MaxCompute表结构”的方式,填写相应信息,快速完成创建;

step2:数据采集agent配置及启动

登录安装了flume环境的ECS服务器,配置、启动日志采集agent,并对接datahub的数据通道;
1、数据准备:通过手工方式,上传准备好的日志文件(实际应用场景中,应该是通过服务写入);
2、Flume作业配置:
1)在Flume安装目录的conf文件夹下,创建任务的conf文件;
vi  {任务名称}.conf
2)输入任务的配置信息
#示例如下(重点关注{}中的内容)
#a1是要启动的agent的名字
a1.sources = r1   #命名agent的sources为r1
a1.sinks = k1     #命名agent的sinks为k1
a1.channels = c1  #命名agent的channels为c1
# Describe/configure the source
a1.sources.r1.type = exec #指定r1的类型为exec
a1.sources.r1.command =cat {日志文件的位置}   #写入本地文件路径
# Describe the sink
a1.sinks.k1.type = com.aliyun.datahub.flume.sink.DatahubSink #指定k1的类型
a1.sinks.k1.datahub.accessID ={ accessID }
a1.sinks.k1.datahub.accessKey ={ accessKey }
a1.sinks.k1.datahub.endPoint = http://dh-cn-hangzhou.aliyuncs.com
a1.sinks.k1.datahub.project = {datahub_project_name}
a1.sinks.k1.datahub.topic ={datahub_ topic _name}
a1.sinks.k1.batchSize = 100 #一次写入文件条数
a1.sinks.k1.serializer = DELIMITED
a1.sinks.k1.serializer.delimiter = {字段间隔符}
a1.sinks.k1.serializer.fieldnames= {字段 “,” 隔开,注意需要与日志文件的顺序、datahub topic的顺序保持一致}
a1.sinks.k1.serializer.charset = {文字编码格式}
a1.sinks.k1.shard.number =  {分片数,需要与datahub 的topic配置一致}
a1.sinks.k1.shard.maxTimeOut = 60
# Use a channel which buffers events in memory
a1.channels.c1.type = memory  #指定channel的类型为memory
a1.channels.c1.capacity = 1000  #设置channel的最大存储数量为1000
a1.channels.c1.transactionCapacity = 1000 #每次最大可从source中拿到或送到sink中的event数量是1000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
3、检查无误后,启动flume日志采集agent;
bin/flume-ng agent -n a1 -c conf -f conf/ {任务名称}
.conf -Dflume.root.logger=INFO,console
如果能正常启动,可以看到数据正在按照配置往datahub中同步;

step3:数据检查

在datahub的topic页面,可以看到数据同步的情况:

可以通过两种方式来检查数据:

1、topic的数据抽样,查看数据格式是否正常;

2、因为已经配置了datahub到maxcompute的数据链路,可以在maxcompute中检查数据入库情况;

OK,数据同步的工作,到此就基本完成了。

五、数据分析&报表制作

接下来需要基于日志,做业务分析,那么这里我们可以选择quickBI工具,来快速完成多维分析报表、仪表盘等数据产品的配置;

通过 链接 ,打开quickBI的产品页面,并开通对应服务。

Step1:分析模型设置(数据集)

1、进入数据工作台https://das.base.shuju.aliyun.com/console.htm,点击左侧QuickBI;

2、在引导页,点击“添加数据源”;

3、设置数据源的属性

按demo场景,选择maxcompute;

并设置对应的peoject信息:

4、数据源连接成功后,可以看到project下的表,选择需要分析的表,创建数据集;

5、按照分析场景需求,可以对数据集的逻辑模型做设置;

demo的分析场景,需要 基于事实表(充值数据,recharge_record_log)和维表(商品信息表,t_item_record)关联,来完成业务分析,因此可以点击编辑数据集:

完成:

1)构建关联模型

2)可以对时间维度做拆分,会自动生成多个level

Step2:多维分析报表配置

1、分析模型设置好之后,接下来就可以开始分析了,点击“表格分析”:

2、进入多维分析报表的IDE工作台:

3、可以看到,左侧的字段属性区,会自动加载物理表的对应字段(默认加载comment描述):

4、具体分析操作,比较简单,按需双击、拖拽需要分析的字段,点击查询即可看到报表,比如:

1)按商品(维度),看充值(计量)的整体情况

2)增加角色等级(维度),做交叉表

3)同时也支持各种查询条件的设置

按时间

多层嵌套的高级查询

Step3:仪表盘、数据产品配置

灵活性较强的数据探查类场景,可以通过多维报表支撑,对于展现形式要求较高的,可以通过仪表盘来灵活实现;

1、数据集List页面,点击“新建仪表盘”:

2、进入仪表盘的IDE工作台,页面分为左、中、右三栏:

3、同样,可以通过拖拽的方式,快速完成仪表盘页面的配置:

1)拖拽/双击 选择需要作图的字段:

2)点击更新,刷新图表,同时可以自由设置图表的样式

3)拖拽设置页面布局

比如,可以做一个专门的充值分析页面,效果示例:

数据产品是类似于分析专题、报表门户,具体配置就不再赘述:

六、架构总结

一、Demo涉及的产品 以及 数据流

如图所示:

二、如何实现生产场景下的动态数据采集及常见问题处理

和Demo不同的是,在生产场景下,我们的日志文件是动态的,因此需要实现如下逻辑:

1、 监控日志目录下的文件变化;

2、 根据配置的频率,采集日志;

1、flume1.7及以上版本

包含TaildirSource组件,可以实现监控目录,并且使用正则表达式匹配该目录中的文件名进行实时收集。

Flume作业配置:

1)在Flume安装目录的conf文件夹下,创建任务的conf文件;

vi  {任务名称}.conf

2)输入任务的配置信息(注意,此处差异较大)

#示例如下(重点关注{}中的内容)

#a1是要启动的agent的名字

a1.sources = r1   #命名agent的sources为r1

a1.sinks = k1     #命名agent的sinks为k1

a1.channels = c1  #命名agent的channels为c1

# TaildirSource配置

a1.sources.r1.type = org.apache.flume.source.taildir.TaildirSource

a1.sources.r1.channels = memory_channel

a1.sources.r1.positionFile = /tmp/taildir_position.json

a1.sources.r1.filegroups = f1

a1.sources.r1.filegroups.f1 = {/usr/logfile/s51/mylog/*}

a1.sources.r1.batchSize = 100

a1.sources.r1.backoffSleepIncrement  = 1000

a1.sources.r1.maxBackoffSleep  = 5000

a1.sources.r1.recursiveDirectorySearch = true

# Describe/configure the source

a1.sources.r1.type = exec #指定r1的类型为exec

a1.sources.r1.command =cat {日志文件的位置}   #写入本地文件路径

# Describe the sink

a1.sinks.k1.type = com.aliyun.datahub.flume.sink.DatahubSink #指定k1的类型

a1.sinks.k1.datahub.accessID ={ accessID }

a1.sinks.k1.datahub.accessKey ={ accessKey }

a1.sinks.k1.datahub.endPoint = http://dh-cn-hangzhou.aliyuncs.com

a1.sinks.k1.datahub.project = {datahub_project_name}

a1.sinks.k1.datahub.topic ={datahub_ topic _name}

a1.sinks.k1.batchSize = 100 #一次写入文件条数

a1.sinks.k1.serializer = DELIMITED

a1.sinks.k1.serializer.delimiter = {字段间隔符}

a1.sinks.k1.serializer.fieldnames= {字段 “,” 隔开,注意需要与日志文件的顺序、datahub topic的顺序保持一致}

a1.sinks.k1.serializer.charset = {文字编码格式}

a1.sinks.k1.shard.number =  {分片数,需要与datahub 的topic配置一致}

a1.sinks.k1.shard.maxTimeOut = 60

# Use a channel which buffers events in memory

a1.channels.c1.type = memory  #指定channel的类型为memory

a1.channels.c1.capacity = 1000  #设置channel的最大存储数量为1000

a1.channels.c1.transactionCapacity = 1000 #每次最大可从source中拿到或送到sink中的event数量是1000

# Bind the source and sink to the channel

a1.sources.r1.channels = c1

a1.sinks.k1.channel = c1

3、检查无误后,启动flume日志采集agent;

bin/flume-ng agent -n a1 -c conf -f conf/ {任务名称}

.conf -Dflume.root.logger=INFO,console

2、flume 1.6

原生不支持TaildirSource,需要自行下载集成:

下载地址:http://7xipth.com1.z0.glb.clouddn.com/flume-taildirfile-source.zip

将源码单独编译,打成jar包,上传到$FLUME_HOME/lib/目录下,之后配置方法可以参考上文;

3、常见问题:

1、日志文件解析错误

 异常信息截图:

 原因分析及解决方法

出现图示异常的原因,一般是因为解析日志文件得到的属性数量和配置文件不一致所致,此时需要重点排查:

1) 配置文件的间隔符、属性是否正确

a1.sinks.k1.serializer.delimiter = {字段间隔符}

a1.sinks.k1.serializer.fieldnames= {字段 “,” 隔开,注意需要与日志文件的顺序、datahub topic的顺序保持一致}

a1.sinks.k1.serializer.charset = {文字编码格式}

2) 日志文件格式是否符合预期、是否包含特殊字符

2、文件适配符模式下,找不到文件

 异常信息截图:

 原因分析及解决方法

出现图示异常的原因,一般是因为按照通配符设置,未找到文件导致异常退出,此时需要重点检查配置文件中的日志路径设置:

a1.sources.r1.filegroups.f1 = {/usr/logfile/s51/mylog/*}

3、 修改配置文件后,重新启动,无异常信息但是不加载数据

 异常信息截图:

 原因分析及解决方法

该问题比较隐秘,任务可以启动,没有明显的异常日志,但是到sink环节后不再加载数据,一般是因为修改了配置文件设置,但是没有删除对应的描述文件,需要:

1) 找到配置的描述文件路径

a1.sources.r1.positionFile = /tmp/taildir_position.json

2) 删除描述文件,重启任务

可正常加载数据;

三、扩展场景的产品架构&数据流

作者:阿里云云栖社区

原文地址:https://zhuanlan.zhihu.com/p/33777705

干货好文,请关注扫描以下二维码:


基于阿里云实现游戏数据运营(附Demo)相关推荐

  1. 基于阿里云之大数据学习:使用DataV制作实时销售数据可视化大屏

    学习目标: 了解数据可视化应用场景 掌握阿里云DataV可视化工具 了解可视化大屏制作流程 使用DataV模板制作数据可视化大屏 一.数据可视化介绍 1.数据可视化: 是指将相对复杂的数据通过可视的. ...

  2. 阿里云数加大数据计算服务MaxCompute文章索引(持续更新201705)

    概况介绍: 10年老兵带你看尽MaxCompute大数据运算挑战与实践 什么是阿里云数加大数据计算服务MaxCompute? 一分钟了解阿里云产品:大数据计算服务MaxCompute概述 数加平台如何 ...

  3. 基于阿里云的手机短信验证码和注册校验逻辑

    基于阿里云的手机短信验证码demo实现 1. 环境依赖 2. 页面表单 html 3. 校验与短信 js 4. 工具类 SmsUtils 5. 资源调用 Servlet 阿里云的短信平台:http:/ ...

  4. 基于阿里云MaxCompute实现游戏数据运营

    摘要: 一.总览 一个游戏/系统的业务数据分析,总体可以分为图示的几个关键步骤:   1.数据采集:通过SDK埋点或者服务端的方式获取业务数据,并通过分布式日志收集系统,将各个服务器中的数据收集起来并 ...

  5. 悠星网络基于阿里云分析型数据库PostgreSQL版的数据实践

    悠星网络基于阿里云分析型数据库PostgreSQL版的数据实践 说到"大数据",当下这个词很火,各行各业涉及到数据的,目前都在提大数据,提数据仓库,数据挖掘或者机器学习,但同时另外 ...

  6. 阿里云大数据认证——基于阿里云数加构建企业级数据分析平台-课堂笔记

    阿里云Clouder认证 六.基于阿里云数加构建企业级数据分析平台 1. 课程目标 (1) 了解数据分析的步骤和目的 (2) 熟悉数据分析平台搭建的组成部分 (3) 掌握阿里云数加不同产品及其使用场景 ...

  7. 基于阿里云物联网平台的设备之间传输十六进制数据

    基于阿里云物联网平台的设备之间传输十六进制数据 文章目录 基于阿里云物联网平台的设备之间传输十六进制数据 1. 创建阿里云物联网产品 1.1 创建新的产品 1.2 为产品创建自定义topic 1.3 ...

  8. 【案例】“1GB1年1毛钱“——使用 Backup exec 基于阿里云OSS 实现企业数据异地备份 【服务器管理】【云备份】

    [案例]"1GB1年1毛钱"--使用 Backup exec 基于阿里云OSS 实现企业数据异地备份 [服务器管理][云备份] 1.使用环境 如图所示 资源 配置 备注 File ...

  9. 小打卡基于阿里云构建企业级数仓的实践及总结

    简介:本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及代表性案例分享. 小打卡架构师 申羡 本次分享主要有4块内容,小打卡介绍,小打卡数仓场景简介,小打卡数仓选型思路以及 ...

最新文章

  1. python3.6升级及setuptools、pip安装
  2. 腾讯成联合国全球合作伙伴,TDSQL如何支撑史上最大规模全球会议
  3. 安装 pptpd 服务
  4. Linux内核中的常用宏container_of其实很简单【转】
  5. eclipse设置内存参数 堆内存溢出
  6. vue.js axios实现跨域http请求接口
  7. R语言分类算法之随机森林(Random Forest)
  8. 不依赖浏览器控制台的JavaScript断点调试方法
  9. java只有值传递_为什么说java中只有值传递
  10. Java基础篇:简单数据类型
  11. 苹果HomePod mini出现连接不上Wi-Fi怎么办?解决办法来啦!
  12. leetcode 221. Maximal Square 求一个数组中由1组成的最大的正方形面积 ---------- java...
  13. php 微信表情存储,emoji表情存储到数据库的方法
  14. 题目:P3717 [AHOI2017初中组]cover
  15. 判断英语名词可数和不可数
  16. win10的Pytorch最全安装教程,解决pytorch安装问题!
  17. Java并发编程|第二篇:线程生命周期
  18. arcgis for js 画圆圈(会跟地图一起缩小),而不是打点然后加半径的圆点(不会缩小),制作打卡功能选点。可以点击地图自动画圆圈
  19. Android , 打开系统播放器
  20. [JavaSE] 数据类型(变量、整形、长整型、双精度浮点、单精度浮点、字符、字节)

热门文章

  1. C++ STL 中提供的算法
  2. python脚本怎么打印日志_python 接口测试1 --如何创建和打印日志文件
  3. 苹果自带相册打马赛克_如果你用苹果手机!学会这3个技巧,就能让手机变得更加好用...
  4. tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址
  5. 当当elastic-job docker快速部署_[小Z课堂]-docker 快速部署 elasticsearch 和 kibana,一键部署...
  6. 35载再忆华罗庚精神:我们应培养怎样的数学大师?​
  7. 华为海思年内恐超越联发科 成亚洲最大芯片设计公司
  8. 诗人也出数学题,出的有趣又深刻
  9. 数学学习的心理——关于数学中的挫败的反思及若干启示
  10. 自注意力机制Self-attention(2)