电商数据仓库—数据采集平台搭建

电商数据仓库—数据采集平台搭建


数据仓库的概念

  1. 什么是数据仓库

    数据仓库就是为企业所有的决策制定过程,提供所有系统数据支持的战略集合。

  2. 数据仓库的目的

    建立数据仓库并不是数据的最终目的,而是为了数据的最终目的做好准备。(比如数据清洗、拆分、统计等等)

  3. 数据仓库的作用

    通过对数据仓库中的数据进行分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。

数据仓库的数据来源

主要是三大来源:

​ 1.日志采集系统

​ 2.业务系统数据库

​ 3.爬虫系统(还有第三方接口)

项目需求分析

  1. 搭建数据采集平台
  2. 用户行为数据仓库的分层搭建
  3. 业务数据仓库的分层搭建
  4. 针对数据仓库中的数据进行分析统计,然后生成报表

项目集群机器的部署(以10台为例)

  1. hadoop集群:使用HDFS-HA模式,2台NameNode,10台DataNode,1台ResourceManager,10台NodeManager
  2. Zookeeper集群:安装9台,1个Leader,8个Follower
  3. Flume:安装在你需要采集数据的机器上
  4. KafKa集群:安装10台
  5. Hive:随机安装一台机器上
  6. Mysql:随机安装一台机器上
  7. Sqoop:随机安装一台机器上

项目数据流程设计

  1. 首先数据来源类型主要有来自web和app的埋点的用户行为数据和后台的业务交互数据;
  2. 用户行为数据产生的日志会通过日志采集服务器存储,然后通过Flume进行采集,存储到Kafka集群,以便于之后的数据消费;
  3. 后台的业务交互数据会通过业务服务器采集,然后存储到Mysql中;
  4. 如果进行离线数据分析,可以把Mysql数据库中的业务数据用Sqoop工具导入到HDFS,把KafKa中的缓存的用户行为数据用Flume采集到HDFS上,然后对HDFS上的数据用Hive进行数据分析计算,最后结果存储到Mysql中,最终可视化;
  5. 如果进行实时计算,可以用Spark消费Kafka中缓存的数据,进行实时指标分析,然后结果存储到Hbase中,方便查询使用。

框架版本选型

选用CDH,兼容性比较好

服务器选型

对于私有企业,选择云主机;对于国有企业,大部分选择物理机;

  1. 机器成本上考虑:物理机比云主机便宜;
  2. 运维成本上考虑:物理机需要自己请专门的运维人员,而云主机则是阿里公司内部的人员维护,运维相对轻松。

数据生成

用户行为数据主要是通过埋点的方式进行数据的采集,后台业务交互数据是通过Mysql进行存储。

埋点数据的基本格式:(埋点就是指针对特定的用户行为或事件进行捕获、处理的实施过程)

  1. 公共字段:基本所有的安卓手机都有的字段(设备唯一标识、用户标识、安卓版本等等)
  2. 业务字段:埋点上报的字段(事件名称、时间结果等)

事件日志:(机器启动时间戳+一个json对象)

  1. 登陆机器字段(App或者PC)
  2. 公共字段(k-v形式)
  3. 事件字段(一个数组,里面多个json对象)

启动日志:

  1. 一个json,里面有start标识符

