CDH5.1从Flume采集到索引(Solr)



众所周知,CDH是Cloudera公司推出的基于稳定版的ApachHadoop环境。并且比官方的Hadoop更新更快。坚持季度update,年度release。其中集成的Hadoop生态系统中的所有组件互相兼容,并坚持更新其中的bug和feature,在学习测试、生产环境中都有很好的应用。
如果在生产环境中需要用到Hadoop,自行部署Hadoop,在其上再部署类似HBase、Flume、Impala、Hive等等,不但部署周期长,遇到问题在国内也很少能找到相应的解决办法。因为其相互的版本兼容就存在很大问题。所以笔者强烈推荐使用CDH的Hadoop。
CDH可以通过图形界面轻松部署Hadoop生态系统中的其他组件,对于初学者部署时间不超过两天。
本文旨在介绍在CDH5.1版本之上,使用Flume1.5采集文本数据,通过Morphline(ETL工具)进行分词,并存入Solr中创建索引。只通过配置即可,无需进行二次开发。

一、           环境搭建
1、 Linux:CentOS release6.5 X64(Final)
2、 CDH:CDH5,需要Cloudera Manager和CDH两个包,下载地址: http://archive-primary.cloudera.com/cm5/cm/5/
3、  JDK:1.7以上

二、           模拟应用场景
1、 从Flume的日志文件中摘取出部分内容形成一个原始的被采集文件。
2、 Flume采集源文件。
3、 通过编写正则表达式通过Flume自带的Morphline插件,将日志的每一行进行拆分。
4、 拆分成timestamp/classname/msg/message
5、 并且将timestamp再次拆分成
date_year/date_month/date_day/date_hour/date_minute/date_second
6、 将拆分结果存入Solr建立索引。
原始日志文件每行内容类似如下:


org.kitesdk.morphline.stdlib.LogInfoBuilder$LogInfo:found no grok match: [{message=[         atcom.typesafe.config.impl.Parseable.parse(Parseable.java:204)]}]


三、           搭建采集环境(Flume)
下图是Flume的工作原理结构图,简单了解一下。Flume-NG由三部分组成:Source、Channel、Sink。

Source负责采集源数据,将源数据放入Channel。
Channel负责暂存数据,供Sink使用。
Sink负责从Channel读取数据并根据需要发送出去。
以上三个部分Flume官方都提供多种类型可供使用,开发者可以根据不同需要选择不同类型的组件。并且都支持Plugin形式的二次开发,可以自定义Source、Channel和Sink。具体详细参见官方网站: http://flume.apache.org/FlumeUserGuide.html
进入Flumeà选择一个Slaveà配置

代理名称填写a5


a5.sources = r5//定义source
a5.sinks = k5//定义sink
a5.channels = c5//定义channel
  
a5.sources.r5.type = exec//定义source类型,为执行命令。
a5.sources.r5.channels = c5//指定source采集到的数据放入的channel
a5.sources.r5.command = tail -F/var/log/flume-ng/input_file_test.log//source采集的文件
  
a5.sources.r5.interceptors = i5_2 i5_3 i5_1//定义flume的拦截器
a5.sources.r5.interceptors.i5_3.type = static//拦截器类型为static(静态)
a5.sources.r5.interceptors.i5_3.key = BodyType//定义拦截器的key
a5.sources.r5.interceptors.i5_3.value = line//定义拦截器的value
a5.sources.r5.interceptors.i5_2.type = host//flume自带的拦截器(指定的被采集对象的ip地址)
a5.sources.r5.interceptors.i5_1.type = static
a5.sources.r5.interceptors.i5_1.key = sourceType
a5.sources.r5.interceptors.i5_1.value = fj
  
