Galaxy数据统计平台(三)

4月19号

到了现在说下开发进度吧~~

系统设计

系统设计

简单说一说

由于与需要接受的数据原比较多,再加上服务是部署在阿里云上的,所有的数据均是通过http接收
目前数据接收后直接存储到elasticsearch或者是存储到MySql中
目前没有对实时的数据进行处理.
由于数据在下游都是经过清理的所以传输过来之后直接就可以使用elasticsearch进行聚合,直接展示.

接下来要做的

  • 重中之重(服务高可用)
    index服务没有搭建高可用,导致数据丢失
    用户订单数据丢失
    在13号可以明显的看到数据在晚上丢失了,白天看日志发现是服务器莫名挂掉了无奈只能找php从新要数据.

  • 高可用服务构建
    服务端的高可用本来想用zookeeper做的,但是时间有限而且公司接下来可能需要使用spring cloud 既然如此那还是用eureka搭建注册中心.

  • hadoop基础搭建
    hadoop目前公司没有需要对线下数据进行大量计算的任务,但是出于将来的考虑还是要搭建的.
    目前的任务就是这样能做到那就做到那把

遇到的痛点

  • 被迫使用mysql对数据进行统计
    由于老大的要求,只能将超哥从FB哪里爬来的数据进行展示,由于需要两张表之间进行聚合等比较运算,写了个很长的sql但是效率巨低,所以纠结了一下改变了策略.

  • 解决办法
    将爬虫服务部署到阿里云上,之后使用logstash将mysql中的数据查出来定时同步到elasticsearch中,在es中再次使用聚合查询出想要的结果.
    这里写图片描述

input {
 stdin { }
    jdbc {
        jdbc_connection_string => "jdbc:mysql://172.17.70.225:3306/galaxy"

        jdbc_user => "galaxy"

        jdbc_password => "lollollol"

        jdbc_driver_library => "/usr/mysql/mysql-connector-java-5.1.45-bin.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

        jdbc_paging_enabled => "true"

        jdbc_page_size => "50000"
        statement => "SELECT fb.id AS id, course_id, fb.title AS title, fb.price AS price, fb.student_limit AS student_limit, fb.student_count-fb.previous_count AS previous_count, fb.previours_price AS previours_price, fb.current_cycle_income AS current_cycle_income, fb.create_time AS create_time, fc.course_type AS course_type, fc.status AS status, fc.sale_status AS sale_status FROM fb_course_snapshot fb LEFT JOIN fb_course fc ON fb.course_id = fc.id WHERE fb.id>:sql_last_value"
        use_column_value => true
        tracking_column => "id"
        schedule => "* * * * *"
    }
 }
filter {
    date {
      match => ["create_time", "yyyy-MM-dd HH:mm:ss,SSS", "UNIX"]
      target => "@timestamp"
      locale => "cn"
    }
}

 output {
     stdout {
        codec => json_lines
    }
    elasticsearch {
        hosts => "172.17.70.224:9200"
        index => "fb_goods"
        document_type => "fb_orders"
        document_id => "%{id}"
    }
}

该配置文档,遵循一些logstash的规则进行无数据收集和匹配

  • 在使用logstash的时候也是遇到了一些坑

    1. 每一个logstash的配置文件只能支持一个sql的查询,也是就是说如果想要配置多个数据源,需要每次再配置的时候开启input的属性
    2. logstash的守护进程,由于logstash需要在后台一直运行,所以logstash需要一个守护进程去保证他可以在后台一直执行,目前我用的方法就是在启动的时候加一个’&’ 表示在后台运行,在后期肯能会写一个收获进程.
    3. logstash—filter
    filter {
    date {
      match => ["create_time", "yyyy-MM-dd HH:mm:ss,SSS", "UNIX"]
      target => "@timestamp"
      locale => "cn"
    }
}

logstash支持使用过滤器插件,可以将收集后的数据进行过滤,这个配置的方法给所有的查询添加一个时间戳字段.

4.logstash—output

     output {
     stdout {
        codec => json_lines
    }
    elasticsearch {
        hosts => "172.17.70.224:9200"
        index => "fb_goods"
        document_type => "fb_orders"
        document_id => "%{id}"
    }
}

用来接收数据,将数据输出到指定的数据源

基础服务

index服务

主要负责

  • 接收上报的数据
  • 消费数据,对数据进行分类存储

  • 大数据存储

    • es(目前使用)
    • hdfs文件存储系统(未构建)
  • 业务性数据存储
    • mysql
  • 消息队列(未构建)