数据采集平台搭建

  1. 首先安装hadoop和zookeeper集群

  2. 再安装Flume,最后安装Kafka集群

  3. Flume:

    • 编写file-flume-kafka.conf文件

    • 主要是source和channel组件的定义、配置和之间的关系的编写

    • source选择Taildir source,它相对于exec和spooldir来说,它支持断点续传、多目录;

    • channel选择kafka channel,因为可以省略sink,传输效率高;

    • 拦截器代码编写

      • 编写ETL拦截器和日志类型区分拦截器
      • 都实现Interceptor
      • 主要重写里面的intercept(Event event)和intercept(List events)方法
      • intercept(Event event)是对于一个对象时的处理
      • intercept(List events)是对于多个对象输入时的处理
      • event是每个日志文件的每一行数据
      • 最后编写静态内部类,实现Interceptor.Builder
    • 选择器选择multiplexing,可以指定把不同类型的数据存储到不同类型的channel中

    • conf文件的具体编写:

      a1.sources=r1
      a1.channels=c1 c2
      
      # configure source
      a1.sources.r1.type = TAILDIR
      a1.sources.r1.positionFile = /opt/module/flume/test/log_position.json
      a1.sources.r1.filegroups = f1
      a1.sources.r1.filegroups.f1 = /tmp/logs/app.+
      a1.sources.r1.fileHeader = true
      a1.sources.r1.channels = c1 c2
      
      #interceptor
      a1.sources.r1.interceptors =  i1 i2
      a1.sources.r1.interceptors.i1.type = com.kgg.flume.interceptor.LogETLInterceptor$Builder
      a1.sources.r1.interceptors.i2.type = com.kgg.flume.interceptor.LogTypeInterceptor$Builder
      
      a1.sources.r1.selector.type = multiplexing
      a1.sources.r1.selector.header = topic
      a1.sources.r1.selector.mapping.topic_start = c1
      a1.sources.r1.selector.mapping.topic_event = c2
      
      # configure channel
      a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
      a1.channels.c1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.channels.c1.kafka.topic = topic_start
      a1.channels.c1.parseAsFlumeEvent = false
      a1.channels.c1.kafka.consumer.group.id = flume-consumer
      
      a1.channels.c2.type = org.apache.flume.channel.kafka.KafkaChannel
      a1.channels.c2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.channels.c2.kafka.topic = topic_event
      a1.channels.c2.parseAsFlumeEvent = false
      a1.channels.c2.kafka.consumer.group.id = flume-consumer
      
  4. Kafka:

    • 首先创建两个topic

    • 编写kafka-flume-hdfs.conf

    • 主要是source、channel和sink组件的定义、配置和之间的关系的编写

    • source选择kafka source

    • channel选择file channel,防止数据丢失

    • sink选择hdfs sink,选择以lzo的文件新式存储到HDFS

    • conf文件的具体编写:

      ## 组件
      a1.sources=r1 r2
      a1.channels=c1 c2
      a1.sinks=k1 k2
      
      ## source1
      a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
      a1.sources.r1.batchSize = 5000
      a1.sources.r1.batchDurationMillis = 2000
      a1.sources.r1.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.sources.r1.kafka.topics=topic_start
      
      ## source2
      a1.sources.r2.type = org.apache.flume.source.kafka.KafkaSource
      a1.sources.r2.batchSize = 5000
      a1.sources.r2.batchDurationMillis = 2000
      a1.sources.r2.kafka.bootstrap.servers = hadoop101:9092,hadoop102:9092,hadoop103:9092
      a1.sources.r2.kafka.topics=topic_event
      
      ## channel1
      a1.channels.c1.type = file
      a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint/behavior1
      a1.channels.c1.dataDirs = /opt/module/flume/data/behavior1/
      a1.channels.c1.maxFileSize = 2146435071
      a1.channels.c1.capacity = 1000000
      a1.channels.c1.keep-alive = 6
      
      ## channel2
      a1.channels.c2.type = file
      a1.channels.c2.checkpointDir = /opt/module/flume/checkpoint/behavior2
      a1.channels.c2.dataDirs = /opt/module/flume/data/behavior2/
      a1.channels.c2.maxFileSize = 2146435071
      a1.channels.c2.capacity = 1000000
      a1.channels.c2.keep-alive = 6
      
      ## sink1
      a1.sinks.k1.type = hdfs
      a1.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_start/%Y-%m-%d
      a1.sinks.k1.hdfs.filePrefix = logstart-
      a1.sinks.k1.hdfs.round = true
      a1.sinks.k1.hdfs.roundValue = 10
      a1.sinks.k1.hdfs.roundUnit = second
      
      ##sink2
      a1.sinks.k2.type = hdfs
      a1.sinks.k2.hdfs.path = /origin_data/gmall/log/topic_event/%Y-%m-%d
      a1.sinks.k2.hdfs.filePrefix = logevent-
      a1.sinks.k2.hdfs.round = true
      a1.sinks.k2.hdfs.roundValue = 10
      a1.sinks.k2.hdfs.roundUnit = second
      
      ## 不要产生大量小文件
      a1.sinks.k1.hdfs.rollInterval = 10
      a1.sinks.k1.hdfs.rollSize = 134217728
      a1.sinks.k1.hdfs.rollCount = 0
      
      a1.sinks.k2.hdfs.rollInterval = 10
      a1.sinks.k2.hdfs.rollSize = 134217728
      a1.sinks.k2.hdfs.rollCount = 0
      
      ## 控制输出文件是原生文件。
      a1.sinks.k1.hdfs.fileType = CompressedStream 
      a1.sinks.k2.hdfs.fileType = CompressedStream 
      
      a1.sinks.k1.hdfs.codeC = lzop
      a1.sinks.k2.hdfs.codeC = lzop
      
      ## 拼装
      a1.sources.r1.channels = c1
      a1.sinks.k1.channel= c1
      
      a1.sources.r2.channels = c2
      a1.sinks.k2.channel= c2
      

你可能感兴趣的:(大数据,hadoop,hadoop,hdfs,kafka)