a5.sinks.k5.channel = c5//指定本sink从哪个channel中读取数据
a5.sinks.k5.type= org.apache.flume.sink.solr.morphline.MorphlineSolrSink//指定sink类型,MorphlineSolrSink
a5.sinks. k5.morphlineFile = morphlines.conf//指定morphline的配置文件路径,如果不加前面的路径,则默认读取该flume.conf文件所在同级路径的morphline文件。
a5.sinks. k5.morphlineId = morphline1
a5.sinks. k5.batchSize = 100//当channel中存在100条数据开始处理
a5.sinks. k5.batchDurationMillis = 1000//当channel中数据存在超过1000ms时开始处理。batchSize与batchDurationMillis采取优先原则,哪个参数值先到,哪个先处理。
  
a5.channels.c5.type = memory//指定channel类型,本例为内存
a5.channels.c5.capacity = 1000000//指定channel存储数据的能力,本例为1000000条。
a5.channels.c5.transactionCapacity = 100000//每个事务发给sink的最大event数。
a5.channels.c5.keep-alive = 30//指定channel存活时间30s,超过设定值将日出event。



四、           Morphline分词处理
笔者理解Morphline是一个ETL工具,在本例中的作用如下:
E(Extract):用readLine命令读取flume采集回的日志文件。
T(Transform):利用正则表达式对每行日志文件进行拆分。
L(Load):将拆分后的结果加载到Solr中创建索引。

Morphline配置文件说明详见代码中的注释。


SOLR_LOCATOR: {
         # Name of solr collection
         # 指定将索引创建到Solr中的哪个collection中。
         collection : collection1
  
         # ZooKeeper ensemble
         # 配置zookeeper地址
         zkHost :"slave2.CDH:2181,slave3.CDH:2181,slave4.CDH:2181/solr"
}
  