search服务

主要负责

  • 对线下数据的聚合展示(目前使用es对数据进行聚合)
  • Galaxy数据展示平台业务代码

pass服务(本地MQ消费者)

主要负责

  • 消费本地MQ中的消息,并将消息进行上报

项目进度

敏感字眼辣眼睛数据展示

该模块主要是负责往期敏感字眼辣眼睛数据概览以及往期敏感字眼辣眼睛数据对比分析,帮助产品运营更直观的通过敏感字眼辣眼睛往期的各地区报名人数考试情况来分析敏感字眼辣眼睛的情况。

  • 敏感字眼辣眼睛首页展示(接口完成)
  • 敏感字眼辣眼睛首页表格(开发中)
  • 敏感字眼辣眼睛详情页(数据未上报)

敏感字眼辣眼睛数据展示

  • php分类列表
  • 课程列表
  • 直播方向
  • 所有的直播间人次和最高并发量
  • 各时间峰值人数
  • 指定课程各时间直播峰值人数
  • 指定课程直播总人数和平均听课时长
    以上数据已同步到es中

目前安排
录播视频 指定课程录播课(包含直播视频回放)

  • 听课次数,听课时长
  • 听课时间

用户行为分析

该模块主要负责对使用app的用户进行为分析,对用户进行画像,并且将用户的行为分析汇总。

  • 数据结构设计(完成)
  • 数据采集(开发中)
  • 数据分析(未进行)
  • 漏斗分析(未进行)
  • 留存分析(未进行)
  • 用户路径分析(未进行)
  • 用户行为序列(未进行)

订单数据分析

该模块主要是对公司的订单进行分析,统计销售总额,通过时间以及活动进行分析课程的销售情况。

  • 秒杀数据统计(完成)
  • 订单历史数据拉取(完成未上线)
  • 历史订单销售额每月订单销售额(完成)
  • 需求完善中。。。。。。。

app使用分析

该模块主要是对APP的使用情况进行分析,统计每日的访问量,接口的访问热度从而帮助产品完善app的设计

  • 用户历史注册数据(完成)
  • 用户注册数据(进行中)
  • app活跃度(完成)
  • 用户app使用情况(未完成)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
galaxy 起源于07年的一个数据库导库项目,做一个增删改查的功能,只要几行代码就可以了,只要你会简单的sql语句,就能快速完成一个 功能,相比struts2和spring,着实方便多了. 如果觉得好用,就放弃ssh吧,加入到galaxy的阵营。 1. 完成一个用户管理功能? user.jsp ,这个页面用于新增,修改一个用户 <html> <head></head> <body> <% MyHashMap req = RequestUtil.getRequest(request); MyHashMap obj = new Query("select * from user where id ="+req.getInt("id")); %> <form action="regesiterAction.jsp" method="post"> 用户名<input name="username" value="<%=obj.getString("username")%>" /> 密码<input type="password" value="<%=obj.getString("password")%>" name="password" /> 手机号: <input name="telphone" value="<%=obj.getString("username")%>" /> <input type="hidden" name="action" value="saveorupdate" /> <input type="submit" value="提交" /> </form> </body> </html> userAction.jsp <% MyHashMap req = RequestUtil.getRequest(request); if(req.getString("action").equals("saveorupdate")){ new Imp().saveOrUpdate(req); }else if(req.getString("action").equals("del")){ new Query().update("delete from user where id="+req.getString("id")); } response.sendRededict("user.jsp"); %> 用户列表页面 <html> <body> <form> <table> <tr><td>用户名</td><td>密码</td><td>手机号</td> <% MyHashMap req = RequestUtil.getReq(request); int pagesize = req.getInt("pagesize",10); int pageindex = req.getInt("pageindex",1); List<MyHashMap> list = new Query().getByPaging("select * from user where "+condition,pagesize,pageindex); MyHashMap pageinfo = list.get(0); for(MyHashMap map:list){ %> <tr> <td><%=map.getString("username")%></td> <td><%=map.getString("password")%></td> <td><%=map.getString("telphone")%></td> </tr> <%}%> </table> <%=com.zxhy.fxpt.common.util.StringUtil.getdaohang(pageinfo.getInt("pagecount"),pageinfo.getInt("pagenum"))%> </form> </body> </html> 有兴趣的话,跟我联系qq: 376860997

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值