morphlines:
[
         {
                  #morphlineId,与Flume采集配置中的a5.sinks.k5.morphlineId对应
                  id : morphline1
                  # 导入commands的所有包,Morphline将所有的命令放在了org.kitesdk.包下
                  # 需要使用以下命令时必须导入这些命令所在的jar包。
                  # 与Solr命令相关的命令包在org.apache.solr下。
                  importCommands :["org.kitesdk.**", "org.apache.solr.**"]
  
                  commands : [
                  {
                          # Parse inputattachment and emit a record for each input line
                          # 读一行数据,并设置成UTF-8
                          readLine {
                                   charset :UTF-8
                          }
                  }
                  # 打印测试数据
                  { logInfo { format :"output record: {}", args : ["@{}"] } }
                  {
                  # 分词命令
                  grok {
                          # 导入字典数据,配置路径,可配置多个并用“,”分隔。
                          # grok-dictionary.conf中存储的是正则表达式采用K-V方式存储,
                          # 文件中定义原子正则表达式,新定义的正则可以引用其他的原子正则表达式。使用%{}方式引用。
                          # 读者可以详细参见该文件。
                          dictionaryFiles :[/home/flume-ng/conf/grok-dictionary.conf]
                          expressions : {
                                   # 拆分原始数据,以下为固定格式。flume会将读到的每行数据默认存入一个message的变量中。
                                   # 大括号中冒号前是grok-dictionary.conf文件中的正则标签,冒号后是solr中的field。
                                   message :"""%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}%{DATA:classname}: %{GREEDYDATA:msg}"""
                          }
                  }
  
         }
         {
         # tryRules是异常处理功能,因为本例中要将时间戳做进一步拆分,拆分成年、月、日、时、分、秒等。
         # 不同数据的时间戳格式又不禁相同,所以可以对时间戳格式进行穷举。不同格式的时间戳就可以拆分了。
         tryRules {
                  throwExceptionIfAllRulesFailed: true
                  rules : [
                  {
                  commands : [
                  {
                          grok {
                                   dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                   expressions :{
                                            timestamp:"%{YEAR:date_year}-%{MONTHNUM:date_month}-%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                          }
                  }
                  }
                  ]
         }
         {
                  commands : [
                  {
                          grok {
                                   dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                   expressions :{
                                   timestamp : "%{YEAR:date_year}-%{MONTHNUM:date_month}-%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                  }
         }
         }
         ]
         }
         {
                  commands : [
                  {
                          grok {
                                   dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                   expressions :{
                                            timestamp:"%{YEAR:date_year}/%{MONTHNUM:date_month}/%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                          }
                  }
         }
         ]
         }
         ]
         }
  
}
  
         {
                  # 转换时间格式,将输入时间转换成Solr识别的格式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                  convertTimestamp {
                          # Solr中的时间戳field:timestamp
                          field : timestamp
                          inputFormats :["yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-ddHH:mm:ss","yyyy/MM/dd HH:mm:ss"]
                          outputFormat :"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                  }
         }
         {
                  # Solr中的索引主键field:id
                  generateUUID {
                          field : id
                  }
         }
  
         # schema.xml.
         {
                  sanitizeUnknownSolrFields {
                  # Location from which to fetchSolr schema
                  solrLocator : ${SOLR_LOCATOR}
  
                  renameToPrefix :"ignored_"
                  }
         }
  
         # load the record into a SolrServer orMapReduce SolrOutputFormat.
         {
                  loadSolr {
                          solrLocator :${SOLR_LOCATOR}
                  }
         }
         ]
         }
]


id="iframeu1728839_0" src="http://pos.baidu.com/dcvm?rdid=1728839&dc=2&di=u1728839&dri=0&dis=0&dai=3&ps=454x1133&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1466476500570&ti=CDH5.1%E4%BB%8EFlume%E9%87%87%E9%9B%86%E5%88%B0%E7%B4%A2%E5%BC%95(Solr)-CDH-about%E4%BA%91%E5%BC%80%E5%8F%91&ari=1&dbv=2&drs=1&pcs=1349x643&pss=1349x791&cfv=0&cpl=4&chi=1&cce=true&cec=GBK&tlm=1466476500&ltu=http%3A%2F%2Fwww.aboutyun.com%2Fthread-14925-1-1.html&ltr=http%3A%2F%2Fwww.aboutyun.com%2Fthread-14923-1-1.html&ecd=1&psr=1366x768&par=1366x728&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1466476501&qn=fd605ce2fd743081&tt=1466476500549.100.654.654" width="120" height="240" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="word-wrap: break-word; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;">



众所周知,CDH是Cloudera公司推出的基于稳定版的ApachHadoop环境。并且比官方的Hadoop更新更快。坚持季度update,年度release。其中集成的Hadoop生态系统中的所有组件互相兼容,并坚持更新其中的bug和feature,在学习测试、生产环境中都有很好的应用。
如果在生产环境中需要用到Hadoop,自行部署Hadoop,在其上再部署类似HBase、Flume、Impala、Hive等等,不但部署周期长,遇到问题在国内也很少能找到相应的解决办法。因为其相互的版本兼容就存在很大问题。所以笔者强烈推荐使用CDH的Hadoop。
CDH可以通过图形界面轻松部署Hadoop生态系统中的其他组件,对于初学者部署时间不超过两天。
本文旨在介绍在CDH5.1版本之上,使用Flume1.5采集文本数据,通过Morphline(ETL工具)进行分词,并存入Solr中创建索引。只通过配置即可,无需进行二次开发。

一、           环境搭建
1、 Linux:CentOS release6.5 X64(Final)
2、 CDH:CDH5,需要Cloudera Manager和CDH两个包,下载地址:http://archive-primary.cloudera.com/cm5/cm/5/
3、  JDK:1.7以上

二、           模拟应用场景
1、 从Flume的日志文件中摘取出部分内容形成一个原始的被采集文件。
2、 Flume采集源文件。
3、 通过编写正则表达式通过Flume自带的Morphline插件,将日志的每一行进行拆分。
4、 拆分成timestamp/classname/msg/message
5、 并且将timestamp再次拆分成
date_year/date_month/date_day/date_hour/date_minute/date_second
6、 将拆分结果存入Solr建立索引。
原始日志文件每行内容类似如下:


org.kitesdk.morphline.stdlib.LogInfoBuilder$LogInfo:found no grok match: [{message=[         atcom.typesafe.config.impl.Parseable.parse(Parseable.java:204)]}]


三、           搭建采集环境(Flume)
下图是Flume的工作原理结构图,简单了解一下。Flume-NG由三部分组成:Source、Channel、Sink。

Source负责采集源数据,将源数据放入Channel。
Channel负责暂存数据,供Sink使用。
Sink负责从Channel读取数据并根据需要发送出去。
以上三个部分Flume官方都提供多种类型可供使用,开发者可以根据不同需要选择不同类型的组件。并且都支持Plugin形式的二次开发,可以自定义Source、Channel和Sink。具体详细参见官方网站:http://flume.apache.org/FlumeUserGuide.html
进入Flumeà选择一个Slaveà配置
代理名称填写a5

[Bash shell]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
a5.sources = r5 // 定义 source
a5.sinks = k5 // 定义sink
a5.channels = c5 // 定义channel
  
a5.sources.r5. type = exec // 定义 source 类型,为执行命令。
a5.sources.r5.channels = c5 // 指定 source 采集到的数据放入的channel
a5.sources.r5. command = tail -F /var/log/flume-ng/input_file_test .log //source 采集的文件
  
a5.sources.r5.interceptors = i5_2 i5_3 i5_1 // 定义flume的拦截器
a5.sources.r5.interceptors.i5_3. type = static // 拦截器类型为static(静态)
a5.sources.r5.interceptors.i5_3.key = BodyType // 定义拦截器的key
a5.sources.r5.interceptors.i5_3.value = line // 定义拦截器的value
a5.sources.r5.interceptors.i5_2. type = host //flume 自带的拦截器(指定的被采集对象的ip地址)
a5.sources.r5.interceptors.i5_1. type = static
a5.sources.r5.interceptors.i5_1.key = sourceType
a5.sources.r5.interceptors.i5_1.value = fj
  
a5.sinks.k5.channel = c5 // 指定本sink从哪个channel中读取数据
a5.sinks.k5. type = org.apache.flume.sink.solr.morphline.MorphlineSolrSink // 指定sink类型,MorphlineSolrSink
a5.sinks. k5.morphlineFile = morphlines.conf // 指定morphline的配置文件路径,如果不加前面的路径,则默认读取该flume.conf文件所在同级路径的morphline文件。
a5.sinks. k5.morphlineId = morphline1
a5.sinks. k5.batchSize = 100 // 当channel中存在100条数据开始处理
a5.sinks. k5.batchDurationMillis = 1000 // 当channel中数据存在超过1000ms时开始处理。batchSize与batchDurationMillis采取优先原则,哪个参数值先到,哪个先处理。
  
a5.channels.c5. type = memory // 指定channel类型,本例为内存
a5.channels.c5.capacity = 1000000 // 指定channel存储数据的能力,本例为1000000条。
a5.channels.c5.transactionCapacity = 100000 // 每个事务发给sink的最大event数。
a5.channels.c5.keep-alive = 30 // 指定channel存活时间30s,超过设定值将日出event。


四、           Morphline分词处理
笔者理解Morphline是一个ETL工具,在本例中的作用如下:
E(Extract):用readLine命令读取flume采集回的日志文件。
T(Transform):利用正则表达式对每行日志文件进行拆分。
L(Load):将拆分后的结果加载到Solr中创建索引。

Morphline配置文件说明详见代码中的注释。
[HTML]  纯文本查看  复制代码
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
SOLR_LOCATOR: {
          # Name of solr collection
          # 指定将索引创建到Solr中的哪个collection中。
          collection : collection1
  
          # ZooKeeper ensemble
          # 配置zookeeper地址
          zkHost :"slave2.CDH:2181,slave3.CDH:2181,slave4.CDH:2181/solr"
}
  
morphlines:
[
          {
                   #morphlineId,与Flume采集配置中的a5.sinks.k5.morphlineId对应
                   id : morphline1
                   # 导入commands的所有包,Morphline将所有的命令放在了org.kitesdk.包下
                   # 需要使用以下命令时必须导入这些命令所在的jar包。
                   # 与Solr命令相关的命令包在org.apache.solr下。
                   importCommands :["org.kitesdk.**", "org.apache.solr.**"]
  
                   commands : [
                   {
                           # Parse inputattachment and emit a record for each input line
                           # 读一行数据,并设置成UTF-8
                           readLine {
                                    charset :UTF-8
                           }
                   }
                   # 打印测试数据
                   { logInfo { format :"output record: {}", args : ["@{}"] } }
                   {
                   # 分词命令
                   grok {
                           # 导入字典数据,配置路径,可配置多个并用“,”分隔。
                           # grok-dictionary.conf中存储的是正则表达式采用K-V方式存储,
                           # 文件中定义原子正则表达式,新定义的正则可以引用其他的原子正则表达式。使用%{}方式引用。
                           # 读者可以详细参见该文件。
                           dictionaryFiles :[/home/flume-ng/conf/grok-dictionary.conf]
                           expressions : {
                                    # 拆分原始数据,以下为固定格式。flume会将读到的每行数据默认存入一个message的变量中。
                                    # 大括号中冒号前是grok-dictionary.conf文件中的正则标签,冒号后是solr中的field。
                                    message :"""%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel}%{DATA:classname}: %{GREEDYDATA:msg}"""
                           }
                   }
  
          }
          {
          # tryRules是异常处理功能,因为本例中要将时间戳做进一步拆分,拆分成年、月、日、时、分、秒等。
          # 不同数据的时间戳格式又不禁相同,所以可以对时间戳格式进行穷举。不同格式的时间戳就可以拆分了。
          tryRules {
                   throwExceptionIfAllRulesFailed: true
                   rules : [
                   {
                   commands : [
                   {
                           grok {
                                    dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                    expressions :{
                                             timestamp:"%{YEAR:date_year}-%{MONTHNUM:date_month}-%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                           }
                   }
                   }
                   ]
          }
          {
                   commands : [
                   {
                           grok {
                                    dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                    expressions :{
                                    timestamp : "%{YEAR:date_year}-%{MONTHNUM:date_month}-%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                   }
          }
          }
          ]
          }
          {
                   commands : [
                   {
                           grok {
                                    dictionaryFiles: [/home/flume-ng/conf/grok-dictionary.conf]
                                    expressions :{
                                             timestamp:"%{YEAR:date_year}/%{MONTHNUM:date_month}/%{MONTHDAY:date_day}[T]%{HOUR:date_hour}:?%{MINUTE:date_minute}(?::?%{SECOND:date_second})"
                           }
                   }
          }
          ]
          }
          ]
          }
  
}
  
          {
                   # 转换时间格式,将输入时间转换成Solr识别的格式"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                   convertTimestamp {
                           # Solr中的时间戳field:timestamp
                           field : timestamp
                           inputFormats :["yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-ddHH:mm:ss","yyyy/MM/dd HH:mm:ss"]
                           outputFormat :"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                   }
          }
          {
                   # Solr中的索引主键field:id
                   generateUUID {
                           field : id
                   }
          }
  
          # schema.xml.
          {
                   sanitizeUnknownSolrFields {
                   # Location from which to fetchSolr schema
                   solrLocator : ${SOLR_LOCATOR}
  
                   renameToPrefix :"ignored_"
                   }
          }
  
          # load the record into a SolrServer orMapReduce SolrOutputFormat.
          {
                   loadSolr {
                           solrLocator :${SOLR_LOCATOR}
                   }
          }
          ]
          }
]

五、           编辑Solr的schema.xml文件
Solr的schema.xml文件一般存放在/etc/solr/instance.conf/conf目录。
编辑schema.xml文件
将必须的field进行更新。

<pre lang="html" line="1"escaped="true">
<field name="timestamp" type="date"indexed="true" stored="true"omitNorms="true"/>
<field name="date_year" type="int"indexed="true" stored="true"omitNorms="true"/>
<field name="date_month" type="int"indexed="true" stored="true"omitNorms="true"/>
<field name="date_day" type="int"indexed="true" stored="true"omitNorms="true"/>
<field name="date_hour" type="int"indexed="true" stored="true"omitNorms="true"/>
<field name="date_minute" type="int"indexed="true" stored="true"omitNorms="true"/>
<field name="date_second" type="string"indexed="true" stored="true"omitNorms="true"/>
<!—flume配置文件中官方提供的host拦截器-->
<field name="host" type="string"indexed="true" stored="true"omitNorms="true"/>
<!—flume配置文件中的一个静态拦截器-->
<field name="sourceType"type="string" indexed="true" stored="true" omitNorms="true"/>
<!—Morphline文件中的message-->
<field name="message" type="string"indexed="false" stored="true"omitNorms="true"/>
</pre>

以上文件编辑完成并保存后需要上传并重新加载一下这个collection。
使用如下命令:

[Bash shell]  纯文本查看  复制代码
?
1
2
solrctl instancedir --update myconfig /etc/solr/instance .conf
solrctl collection --reload collection1


以上即为在CDH环境中部署Flume采集数据,利用Morphline进行分词,并加载到Solr中创建索引的过程。
文中如有错误或更好的方案欢迎交流。
QQ:58431505  //认证请注明:Solr交流

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本教程为授权出品 一、课程简介数据仓库(Data Warehouse,可简写为DW或DWH),是面向分析的集成化数据环境,为企业决策制定过程,提供系统数据支持的战略集合,是国内外各大公司正在重点投入的战略级技术领域。 二、课程内容《大数据电商数仓项目实战》视频教程,从项目架构的搭建,到数据采集模块的设计、数仓架构的设计、实战需求实现、即席查询的实现,我们针对国内目前广泛使用的Apache原生框架和CDH版本框架进行了分别介绍,Apache原生框架介绍中涉及到的技术框架包括Flume、Kafka、Sqoop、MySql、HDFS、Hive、Tez、Spark、Presto、Druid等,CDH版本框架讲解包括CM的安装部署、Hadoop、Zookeeper、Hive、Flume、Kafka、Oozie、Impala、HUE、Kudu、Spark的安装配置,透彻了解不同版本框架的区别联系,将大数据全生态系统前沿技术一网打尽。在过程中对大数据生态体系进行了系统的讲解,对实际企业数仓项目中可能涉及到的技术点都进行了深入的讲解和探讨。同时穿插了大量数仓基础理论知识,让你在掌握实战经验的同时能够打下坚实的理论基础。 三、课程目标本课程以国内电商巨头实际业务应用场景为依托,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:每日、周、月活跃设备明细,留存用户比例,沉默用户、回流用户、流失用户统计,最近连续3周活跃用户统计,最近7天内连续3天活跃用户统计,GMV成交总额分析,转化率及漏斗分析,品牌复购率分析、订单表拉链表的设计等,让学生拥有更直观全面的实战经验。通过对本课程的学习,对数仓项目可以建立起清晰明确的概念,系统全面的掌握各项数仓项目技术,轻松应对各种数仓难题。 四、课程亮点本课程结合国内多家企业实际项目经验,特别加入了项目架构模块,从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建大数据集群。并且总结大量项目实战中会遇到的问题,针对各个技术框架,均有调优实战经验,具体包括:常用Linux运维命令、Hadoop集群调优、Flume组件选型及性能优化、Kafka集群规模确认及关键参数调优。通过这部分学习,助学生迅速成长,获取前沿技术经验,从容解决实战问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值