1)Data Warehouse(数据仓库)
数据仓库是一个各种数据(包括历史数据和当前数据)的中心存储系统,是BI( business intelligence ,商业智能)的核心部件。
这里所谈的数据包括来自企业业务系统的订单、库存、交易账目、客户和供应商等来自企业所处行业和竞争对手的数据以及来自企业所处的其他外部环境中的各种数据。
2)Business Intelligence(商业智能)
商业智能通常被理解为将企业中现有的数据转化为知识,帮助企业做出明智的业务经营决策的工具。
为了将数据转化为知识,需要利用数据仓库、联机分析处理(OLAP)工具和数据挖掘等技术。
3)OLAP(online analytical processing)
OLAP(online analytical processing)是一种软件技术,它使分析人员能够迅速、一致、交互地从各个方面观察信息,以达到深入理解数据的目的。从各方面观察信息,也就是从不同的维度分析数据,因此OLAP也成为多维分析。
订单id
下单地区
下单品类
下单时间
订单金额
1001
华北
电子
12月
456
1002
华东
食品
11月
489
1003
西南
居家
2月
491
1004
东北
电子
4月
659
1005
西北
宠物
11月
369
1006
华北
食品
12月
159
分析订单金额总和的规律,需要从不同的角度去观察:
角度1:地区
角度2:品类
角度3:时间
角度4:地区,品类
角度5:地区,时间
角度6:品类,时间
角度7:地区,品类,时间
OLAP 类型:
OLAP Cube:
MOLAP基于多维数据集,一个多维数据集称为一个OLAP Cube。
订单id
下单地区
下单品类
下单时间
订单金额
1001
华北
电子
12月
456
1002
华东
食品
11月
489
1003
西南
居家
2月
491
1004
东北
电子
4月
659
1005
西北
宠物
11月
369
1006
华北
食品
12月
159
Cube & Cuboid:
4)Star Schema(星型模型)?
订单id
下单地区
下单品类
下单时间
订单金额
1001
华北
电子
12月
456
1002
华东
食品
11月
489
1003
西南
居家
2月
491
1004
东北
电子
4月
659
1005
西北
宠物
11月
369
1006
华北
食品
12月
159
5)Fact Table(事实表) & ?Dimension Table(维度表)?
6)Dimension(维度) & Measure(度量)?
?维度:分析数据的数据的角度。
度量:被分析的指标。
测试集群服务器规划:?
服务名称
子服务
服务器
hadoop102
服务器
hadoop103
服务器
hadoop104
HDFS
NameNode
√
DataNode
√
√
√
SecondaryNameNode
√
Yarn
NodeManager
√
√
√
Resourcemanager
√
Zookeeper
Zookeeper?Server
√
√
√
Flume(采集日志)
Flume
√
√
Kafka
Kafka
√
√
√
Flume(消费Kafka)
Flume
√
Hive
Hive
√
MySQL
MySQL
√
Sqoop
Sqoop
√
Presto
Coordinator
√
Worker
√
√
Azkaban
AzkabanWebServer
√
AzkabanExecutorServer
√
Druid
Druid
√
√
√
Kylin
√
Hbase
HMaster
√
HRegionServer
√
√
√
Superset
√
Atlas
√
Solr
Jar
√
服务数总计
18
9
9
1.?目标数据
我们要收集和分析的数据主要包括页面数据、事件数据、曝光数据、启动数据和错误数据。
1)页面
页面数据主要记录一个页面的用户访问情况,包括访问时间、停留时间、页面路径等信息。
2)事件
事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。
所有动作类型如下:
注:对于下单、支付等业务数据,可从业务数据库获取。
所有动作目标类型如下:?
3)曝光
曝光数据主要记录页面所曝光的内容,包括曝光对象,曝光类型等信息。
所有曝光类型如下:
所有曝光对象类型如下:?
4)启动
启动数据记录应用的启动信息。
所有启动入口类型如下:?
2.?数据埋点
目前主流的埋点方式,有代码埋点(前端/后端)、可视化埋点、全埋点三种。
代码埋点是通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。例如,我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据。
可视化埋点只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的圈选功能,来圈出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。
全埋点是通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。
1)埋点数据日志结构
我们的日志结构大致可分为两类,一是普通页面埋点日志,二是启动日志。
普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。
普通页面埋点日志格式:
2)启动日志格式
启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。
3)埋点数据上报时机
埋点数据上报时机包括两种方式。
方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。
方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。
1)准备三台虚拟机,虚拟机配置要求如下:
(1)单台虚拟机:内存4G,硬盘50G?
(2)修改克隆虚拟机的静态IP
改成:
(3)查看Linux虚拟机的虚拟网络编辑器,编辑->虚拟网络编辑器->VMnet8
查看Windows系统适配器VMware Network Adapter VMnet8的IP地址
保证Linux文件中IP地址、Linux虚拟网络编辑器地址和Windows系统VM8网络IP地址相同。?
2)修改主机名
(1)修改主机名称
(2)配置主机名称映射,打开/etc/hosts
添加如下内容:
(3)修改window7的主机映射文件(hosts文件)
(a)进入C:\Windows\System32\drivers\etc路径
(b)打开hosts文件并添加如下内容
(4)修改window10的主机映射文件(hosts文件)
(a)进入C:\Windows\System32\drivers\etc路径
(b)拷贝hosts文件到桌面
(c)打开桌面hosts文件并添加如下内容
(d)将桌面hosts文件覆盖C:\Windows\System32\drivers\etc路径hosts文件
3)关闭防火墙
4)配置普通用户(yyds)具有root权限
5)在/opt目录下创建文件夹
(1)在/opt目录下创建module、software文件夹
(2)修改module、software文件夹的所有者
重启:
6)编写集群分发脚本xsync
1、scp(secure copy)安全拷贝:
(1)scp定义:
scp可以实现服务器与服务器之间的数据拷贝。(from?server1?to?server2)
(2)基本语法
scp-r ?$pdir/$fname ?$user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 ?目的用户@主机:目的路径/名称
(3)案例实操
(a)在hadoop102上,将hadoop102中/opt/module目录下的软件拷贝到hadoop103上。
(b)在hadoop104上,将hadoop102服务器上的/opt/module目录下的软件拷贝到hadoop104上。
注意:拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。sudo chown?yyds:yyds?-R /opt/module。
2、rsync远程同步工具:
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync ?-av $pdir/$fname ?$user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 ?目的用户@主机:目的路径/名称
选项参数说明:
选项
功能
-a
归档拷贝
-v
显示复制过程
(2)案例实操
(a)将hadoop102中/etc/profile.d/my_env.sh文件拷贝到hadoop103的/etc/profile.d/my_env.sh上。
(b)将hadoop102中/etc/profile.d/my_env.sh文件拷贝到hadoop103的/etc/profile.d/my_env.sh上。
注意:拷贝过来的配置文件别忘了source一下/etc/profile.d/my_env.sh。
3、xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:
(b)期望脚本:
xsync要同步的文件名称
(c)说明:在/home/yyds/bin这个目录下存放的脚本,yyds用户可以在系统任何地方直接执行。
(3)脚本实现
(a)在用的家目录/home/yyds下创建bin文件夹
(b)在/home/yyds/bin目录下创建xsync文件,以便全局调用
?在该文件中编写如下代码:
(c)修改脚本 xsync 具有执行权限
(d)测试脚本
7)SSH无密登录配置
1、配置ssh
(1)基本语法
ssh另一台电脑的IP地址
(2)ssh连接时出现Host key verification failed的解决方法
出现:
(3)解决方案如下:直接输入yes
2、无密钥配置
(1)免密登录原理?
(2)生成公钥和私钥
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(3)将公钥拷贝到要免密登录的目标机器上
注意:
还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;
还需要在hadoop103上采用yyds账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
3、.ssh文件夹下(~/.ssh)的文件功能解释
known_hosts
记录ssh访问过计算机的公钥(public key)
id_rsa
生成的私钥
id_rsa.pub
生成的公钥
authorized_keys
存放授权过的无密登录服务器公钥
8)JDK准备
卸载现有JDK(3台节点):
用SecureCRT工具将JDK导入到hadoop102的/opt/software文件夹下面。
alt+p进入sftp模式:?
选择jdk1.8拖入工具。?
解压JDK到/opt/module目录下:
配置JDK环境变量:?
(1)新建/etc/profile.d/my_env.sh文件
添加如下内容,然后保存(:wq)退出:
(2)让环境变量生效
测试JDK是否安装成功:
如果能看到以下结果、则Java正常安装:
分发JDK?:
分发环境变量配置文件:?
分别在hadoop103、hadoop104上执行source:
环境变量配置说明:
Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,~/.bashrc,~/.bash_profile等,下面说明上述几个文件之间的关系和区别。
bash的运行模式可分为login?shell和non-login shell。
例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login?shell,而当我们执行以下命令ssh?hadoop103 command,在hadoop103执行command的就是一个non-login shell。
这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login?shell启动时会加载/etc/profile,~/.bash_profile,~/.bashrc,non-login?shell启动时会加载~/.bashrc。
而在加载~/.bashrc(实际是~/.bashrc中加载的/etc/bashrc)或/etc/profile时,都会执行如下代码片段:
因此不管是login?shell还是non-login?shell,启动时都会加载/etc/profile.d/*.sh中的环境变量。?
1.?配置文件
(1)application.yml文件
可以根据需求生成对应日期的用户行为日志。
修改如下内容:
(2)path.json,该文件用来配置访问路径
根据需求,可以灵活配置用户点击路径。
(3)logback配置文件
可配置日志生成路径,修改内容如下:
2.?生成日志
(1)进入到/opt/module/applog路径,执行以下命令
(2)在/opt/module/applog/log目录下查看生成日志
3.?集群日志生成脚本
在hadoop102的/home/yyds目录下创建bin目录,这样脚本可以在服务器的任何目录执行。
1)在/home/yyds/bin目录下创建脚本lg.sh
2)在脚本中编写如下内容
注:
(1)/opt/module/applog/为jar包及配置文件所在路径
(2)/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称黑洞。
标准输入0:从键盘获得输入 /proc/self/fd/0
标准输出1:输出到屏幕(即控制台) /proc/self/fd/1
错误输出2:输出到屏幕(即控制台) /proc/self/fd/2
3)修改脚本执行权限
4)将jar包及配置文件上传至hadoop103的/opt/module/applog/路径
5)启动脚本
6)分别在hadoop102、hadoop103的/opt/module/applog/log目录上查看生成的数据
1.?集群所有进程查看脚本
1)在/home/yyds/bin目录下创建脚本xcall.sh
2)在脚本中编写如下内容
3)修改脚本执行权限
4)启动脚本
2.?Hadoop部署
1)集群规划
服务器hadoop102
服务器hadoop103
服务器hadoop104
HDFS
NameNode
DataNode
DataNode
DataNode
SecondaryNameNode
Yarn
NodeManager
Resourcemanager
NodeManager
NodeManager
注意:
尽量使用离线方式安装。
NameNode和SecondaryNameNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
2)用SecureCRT工具将hadoop-3.1.3.tar.gz导入到opt目录下面的software文件夹下面
切换到sftp连接页面,选择Linux下编译的hadoop jar包拖入:
3)进入到Hadoop安装包路径下?
4)解压安装文件到/opt/module下面
5)查看是否解压成功
6)将Hadoop添加到环境变量
(1)获取Hadoop安装路径
(2)打开/etc/profile.d/my_env.sh文件
在profile文件末尾添加JDK路径:(shitf+g):
(3)保存后退出
(4)分发环境变量文件
(5)source 是之生效(3台节点)
3.?配置集群
1)核心配置文件
配置core-site.xml:
文件内容如下:
2)HDFS配置文件
配置hdfs-site.xml:
文件内容如下:
3)YARN配置文件
配置yarn-site.xml:
文件内容如下:
4)MapReduce配置文件
配置mapred-site.xml:
文件内容如下:
5)配置workers
在该文件中增加如下内容:
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
4.?配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。
具体配置步骤如下:
配置mapred-site.xml:
在该文件里面增加如下配置:
5.?配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
配置yarn-site.xml:
在该文件里面增加如下配置:
6. 分发Hadoop
7.?群起集群
启动集群:
(1)集群是第一次启动
需要在hadoop102节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
(2)启动HDFS
(3)在配置了ResourceManager的节点(hadoop103)启动YARN
(4)Web端查看HDFS的Web页面:http://hadoop102:9870/
(5)Web端查看SecondaryNameNode
(a)浏览器中输入:http://hadoop104:9868/status.html
(b)查看SecondaryNameNode信息
8.Hadoop群起脚本
9.?集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
配置时间同步具体实操:
1)时间服务器配置(必须root用户)
(0)查看所有节点ntpd服务状态和开机自启动状态
(1)在所有节点关闭ntp服务和自启动
(2)修改hadoop102的ntp.conf配置文件
修改内容如下:
a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)
为:
b)修改2(集群在局域网中,不使用其他互联网上的时间)
为:
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
(3)修改hadoop102的/etc/sysconfig/ntpd 文件
增加内容如下(让硬件时间与系统时间一起同步):
(4)重新启动ntpd服务
(5)设置ntpd服务开机启动
2)其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
编写定时任务如下:
(2)修改任意机器时间
(3)十分钟后查看机器是否与时间服务器同步
说明:测试的时候可以将10分钟调整为1分钟,节省时间。
10.?项目经验之HDFS存储多目录
1)生产环境服务器磁盘情况
2)在hdfs-site.xml文件中配置多目录,注意新挂载磁盘的访问权限问题
HDFS的DataNode节点保存数据的路径由dfs.datanode.data.dir参数决定,其默认值为file://${hadoop.tmp.dir}/dfs/data,若服务器有多个磁盘,必须对该参数进行修改。如服务器磁盘如上图所示,则该参数应修改为如下的值。
注意:每台服务器挂载的磁盘不一样,所以每个节点的多目录配置可以不一致。单独配置即可。
11.?集群数据均衡
1)节点间数据均衡
开启数据均衡命令:
对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。
停止数据均衡命令:
2)磁盘间数据均衡
(1)生成均衡计划(我们只有一块磁盘,不会生成计划)
(2)执行均衡计划
(3)查看当前均衡任务的执行情况
(4)取消均衡任务
12.?项目经验之支持LZO压缩配置
1)hadoop本身并不支持lzo压缩,故需要使用twitter提供的hadoop-lzo开源组件
hadoop-lzo需依赖hadoop和lzo进行编译。
编译步骤如下:
Hadoop支持LZO
0、环境准备
通过yum安装即可,
1、下载、安装并编译LZO
2、编译hadoop-lzo源码
① 下载hadoop-lzo的源码,下载地址:http://github.com/twitter/hadoop-lzo/archive/master.zip
② 解压之后,修改pom.xml
?
③ 声明两个临时环境变量
④ 编译
进入hadoop-lzo-master,执行maven编译命令:
⑤ 进入target,hadoop-lzo-0.4.21-SNAPSHOT.jar 即编译成功的hadoop-lzo组件。
2)将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-3.1.3/share/hadoop/common/
3)同步hadoop-lzo-0.4.20.jar到hadoop103、hadoop104
4)core-site.xml增加配置支持LZO压缩
5)同步core-site.xml到hadoop103、hadoop104
6)启动及查看集群
13.?项目经验之LZO创建索引
1)创建LZO文件的索引
LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。
2)测试
(1)将bigtable.lzo(200M)上传到集群的根目录
(2)执行wordcount程序
(3)对上传的LZO文件建索引
(4)再次执行WordCount程序
3)注意:如果以上任务,在运行过程中报如下异常?
解决办法:在hadoop102的/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml文件中增加如下配置,然后分发到hadoop103、hadoop104服务器上,并重新启动集群。
14.?项目经验之基准测试
1)?测试HDFS写性能
测试内容:向HDFS集群写10个128M的文件。
2)测试HDFS读性能
测试内容:读取HDFS集群10个128M的文件。
3)删除测试生成数据
4)使用Sort程序评测MapReduce
(1)使用RandomWriter来产生随机数,每个节点运行10个Map任务,每个Map产生大约1G大小的二进制随机数
(2)执行Sort程序
(3)验证数据是否真正排好序了
15.?项目经验之Hadoop参数调优
1)HDFS参数调优hdfs-site.xml
dfs.namenode.handler.count=?,比如集群规模为8台时,此参数设置为41。可通过简单的python代码计算该值,代码如下:
2)YARN参数调优yarn-site.xml
(1)情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive
面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。
(2)解决办法:
内存利用率不够。这个一般是Yarn的2个配置造成的,单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。
(a)yarn.nodemanager.resource.memory-mb
表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。
(b)yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB)。
1. ZK分布式安装部署
1)集群规划
在hadoop102、hadoop103和hadoop104三个节点上部署Zookeeper。
服务器hadoop102
服务器hadoop103
服务器hadoop104
Zookeeper
Zookeeper
Zookeeper
Zookeeper
2)解压安装
(1)解压Zookeeper安装包到/opt/module/目录下
(2)修改/opt/module/apache-zookeeper-3.5.7-bin名称为zookeeper-3.5.7
(3)同步/opt/module/zookeeper-3.5.7目录内容到hadoop103、hadoop104
3)配置服务器编号
(1)在/opt/module/zookeeper-3.5.7/这个目录下创建zkData
(2)在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的文件
添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
在文件中添加与server对应的编号:
(3)拷贝配置好的zookeeper到其他机器上
并分别在hadoop103、hadoop104上修改myid文件中内容为3、4
4)配置zoo.cfg文件
(1)重命名/opt/module/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg
(2)打开zoo.cfg文件
修改数据存储路径配置:
增加如下配置:
(3)同步zoo.cfg配置文件
(4)配置参数解读
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
5)集群操作
(1)分别启动Zookeeper
(2)查看状态
2.客户端命令行操作
命令基本语法
功能描述
help
显示所有操作命令
ls?path
使用 ls 命令来查看当前znode的子节点
-w监听子节点变化
-s 附加次级信息
create
普通创建
-s ?含有序列
-e ?临时(重启或者超时消失)
get path
获得节点的值
-w监听节点内容变化
-s 附加次级信息
set
设置节点的具体值
stat
查看节点状态
delete
删除节点
deleteall
递归删除节点
启动客户端:
3.?ZK集群启动停止脚本
1)在hadoop102的/home/yyds/bin目录下创建脚本
在脚本中编写如下内容:
2)增加脚本执行权限
3)Zookeeper集群启动脚本
4)Zookeeper集群停止脚本
1.?Kafka集群安装
hadoop102
hadoop103
hadoop104
zk
zk
zk
kafka
kafka
kafka
jar包下载:
Apache Kafka
2.?集群部署
1)解压安装包4
2)修改解压后的文件名称
3)在/opt/module/kafka目录下创建logs文件夹
4)修改配置文件
5)配置环境变量
6)分发安装包
7)分别在hadoop103和hadoop104上修改配置文件/opt/module/kafka/config/server.properties中的broker.id=1、broker.id=2
注:broker.id不得重复。
8)启动集群
9)关闭集群
10)kafka群起脚本
(1)在/home/yyds/bin目录下创建脚本kf.sh
[yyds@hadoop102 bin]$ vim kf.sh:
(2)增加脚本执行权限
(3)kf集群启动脚本
(4)kf集群停止脚本
3.?Kafka命令行操作
1)查看当前服务器中的所有topic
2)创建topic
选项说明:
--topic 定义topic名
--replication-factor ?定义副本数
--partitions ?定义分区数
3)删除topic
4)发送消息
5)消费消息
6)查看某个Topic的详情
7)修改分区数
4.?Kafka监控(Kafka?Eagle)
1)修改kafka启动命令
修改kafka-server-start.sh命令中:
为:
注意:修改之后在启动Kafka之前要分发之其他节点。
2)上传压缩包kafka-eagle-bin-1.3.7.tar.gz到集群/opt/software目录
3)解压到本地
4)进入刚才解压的目录
5)将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module
6)修改名称
7)给启动文件执行权限
8)修改配置文件
9)添加环境变量
注意:source /etc/profile。
10)启动
注意:启动之前需要先启动ZK以及KAFKA。
11)登录页面查看监控数据
http://192.168.9.102:8048/ke
5.?Kafka集群启动停止脚本
1)在/home/yyds/bin目录下创建脚本kf.sh
在脚本中填写如下内容:
2)增加脚本执行权限
3)kf集群启动脚本
4)kf集群停止脚本
6.?Kafka常用命令
1)查看Kafka Topic列表
2)创建Kafka Topic
进入到/opt/module/kafka/目录下创建日志主题:
3)删除Kafka Topic
4)Kafka生产消息
5)Kafka消费消息
--from-beginning:会把主题中以往所有的数据都读取出来。根据业务场景选择是否增加该配置。
6)查看Kafka?Topic详情
7.?项目经验之Kafka压力测试
1)Kafka压测
用Kafka官方自带的脚本,对Kafka进行压测。Kafka压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络IO)。一般都是网络IO达到瓶颈。?
kafka-consumer-perf-test.sh
kafka-producer-perf-test.sh
2)Kafka?Producer压力测试
(1)在/opt/module/kafka/bin目录下面有这两个文件。
我们来测试一下:
说明:
record-size是一条信息有多大,单位是字节。
num-records是总共发送多少条信息。
throughput 是每秒多少条信息,设成-1,表示不限流,可测出生产者最大吞吐量。
(2)Kafka会打印下面的信息
参数解析:本例中一共写入10w条消息,吞吐量为9.14 MB/sec,每次写入的平均延迟为187.68毫秒,最大的延迟为424.00毫秒。
3)Kafka?Consumer压力测试
Consumer的测试,如果这四个指标(IO,CPU,内存,网络)都不能改变,考虑增加分区数来提升性能。
参数说明:
--zookeeper 指定zookeeper的链接信息
--topic 指定topic的名称
--fetch-size 指定每次fetch的数据的大小
--messages 总共要消费的消息个数
测试结果说明:
start.time, end.time,?data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec
2019-02-19 20:29:07:566,?2019-02-19 20:29:12:170,?9.5368, 2.0714, 100010,?21722.4153
开始测试时间,测试结束数据,共消费数据9.5368MB,吞吐量2.0714MB/s,共消费100010条,平均每秒消费21722.4153条。
8.?项目经验之Kafka机器数量计算
Kafka机器数量(经验公式)=2*(峰值生产速度*副本数/100)+1
先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署Kafka的数量。
比如我们的峰值生产速度是50M/s。副本数为2。
Kafka机器数量=2*(50*2/100)+?1=3台
9.?项目经验值Kafka分区数计算
1)创建一个只有1个分区的topic
2)测试这个topic的producer吞吐量和consumer吞吐量。
3)假设他们的值分别是Tp和Tc,单位可以是MB/s。
4)然后假设总的目标吞吐量是Tt,那么分区数=Tt / min(Tp,Tc)
例如:producer吞吐量=20m/s;consumer吞吐量=50m/s,期望吞吐量100m/s;
分区数=100 / 20 =5分区
如何根据数据量确定Kafka分区个数、Kafka的分区是不是越多越好、Kafak生产者分发策略,消费者负载均衡 09_啊策策的博客-CSDN博客
分区数一般设置为:3-10个
1.?日志采集Flume安装
1)安装地址
(1) Flume官网地址:Welcome to Apache Flume — Apache Flume
(2)文档查看地址:Flume 1.10.1 User Guide — Apache Flume
(3)下载地址:http://archive.apache.org/dist/flume/
2)安装部署
(1)将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/software目录下
(2)解压apache-flume-1.9.0-bin.tar.gz到/opt/module/目录下
(3)修改apache-flume-1.9.0-bin的名称为flume
(4)将lib文件夹下的guava-11.0.2.jar删除以兼容Hadoop?3.1.3
注意:删除guava-11.0.2.jar的服务器节点,一定要配置hadoop环境变量。否则会报如下异常。
(5)将flume/conf下的flume-env.sh.template文件修改为flume-env.sh,并配置flume-env.sh文件
2. 集群规划
服务器hadoop102
服务器hadoop103
服务器hadoop104
Flume(采集日志)
Flume
Flume
3.?项目经验之Flume组件选型
1)Source
(1)Taildir Source相比Exec Source、Spooling Directory Source的优势
TailDir?Source:断点续传、多目录。Flume1.6以前需要自己自定义Source记录每次读取文件位置,实现断点续传。
Exec?Source可以实时搜集数据,但是在Flume不运行或者Shell命令出错的情况下,数据将会丢失。
Spooling Directory Source监控目录,支持断点续传。
(2)batchSize大小如何设置?
答:Event?1K左右时,500-1000合适(默认为100)
2)Channel
采用Kafka?Channel,省去了Sink,提高了效率。KafkaChannel数据存储在Kafka里面,所以数据是存储在磁盘中。
注意在Flume1.7以前,Kafka?Channel很少有人使用,因为发现parseAsFlumeEvent这个配置起不了作用。也就是无论parseAsFlumeEvent配置为true还是false,都会转为Flume Event。这样的话,造成的结果是,会始终都把Flume的headers中的信息混合着内容一起写入Kafka的消息中,这显然不是我所需要的,我只是需要把内容写入即可。
4.?日志采集Flume配置
1)Flume配置分析
Flume直接读log日志的数据,log日志的格式是app.yyyy-mm-dd.log。
2)Flume的具体配置
(1)在/opt/module/flume/conf目录下创建file-flume-kafka.conf文件?
在文件配置如下内容:
注意:com.yyds.flume.interceptor.ETLInterceptor是自定义的拦截器的全类名。需要根据用户自定义的拦截器做相应修改。
5.?Flume拦截器
1)创建Maven工程flume-interceptor
2)创建包名:com.yyds.flume.interceptor
3)在pom.xml文件中添加如下配置
4)在com.yyds.flume.interceptor包下创建JSONUtils类
5)在com.yyds.flume.interceptor包下创建LogInterceptor类
6)打包
?7)需要先将打好的包放入到hadoop102的/opt/module/flume/lib文件夹下面。
8)分发Flume到hadoop103、hadoop104
9)分别在hadoop102、hadoop103上启动Flume
6.?日志采集Flume启动停止脚本
1)在/home/yyds/bin目录下创建脚本f1.sh
在脚本中填写如下内容:
说明1:nohup,该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思,不挂断地运行命令。
说明2:awk 默认分隔符为空格
说明3:xargs 表示取出前面命令运行的结果,作为后面命令的输入参数。
2)增加脚本执行权限
3)f1集群启动脚本
4)f1集群停止脚本
7. 消费Kafka数据Flume
集群规划:
服务器hadoop102
服务器hadoop103
服务器hadoop104
Flume(消费Kafka)
Flume
1)项目经验之Flume组件选型
① FileChannel和MemoryChannel区别
MemoryChannel传输数据速度更快,但因为数据保存在JVM的堆内存中,Agent进程挂掉会导致数据丢失,适用于对数据质量要求不高的需求。
FileChannel传输速度相对于Memory慢,但数据安全保障高,Agent进程挂掉也可以从失败中恢复数据。
选型:
金融类公司、对钱要求非常准确的公司通常会选择FileChannel
传输的是普通日志信息(京东内部一天丢100万-200万条,这是非常正常的),通常选择MemoryChannel。
② FileChannel优化
通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量。
官方说明如下:
checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
③ Sink:HDFS Sink
(1)HDFS存入大量小文件,有什么影响?
元数据层面:每个小文件都有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等,这些信息都保存在Namenode内存中。所以小文件过多,会占用Namenode服务器大量内存,影响Namenode性能和使用寿命
计算层面:默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能。同时也影响磁盘寻址时间。
(2)HDFS小文件处理
官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount?=0几个参数综合作用,效果如下:
(1)文件在达到128M时会滚动生成新文件
(2)文件创建超3600秒时会滚动生成新文件
2)Flume拦截器
由于flume默认会用linux系统时间,作为输出到HDFS路径的时间。如果数据是23:59分产生的。Flume消费kafka里面的数据时,有可能已经是第二天了,那么这部门数据会被发往第二天的HDFS路径。我们希望的是根据日志里面的实际时间,发往HDFS的路径,所以下面拦截器作用是获取日志中的实际时间。
① 在com.yyds.flume.interceptor包下创建TimeStampInterceptor类
②?重新打包
需要先将打好的包放入到hadoop102的/opt/module/flume/lib文件夹下面:?
分发Flume到hadoop103、hadoop104:
8.?日志消费Flume配置
1)Flume配置分析
2)Flume的具体配置
(1)在hadoop104的/opt/module/flume/conf目录下创建kafka-flume-hdfs.conf文件
在文件配置如下内容:
3)日志消费Flume启动停止脚本
在/home/yyds/bin目录下创建脚本f2.sh:
在脚本中填写如下内容:
增加脚本执行权限:
f2集群启动脚本:
f2集群停止脚本:
9.?项目经验之Flume内存优化
1)问题描述
如果启动消费Flume抛出如下异常:
2)解决方案
(1)在hadoop102服务器的/opt/module/flume/conf/flume-env.sh文件中增加如下配置
(2)同步配置到hadoop103、hadoop104服务器
3)Flume内存参数设置及优化
JVM?heap一般设置为4G或更高
-Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁fullgc。
-Xms表示JVM Heap(堆内存)最小尺寸,初始分配;-Xmx?表示JVM Heap(堆内存)最大允许的尺寸,按需分配。如果不设置一致,容易在初始化时,由于内存不够,频繁触发fullgc。
10.?采集通道启动/停止脚本
1)数据通道测试
根据需求分别生成2020-06-14和2020-06-15日期的数据
(1)修改/opt/module/applog/application.yml中业务日期为2020-06-14
(2)执行脚本,生成2020-06-14日志数据
(3)再次修改/opt/module/applog/application.yml中业务日期2020-06-15
(4)执行脚本,生成2020-06-15日志数据
5)在这个期间,不断观察Hadoop的HDFS路径上是否有数据
2)采集通道启动/停止脚本
(1)在/home/yyds/bin目录下创建脚本cluster.sh
在脚本中填写如下内容:
(2)增加脚本执行权限
(3)cluster集群启动脚本
(4)cluster集群停止脚本
电商的业务流程可以以一个普通用户的浏览足迹为例进行说明,用户点开电商首页开始浏览,可能会通过分类查询也可能通过全文搜索寻找自己中意的商品,这些商品无疑都是存储在后台的管理系统中的。
当用户寻找到自己中意的商品,可能会想要购买,将商品添加到购物车后发现需要登录,登录后对商品进行结算,这时候购物车的管理和商品订单信息的生成都会对业务数据库产生影响,会生成相应的订单数据和支付数据。
订单正式生成之后,还会对订单进行跟踪处理,直到订单全部完成。
电商的主要业务流程包括用户前台浏览商品时的商品详情的管理,用户商品加入购物车进行支付时用户个人中心&支付服务的管理,用户支付完成后订单后台服务的管理,这些流程涉及到了十几个甚至几十个业务数据表,甚至更多。
1)SKU和SPU
SKU=Stock Keeping Unit(库存量基本单位)。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。
?SPU(Standard Product Unit):是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息集合。
例如:iPhoneX手机就是SPU。一台银色、128G内存的、支持联通网络的iPhoneX,就是SKU。
SPU表示一类商品。同一SPU的商品可以共用商品图片、海报、销售属性等。?
2)电商系统表结构
以下为本电商数仓系统涉及到的业务数据表结构关系。这34个表以订单表、用户表、SKU商品表、活动表和优惠券表为中心,延伸出了优惠券领用表、支付流水表、活动订单表、订单详情表、订单状态表、商品评论表、编码字典表退单表、SPU商品表等,用户表提供用户的详细信息,支付流水表提供该订单的支付详情,订单详情表提供订单的商品数量等情况,商品表给订单详情表提供商品的详细信息。本次讲解以此34个表为例,实际项目中,业务数据库中表格远远不止这些。
电商业务表:
后台管理表:?
Flume 消费:
1.?安装包准备
1)卸载自带的Mysql-libs(如果之前安装过mysql,要全都卸载掉)
2)将安装包和JDBC驱动上传到/opt/software,共计6个
2.?安装MySQL
1)安装mysql依赖
2)安装mysql-client
3)安装mysql-server
4)启动mysql
5)查看mysql密码
3.?配置MySQL
配置只要是root用户+密码,在任何主机上都能登录MySQL数据库。
1)用刚刚查到的密码进入mysql(如果报错,给密码加单引号)
2)设置复杂密码(由于mysql密码策略,此密码必须足够复杂)
3)更改mysql密码策略
4)设置简单好记的密码
5)进入msyql库
6)查询user表
7)修改user表,把Host表内容修改为%
8)刷新
9)退出
1.?连接MySQL
通过MySQL可视化客户端连接数据库。
2.?建表语句
1)通过SQLyog创建数据库
?
2)设置数据库名称为gmall,编码为utf-8,排序规则为utf8_general_ci?
3.?生成业务数据
1)在hadoop102的/opt/module/目录下创建db_log文件夹
2)把gmall2020-mock-db-2021-01-22.jar和application.properties上传到hadoop102的/opt/module/db_log路径上。
3)根据需求修改application.properties相关配置
4)并在该目录下执行,如下命令,生成2020-06-14日期数据:
?5)查看gmall数据库,观察是否有2020-06-14的数据出现
4.?业务数据建模
可借助EZDML这款数据库设计工具,来辅助我们梳理复杂的业务表关系。
1)下载地址
EZDML - 下载
2)使用说明
(1)新建模型
(2)命名模型
(3)点击图标,选中模型?
(4)导入数据库?
(5)配置数据库连接?
(6)选择导入的表(标注红点的表不需要导入)?
(7)建立表关系
第一步:点击选中主表(主键所在的表)
第二步:点击连接按钮?
第三步:点击从表,配置连接条件?
第四步:效果展示
3)使用技巧
(1)缩略图
(2)热键
按住shift键,用鼠标点击表,进行多选,可实现批量移动。
按住ctrl键,用鼠标圈选表,也可进行多选,实现批量移动。
1.?下载并解压
1)下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.6/
2)上传安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz到hadoop102的/opt/software路径中
3)解压sqoop安装包到指定目录,如:
4)解压sqoop安装包到指定目录,如:
2.?修改配置文件
1) 进入到/opt/module/sqoop/conf目录,重命名配置文件:
2) 修改配置文件
增加如下内容:
3.?拷贝JDBC驱动
1)将mysql-connector-java-5.1.48.jar?上传到/opt/software路径。
2)进入到/opt/software/路径,拷贝jdbc驱动到sqoop的lib目录下。
4.?验证Sqoop
我们可以通过某一个command来验证sqoop配置是否正确:
出现一些Warning警告(警告信息已省略),并伴随着帮助命令的输出:
5.?测试Sqoop是否能够成功连接数据库
出现如下输出:
数据同步策略的类型包括:全量同步、增量同步、新增及变化同步、特殊情况
全量表:存储完整的数据。增量表:存储新增加的数据。新增及变化表:存储新增加的数据和变化的数据。特殊表:只需要存储一次。
1.?全量同步策略
2.?增量同步策略?
3.?新增及变化策略?
4.?特殊策略
某些特殊的表,可不必遵循上述同步策略。
例如没变化的客观世界的数据(比如性别,地区,民族,政治成分,鞋子尺码)可以只存一份。
5.业务数据导入HDFS
1)分析表同步策略
在生产环境,个别小公司,为了简单处理,所有表全量导入。
中大型公司,由于数据量比较大,还是严格按照同步策略导入数据。
2)业务数据首日同步脚本
脚本编写:
(1)在/home/yyds/bin目录下创建
添加如下内容:?
说明1:
[ -n 变量值?]?判断变量的值,是否为空
--?变量的值,非空,返回true
--?变量的值,为空,返回false
说明2:
查看date命令的使用,[yyds@hadoop102 ~]$ date --help
(2)增加脚本执行权限
脚本使用:
1)脚本编写
(1)在/home/yyds/bin目录下创建
添加如下内容:
(2)增加脚本执行权限
2)脚本使用
3)项目经验
Hive中的Null在底层是以\N来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string。
1.?Hive安装部署
1)把apache-hive-3.1.2-bin.tar.gz上传到linux的/opt/software目录下
2)解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面
3)修改apache-hive-3.1.2-bin.tar.gz的名称为hive
4)修改/etc/profile.d/my_env.sh,添加环境变量
添加内容:
重启Xshell对话框或者source一下?/etc/profile.d/my_env.sh文件,使环境变量生效:
5)解决日志Jar包冲突,进入/opt/module/hive/lib目录
2.?Hive元数据配置到MySQL
1)拷贝驱动
将MySQL的JDBC驱动拷贝到Hive的lib目录下:
2)配置Metastore到MySQL
在$HIVE_HOME/conf目录下新建hive-site.xml文件:
添加如下内容:
3.?启动Hive
1)初始化元数据库
(1)登陆MySQL
(2)新建Hive元数据库
(3)初始化Hive元数据库
2)启动hive客户端
(1)启动Hive客户端
(2)查看一下数据库
1)表命名
ODS层命名为ods_表名DIM层命名为dim_表名DWD层命名为dwd_表名DWS层命名为dws_表名 ?DWT层命名为dwt_表名ADS层命名为ads_表名临时表命名为tmp_表名
2)脚本命名
数据源_to_目标_db/log.sh用户行为脚本以log为后缀;业务数据脚本以db为后缀。
?3)表字段类型
数量类型为bigint金额类型为decimal(16, 2),表示:16位有效数字,其中小数部分2位字符串(名字,描述信息等)类型为string主键外键类型为string时间戳类型为bigint
1.?范式概念
1)定义
数据建模必须遵循一定的规则,在关系数建模中,这种规则就是范式。
2)优点
采用范式,可以降低数据的冗余性。
为什么要降低数据冗余性?
(1)十几年前,磁盘很贵,为了减少磁盘存储。
(2)以前没有分布式系统,都是单机,只能增加磁盘,磁盘个数也是有限的
(3)一次修改,需要修改多个表,很难保证数据一致性
3)缺点
范式的缺点是获取数据时,需要通过Join拼接出最后的数据。
4)分类
目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。?
2.?函数依赖
3.三范式区分?
第一范式:
第二范式:
第三范式:
关系建模和维度建模是两种数据仓库的建模技术。关系建模由Bill Inmon所倡导,维度建模由Ralph Kimball所倡导。
1)关系建模
关系建模将复杂的数据抽象为两个概念——实体和关系,并使用规范化的方式表示出来。关系模型如图所示,从图中可以看出,较为松散、零碎,物理表数量多。
关系模型严格遵循第三范式(3NF),数据冗余程度低,数据的一致性容易得到保证。由于数据分布于众多的表中,查询会相对复杂,在大数据的场景下,查询效率相对较低。
2)维度建模
维度模型如图所示,从图中可以看出,模型相对清晰、简洁。
维度模型以数据分析作为出发点,不遵循三范式,故数据存在一定的冗余。维度模型面向业务,将业务用事实表和维度表呈现出来。表结构简单,故查询简单,查询效率较高。?
1)维度表
维度表:一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。 ?例如:用户、商品、日期、地区等。
维表的特征:
维表的范围很宽(具有多个属性、列比较多)跟事实表相比,行数相对较小:通常< 10万条内容相对固定:编码表
时间维度表:
日期ID
day?of?week
day?of?year
季度
节假日
2020-01-01
2
1
1
元旦
2020-01-02
3
2
1
无
2020-01-03
4
3
1
无
2020-01-04
5
4
1
无
2020-01-05
6
5
1
无
2)事实表
事实表中的每行数据代表一个业务事件(下单、支付、退款、评价等)。事实这个术语表示的是业务事件的度量值(可统计次数、个数、金额等),例如,2020年5月21日,宋宋老师在京东花了250块钱买了一瓶海狗人参丸。维度表:时间、用户、商品、商家。事实表:250块钱、一瓶
每一个事实表的行包括:具有可加性的数值型的度量值、与维表相连接的外键,通常具有两个和两个以上的外键。
事实表的特征:
非常的大内容相对的窄:列数较少(主要是外键id和度量值)经常发生变化,每天会新增加很多。
(1)事务型事实表
以每个事务或事件为单位,例如一个销售订单记录,一笔支付记录等,作为事实表里的一行数据。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。
(2)周期型快照事实表
周期型快照事实表中不会保留所有数据,只保留固定时间间隔的数据,例如每天或者每月的销售额,或每月的账户余额等。
例如购物车,有加减商品,随时都有可能变化,但是我们更关心每天结束时这里面有多少商品,方便我们后期统计分析。
(3)累积型快照事实表
累计快照事实表用于跟踪业务事实的变化。例如,数据仓库中可能需要累积或者存储订单从下订单开始,到订单商品被打包、运输、和签收的各个业务阶段的时间点数据来跟踪订单声明周期的进展情况。当这个业务过程进行时,事实表的记录也要不断更新。
订单id
用户id
下单时间
打包时间
发货时间
签收时间
订单金额
3-8
3-8
3-9
3-10
3)维度模型分类
在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。
1. ODS层
1)HDFS用户行为数据
2)HDFS业务数据?
3)针对HDFS上的用户行为数据和业务数据,我们如何规划处理?
(1)保持数据原貌不做任何修改,起到备份数据的作用。
(2)数据采用压缩,减少磁盘存储空间(例如:原始数据100G,可以压缩到10G左右)
(3)创建分区表,防止后续的全表扫描
2.?DIM层和DWD层
DIM层DWD层需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型。
维度建模一般按照以下四个步骤:
选择业务过程→声明粒度→确认维度→确认事实
(1)选择业务过程
在业务系统中,挑选我们感兴趣的业务线,比如下单业务,支付业务,退款业务,物流业务,一条业务线对应一张事实表。
(2)声明粒度
数据粒度指数据仓库的数据中保存数据的细化程度或综合程度的级别。
声明粒度意味着精确定义事实表中的一行数据表示什么,应该尽可能选择最小粒度,以此来应各种各样的需求。
典型的粒度声明如下:
订单事实表中一行数据表示的是一个订单中的一个商品项。
支付事实表中一行数据表示的是一个支付记录。
(3)确定维度
维度的主要作用是描述业务是事实,主要表示的是谁,何处,何时等信息。
确定维度的原则是:后续需求中是否要分析相关维度的指标。例如,需要统计,什么时间下的订单多,哪个地区下的订单多,哪个用户下的订单多。需要确定的维度就包括:时间维度、地区维度、用户维度。
(4)确定事实
此处的事实一词,指的是业务中的度量值(次数、个数、件数、金额,可以进行累加),例如订单金额、下单次数等。
在DWD层,以业务过程为建模驱动,基于每个具体业务过程的特点,构建最细粒度的明细层事实表。事实表可做适当的宽表化处理。
事实表和维度表的关联比较灵活,但是为了应对更复杂的业务需求,可以将能关联上的表尽量关联上。
时间
用户
地区
商品
优惠券
活动
度量值
订单
√
√
√
运费/优惠金额/原始金额/最终金额
订单详情
√
√
√
√
√
√
件数/优惠金额/原始金额/最终金额
支付
√
√
√
支付金额
加购
√
√
√
件数/金额
收藏
√
√
√
次数
评价
√
√
√
次数
退单
√
√
√
√
件数/金额
退款
√
√
√
√
件数/金额
优惠券领用
√
√
√
次数
至此,数据仓库的维度建模已经完毕,DWD层是以业务过程为驱动。
DWS层、DWT层和ADS层都是以需求为驱动,和维度建模已经没有关系了。
DWS和DWT都是建宽表,按照主题去建表。主题相当于观察问题的角度。对应着维度表。
3.?DWS层与DWT层
DWS层和DWT层统称宽表层,这两层的设计思想大致相同,通过以下案例进行阐述。
1)问题引出:两个需求,统计每个省份订单的个数、统计每个省份订单的总金额
2)处理办法:都是将省份表和订单表进行join,group?by省份,然后计算。同样数据被计算了两次,实际上类似的场景还会更多。
那怎么设计能避免重复计算呢?
针对上述场景,可以设计一张地区宽表,其主键为地区ID,字段包含为:下单次数、下单金额、支付次数、支付金额等。上述所有指标都统一进行计算,并将结果保存在该宽表中,这样就能有效避免数据的重复计算。
3)总结:
(1)需要建哪些宽表:以维度为基准。
(2)宽表里面的字段:是站在不同维度的角度去看事实表,重点关注事实表聚合后的度量值。
(3)DWS和DWT层的区别:DWS层存放的所有主题对象当天的汇总行为,例如每个地区当天的下单次数,下单金额等,DWT层存放的是所有主题对象的累积行为,例如每个地区最近7天(15天、30天、60天)的下单次数、下单金额等。
4.?ADS层
对电商系统各大主题指标分别进行分析。
1.?Hive环境搭建
Hive引擎包括:默认MR、tez、spark
Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变成了Spark,Spark负责采用RDD执行。
Spark on Hive : Hive只作为存储元数据,Spark负责SQL解析优化,语法是Spark?SQL语法,Spark负责采用RDD执行。
2.?Hive?on?Spark配置
1)兼容性说明
注意:官网下载的Hive3.1.2和Spark3.0.0默认是不兼容的。因为Hive3.1.2支持的Spark版本是2.4.5,所以需要我们重新编译Hive3.1.2版本。
编译步骤:官网下载Hive3.1.2源码,修改pom文件中引用的Spark版本为3.0.0,如果编译通过,直接打包获取jar包。如果报错,就根据提示,修改相关方法,直到不报错,打包获取jar包。
2)在Hive所在节点部署Spark
如果之前已经部署了Spark,则该步骤可以跳过,但要检查SPARK_HOME的环境变量配置是否正确。
(1)Spark官网下载jar包地址:
Downloads | Apache Spark
(2)上传并解压解压spark-3.0.0-bin-hadoop3.2.tgz
(3)配置SPARK_HOME环境变量
添加如下内容:
source 使其生效:
3)在hive中创建spark配置文件
添加如下内容(在执行任务时,会根据如下参数执行)
在HDFS创建如下路径,用于存储历史日志:
4)向HDFS上传Spark纯净版jar包
说明1:由于Spark3.0.0非纯净版默认支持的是hive2.3.7版本,直接使用会和安装的Hive3.1.2出现兼容性问题。所以采用Spark纯净版jar包,不包含hadoop和hive相关依赖,避免冲突。
说明2:Hive任务最终由Spark来执行,Spark任务资源分配由Yarn来调度,该任务有可能被分配到集群的任何一个节点。所以需要将Spark的依赖上传到HDFS集群路径,这样集群中任何一个节点都能获取到。
(1)上传并解压spark-3.0.0-bin-without-hadoop.tgz
(2)上传Spark纯净版jar包到HDFS
5)修改hive-site.xml文件
添加如下内容:
注意:hive.spark.client.connect.timeout的默认值是1000ms,如果执行hive的insert语句时,抛如下异常,可以调大该参数到10000ms。
6)Hive on Spark测试
(1)启动hive客户端
(2)创建一张测试表
(3)通过insert测试效果
若结果如下,则说明配置成功。
3. Spark on Hive配置
使用Hive管理数据,使用Spark-sql计算数据。
部署Spark:
解压Spark安装包并修改名称:
复制hive-site.xml到Spark的conf目录:
编辑Spark的conf目录下的hive-site.xml配置文件,开启动态分区。
增加以下属性:
在/opt/module/spark/jars目录下增加mysql驱动和lzo依赖:
配置环境变量:
配置spark-default.conf:
增加以下配置:
配置spark-env.sh:
启动历史服务器:
4.?Yarn配置
1)增加ApplicationMaster资源比例
容量调度器对每个资源队列中同时运行的Application?Master占用的资源进行了限制,该限制通过yarn.scheduler.capacity.maximum-am-resource-percent参数实现,其默认值是0.1,表示每个资源队列上Application?Master最多可使用的资源为该队列总资源的10%,目的是防止大部分资源都被Application?Master占用,而导致Map/Reduce?Task无法执行。
生产环境该参数可使用默认值。但学习环境,集群资源总数很少,如果只分配10%的资源给Application?Master,则可能出现,同一时刻只能运行一个Job的情况,因为一个Application?Master使用的资源就可能已经达到10%的上限了。故此处可将该值适当调大。
(1)在hadoop102的/opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml文件中修改如下参数值
(2)分发capacity-scheduler.xml配置文件
(3)关闭正在运行的任务,重新启动yarn集群
数仓开发工具可选用DBeaver或者DataGrip。两者都需要用到JDBC协议连接到Hive,故需要启动HiveServer2。如果数仓计算引擎为Spark-sql,就不再启动HiveServer2,而启动Spark-sql中的thriftserver,该服务本质上也是Spark对HiveServer2的实现。
1. Hive on Spark配置
1)启动HiveServer2
2)配置DataGrip连接
① 创建连接:
② 配置连接属性:
所有属性配置,和Hive的beeline客户端配置一致即可。初次使用,配置过程会提示缺少JDBC驱动,按照提示下载即可。
③ 测试使用
创建数据库gmall,并观察是否创建成功。
创建数据库:
查看数据库:?
修改连接,指明连接数据库:?
选择当前数据库为gmall:?
3)数据准备
一般企业在搭建数仓时,业务系统中会存在一定的历史数据,此处为模拟真实场景,需准备若干历史数据。假定数仓上线的日期为2020-06-14,具体说明如下。?
1、用户行为日志
用户行为日志,一般是没有历史数据的,故日志只需要准备2020-06-14一天的数据。具体操作如下:
(1)启动日志采集通道,包括Flume、Kafak等
(2)修改两个日志服务器(hadoop102、hadoop103)中的/opt/module/applog/application.yml配置文件,将mock.date参数改为2020-06-14。
(3)执行日志生成脚本lg.sh。
(4)观察HDFS是否出现相应文件。
2、业务数据
业务数据一般存在历史数据,此处需准备2020-06-10至2020-06-14的数据。具体操作如下。
(1)修改hadoop102节点上的/opt/module/db_log/application.properties文件,将mock.date、mock.clear,mock.clear.user三个参数调整为如图所示的值。
(2)执行模拟生成业务数据的命令,生成第一天2020-06-10的历史数据。
(3)修改/opt/module/db_log/application.properties文件,将mock.date、mock.clear,mock.clear.user三个参数调整为如图所示的值。
(4)执行模拟生成业务数据的命令,生成第二天2020-06-11的历史数据。
(5)之后只修改/opt/module/db_log/application.properties文件中的mock.date参数,依次改为2020-06-12,2020-06-13,2020-06-14,并分别生成对应日期的数据。
(6)执行mysql_to_hdfs_init.sh脚本,将模拟生成的业务数据同步到HDFS。
(7)观察HDFS上是否出现相应的数据
2. Spark on Hive配置
1)启动thriftserver
2)配置DataGrip连接
① 创建连接:
② 配置连接属性
所有属性配置,和Hive的beeline客户端配置一致即可。初次使用,配置过程会提示缺少JDBC驱动,按照提示下载即可。
③ 测试使用
创建数据库gmall,并观察是否创建成功。?
(1)创建数据库
(2)查看数据库
(3)修改连接,指明连接数据库?
1、保持数据原貌不做任何修改,起到备份数据的作用。
2、数据采用Snappy压缩,减少磁盘存储空间。
3、创建分区表,防止后续的全表扫描,在企业开发中大量使用分区表。
4、创建外部表。在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。
1. ODS层(用户行为数据)
1)创建日志表ods_log
Hive On Spark配置:?
(1)创建支持snappy压缩的分区表?
(2)加载数据
注意:时间格式都配置成YYYY-MM-DD格式,这是Hive默认支持的时间格式。
Spark On Hive配置:
(1)创建支持lzo压缩的分区表
说明Hive的LZO压缩:http://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO
(2)加载数据
注意:时间格式都配置成YYYY-MM-DD格式,这是Hive默认支持的时间格式
(3)为lzo压缩文件创建索引
2)Shell中单引号和双引号区别
在/home/yyds/bin创建一个test.sh文件:
在文件中添加如下内容:
查看执行结果:
总结:
(1)单引号不取变量值
(2)双引号取变量值
(3)反引号`,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值
3)ODS层日志表加载数据脚本
编写脚本:
(1)在hadoop102的/home/yyds/bin目录下创建脚本
在脚本中编写如下内容:
(1)说明1:
[ -n 变量值?]?判断变量的值,是否为空
--?变量的值,非空,返回true
--?变量的值,为空,返回false
注意:[?-n 变量值 ]不会解析数据,使用[?-n 变量值?]时,需要对变量加上双引号(" ")
(2)说明2:
查看date命令的使用,date --help
(2)增加脚本执行权限
脚本使用:
(1)执行脚本
(2)查看导入数据
2.?ODS层(业务数据)
ODS业务表:
1)活动信息表?
2)活动规则表
3)编码字典表
4)评论表
5)订单明细表
6)订单表
7)支付表
3. ODS层业务表首日数据装载脚本
1)编写脚本
(1)在/home/yyds/bin目录下创建脚本hdfs_to_ods_db_init.sh
在脚本中填写如下内容:
(2)增加执行权限
脚本使用:
(1)执行脚本
(2)查看数据是否导入成功
4.?ODS层业务表每日数据装载脚本
编写脚本:
(1)在/home/yyds/bin目录下创建脚本hdfs_to_ods_db.sh
在脚本中填写如下内容:
(2)修改权限
脚本使用:
(1)执行脚本
(2)查看数据是否导入成功
1.?商品维度表(全量)
商品维度表分区:
建表语句:
数据装载:
1)首日装载?
2)每日装载
1.?拉链表概述
1)什么是拉链表
2)为什么要做拉链表?
3)如何使用拉链表?
4)拉链表形成过程?
2.?制作拉链表
建表语句:?
1)数据装载
首日装载
拉链表首日装载,需要进行初始化操作,具体工作为将截止到初始化当日的全部历史用户导入一次性导入到拉链表中。目前的ods_order_info表的第一个分区,即2020-06-14分区中就是全部的历史用户,故将该分区数据进行一定处理后导入拉链表的9999-99-99分区即可。
每日装载
(1)实现思路
sql编写:?
1、对用户行为数据解析。
2、对业务数据采用维度模型重新建模。
1. DWD层(用户行为日志)
DWD日志表:
1)日志格式回顾
(1)页面埋点日志
(2)启动日志?
2)get_json_object函数使用
数据:
取出第一个json对象:
结果是:{"name":"大郎","sex":"男","age":"25"}。
取出第一个json的age字段的值:
结果是:25
3)启动日志表
启动日志解析思路:启动日志表中每行数据对应一个启动记录,一个启动记录应该包含日志中的公共信息和启动信息。先将所有包含start字段的日志过滤出来,然后使用get_json_object函数解析每个字段。
建表语句:
数据导入:
查看数据:
4)页面日志表
页面日志解析思路:页面日志表中每行数据对应一个页面访问记录,一个页面访问记录应该包含日志中的公共信息和页面信息。先将所有包含page字段的日志过滤出来,然后使用get_json_object函数解析每个字段。
建表语句:?
数据导入:
查看数据:
5)动作日志表
动作日志解析思路:动作日志表中每行数据对应用户的一个动作记录,一个动作记录应当包含公共信息、页面信息以及动作信息。先将包含action字段的日志过滤出来,然后通过UDTF函数,将action数组炸开(类似于explode函数的效果),然后使用get_json_object函数解析每个字段。
建表语句:?
创建UDTF函数——设计思路:
创建UDTF函数——编写代码:
(1)创建一个maven工程:hivefunction
(2)创建包名:com.yyds.hive.udtf
(3)引入如下依赖
(4)编码
创建函数:
(1)打包
(2)将hivefunction-1.0-SNAPSHOT.jar上传到hadoop102的/opt/module,然后再将该jar包上传到HDFS的/user/hive/jars路径下:
(3)创建永久函数与开发好的java class关联
(4)注意:如果修改了自定义函数重新生成jar包怎么处理?只需要替换HDFS路径上的旧jar包,然后重启Hive客户端即可。
数据导入:
查看数据:
Apache?Superset是一个开源的、现代的、轻量级BI分析工具,能够对接多种数据源、拥有丰富的图标展示形式、支持自定义仪表盘,且拥有友好的用户界面,十分易用。
Superset应用场景
由于Superset能够对接常用的大数据分析工具,如Hive、Kylin、Druid等,且支持自定义仪表盘,故可作为数仓的可视化工具。
Superset官网地址:Welcome | Superset
1.?安装Python环境
Superset是由Python语言编写的Web应用,要求Python3.6的环境。
2.?安装Miniconda
conda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同Python版本的软件包及其依赖,并能够在不同的Python环境之间切换,Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等,Miniconda包括Conda、Python。
此处,我们不需要如此多的工具包,故选择MiniConda。
1)下载Miniconda(Python3版本)
下载地址:http://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
2)安装Miniconda
(1)执行以下命令进行安装,并按照提示操作,直到安装完成。
(2)在安装过程中,出现以下提示时,可以指定安装路径
?(3)出现以下字样,即为安装完成?
3)加载环境变量配置文件,使之生效?
4)取消激活base环境
Miniconda安装完成后,每次打开终端都会激活其默认的base环境,我们可通过以下命令,禁止激活默认base环境。
3.?创建Python3.7环境
1)配置conda国内镜像
2)创建Python3.7环境
说明:conda环境管理常用命令。
创建环境:conda create -n env_name
查看所有环境:conda info --envs
删除一个环境:conda remove -n env_name --all
3)激活superset环境
说明:退出当前环境。?
4.?Superset部署
1)安装依赖
安装Superset之前,需安装以下所需依赖:
2)安装Superset
1、安装(更新)setuptools和pip
说明:pip是python的包管理工具,可以和centos中的yum类比
2、安装Supetset
说明:-i的作用是指定镜像,这里选择国内镜像。
3、初始化Supetset数据库
4、创建管理员用户
说明:flask是一个python?web框架,Superset使用的就是flask。
5、Superset初始化
1. 安装gunicorn
说明:gunicorn是一个Python?Web?Server,可以和java中的TomCat类比
2. 启动Superset
(1)确保当前conda环境为superset
(2)启动
说明:
--workers:指定进程个数
--timeout:worker进程超时时间,超时会自动重启
--bind:绑定本机地址,即为Superset访问地址
--daemon:后台运行
(3)登录Superset
访问http://hadoop102:8787,使用创建的管理员账号进行登录。
3.?停止superset
停掉gunicorn进程:
退出superset环境:
1)创建superset.sh文件
内容如下:
2)加执行权限
3)测试
启动superset:
停止superset:
1.?安装依赖
说明:对接不同的数据源,需安装不同的依赖,以下地址为官网说明
Installing Database Drivers | Superset
2.?重启Superset
3.?数据源配置
1)Database配置
Step1:点击Data/Databases
Step2:点击+DATABASE?
Step3:点击填写Database及SQL Alchemy URI
注:SQL Alchemy URI编写规范:mysql://用户名:密码@主机名:端口号/数据库名称
此处填写:
mysql://root:123456@hadoop102:3306/gmall_report?charset=utf8
?
Step4:点击Test?Connection,出现Connection?looks?good!提示即表示连接成功?。
Step5:点击ADD?
2)Table配置
Step1:点击Data/Datasets
Step2:点击Data/ Datasets?
Step3:配置Table
1.?创建空白仪表盘
1)点击Dashboards/+DASHBOARDS
2)命名并保存?
2.?创建图表
1)点击Charts/+CHART
2)选则数据源及图表类型?
3)选择何使的图表类型?
4)创建图表?
5)按照说明配置图表?
6)点击Run?Query?
7)如配置无误,可出现以下图标?
8)命名该图表,并保存至仪表盘?
3.?编辑仪表盘
1)打开仪表盘,点击编辑按钮
2)调整图表大小以及图表盘布局?
3)点击下图中箭头,可调整仪表盘自动刷新时间?
1.?制作地图
1)配置Table
2)配置Chart?
?
2.?制作饼状图
1)配置Table
2)配置Chart?
?
Presto是一个开源的分布式SQL查询引擎,数据量支持GB到PB字节,主要用来处理秒级查询的场景。
注意∶虽然Presto可以解析SQL,但它不是一个标准的数据库。不是MySQL、Oracle的代替品,也不能用来处理在线事务(OLTP)。
Presto架构:
Presto优缺点:?
Presto、Impala性能比较:
Presto、Impala性能比较_TracyGao01的博客-CSDN博客_presto和impala
测试结论:Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Redis等。
1.?Presto?Server安装
0)官网地址
Presto | Distributed SQL Query Engine for Big Data
1)下载地址
http://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.196/presto-server-0.196.tar.gz
2)将presto-server-0.196.tar.gz导入hadoop102的/opt/software目录下,并解压到/opt/module目录
3)修改名称为presto
4)进入到/opt/module/presto目录,并创建存储数据文件夹
5)进入到/opt/module/presto目录,并创建存储配置文件文件夹
6)配置在/opt/module/presto/etc目录下添加jvm.config配置文件
添加如下内容:
7)Presto可以支持多个数据源,在Presto里面叫catalog,这里我们配置支持Hive的数据源,配置一个Hive的catalog
添加如下内容:
8)将hadoop102上的presto分发到hadoop103、hadoop104
9)分发之后,分别进入hadoop102、hadoop103、hadoop104三台主机的/opt/module/presto/etc的路径。配置node属性,node?id每个节点都不一样。
10)Presto是由一个coordinator节点和多个worker节点组成。在hadoop102上配置成coordinator,在hadoop103、hadoop104上配置为worker。
(1)hadoop102上配置coordinator节点
添加内容如下:
(2)hadoop103、hadoop104上配置worker节点
添加内容如下:
添加内容如下:
11)在hadoop102的/opt/module/hive目录下,启动Hive Metastore,用yyds角色
12)分别在hadoop102、hadoop103、hadoop104上启动Presto Server
(1)前台启动Presto,控制台显示日志
(2)后台启动Presto
13)日志查看路径/opt/module/presto/data/var/log
2.?Presto命令行Client安装
1)下载Presto的客户端
http://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.196/presto-cli-0.196-executable.jar
2)将presto-cli-0.196-executable.jar上传到hadoop102的/opt/module/presto文件夹下
3)修改文件名称
4)增加执行权限
5)启动prestocli
6)Presto命令行操作
Presto的命令行操作,相当于Hive命令行操作。每个表必须要加上schema。
例如:
3.?Presto可视化Client安装
1)将yanagishima-18.0.zip上传到hadoop102的/opt/module目录
2)解压缩yanagishima
3)进入到/opt/module/yanagishima-18.0/conf文件夹,编写yanagishima.properties配置
添加如下内容:
4)在/opt/module/yanagishima-18.0路径下启动yanagishima
5)启动web页面
http://hadoop102:7080
看到界面,进行查询了。
6)查看表结构
这里有个Tree View,可以查看所有表的结构,包括Schema、表、字段等。
比如执行select * from hive.dw_weather.tmp_news_click limit 10,这个句子里Hive这个词可以删掉,是上面配置的Catalog
每个表后面都有个复制键,点一下会复制完整的表名,然后再上面框里面输入sql语句,ctrl+enter键执行显示结果:?
1. 数据存储
1)合理设置分区
与Hive类似,Presto会根据元数据信息读取分区数据,合理的分区能减少Presto数据读取量,提升查询性能。
2)使用列式存储
Presto对ORC文件读取做了特定优化,因此在Hive中创建Presto使用的表时,建议采用ORC格式存储。相对于Parquet,Presto对ORC支持更好。
3)使用压缩
数据压缩可以减少节点间数据传输对IO带宽压力,对于即席查询需要快速解压,建议采用Snappy压缩。
2.?查询SQL
1)只选择使用的字段
由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段。
2)过滤条件必须加上分区字段
对于有分区的表,where语句中优先使用分区字段进行过滤。acct_day是分区字段,visit_time是具体访问时间。
3)Group By语句优化
合理安排Group by语句中字段顺序对性能有一定提升。将Group By语句中字段按照每个字段distinct数据多少进行降序排列。
4)Order by时使用Limit
Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力。
5)使用Join语句时将大表放在左边
Presto中join的默认算法是broadcast join,即将join左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。
3.?注意事项
1)字段名引用
避免和关键字冲突:MySQL对字段加反引号`、Presto对字段加双引号分割
当然,如果字段名称不是关键字,可以不加这个双引号。
2)时间函数
对于Timestamp,需要进行比较的时候,需要添加Timestamp关键字,而MySQL中对Timestamp可以直接进行比较。
3)不支持INSERT OVERWRITE语法
Presto中不支持insert overwrite语法,只能先delete,然后insert into。
4)PARQUET格式
Presto目前支持Parquet格式,支持查询,但不支持insert。
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。
Kylin架构:
1)REST Server
REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。另外可以通过Restful接口实现SQL查询。
2)查询引擎(Query Engine)
当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。?
3)路由器(Routing)
在最初设计时曾考虑过将Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭。
4)元数据管理工具(Metadata)
Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础。 Kylin的元数据存储在hbase中。?
5)任务引擎(Cube Build Engine)
这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。
Kylin特点:
Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。
1)标准SQL接口:Kylin是以标准的SQL作为对外服务的接口。
2)支持超大数据集:Kylin对于大数据的支撑能力可能是目前所有技术中最为领先的。早在2015年eBay的生产环境中就能支持百亿记录的秒级查询,之后在移动的应用场景中又有了千亿记录秒级查询的案例。
3)亚秒级响应:Kylin拥有优异的查询相应速度,这点得益于预计算,很多复杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需的计算量,提高了响应速度。
4)可伸缩性和高吞吐率:单节点Kylin可实现每秒70个查询,还可以搭建Kylin的集群。
5)BI工具集成
Kylin可以与现有的BI工具集成,具体包括如下内容。
ODBC:与Tableau、Excel、PowerBI等工具集成
JDBC:与Saiku、BIRT等Java工具集成
RestAPI:与JavaScript、Web网页集成
Kylin开发团队还贡献了Zepplin的插件,也可以使用Zepplin来访问Kylin服务。
1.?Kylin依赖环境
安装Kylin前需先部署好Hadoop、Hive、Zookeeper、HBase,并且需要在/etc/profile中配置以下环境变量HADOOP_HOME,HIVE_HOME,HBASE_HOME,记得source使其生效。
1)?HBase安装部署
1、?Zookeeper正常部署
首先保证Zookeeper集群的正常部署,并启动之:
2、Hadoop正常部署
Hadoop集群的正常部署并启动:
3、HBase的解压
解压Hbase到指定目录:
4、HBase的配置文件
修改HBase对应的配置文件。
hbase-env.sh修改内容:
hbase-site.xml修改内容:
regionservers:
?软连接hadoop配置文件到HBase:
5、HBase远程发送到其他集群
6、HBase服务的启动
启动方式:
提示:如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。
修复提示:
a、同步时间服务
请参看帮助文档:《尚硅谷大数据技术之Hadoop入门》
b、属性:hbase.master.maxclockskew设置更大的值
启动方式2:
对应的停止服务:
7、查看HBase页面
启动成功后,可以通过host:port的方式来访问HBase管理页面,例如:
http://hadoop102:16010
2)Kylin搭建
1、上传Kylin安装包apache-kylin-3.0.2-bin.tar.gz
2、解压apache-kylin-3.0.2-bin.tar.gz到/opt/module
3、Kylin兼容性问题
修改/opt/module/kylin/bin/find-spark-dependency.sh,排除冲突的jar包
需要增加的内容:! -name *jackson* ! -name *metastore*
注意前后保留空格:
4、Kylin启动
(1)启动Kylin之前,需先启动Hadoop(hdfs,yarn,jobhistoryserver)、Zookeeper、Hbase
(2)启动Kylin
启动之后查看各个节点进程:
在http://hadoop102:7070/kylin查看Web页面。
用户名为:ADMIN,密码为:KYLIN
3)关闭Kylin
以gmall数据仓库中的dwd_order_detail作为事实表,dim_user_info、dim_sku_info、dim_base_province作为维度表,构建星型模型,并演示如何使用Kylin进行OLAP分析。
1.?创建工程
1)点击下图中的"+"。
2)填写项目名称和描述信息,并点击Submit按钮提交。?
2. 获取数据源
1)点击DataSource
2)点击下图按钮导入Hive表?
3)选择以下表格,并点击Sync按钮?
注意事项:
Kylin不能处理Hive表中的复杂数据类型(Array,Map,Struct),即便复杂类型的字段并未参与到计算之中。故在加载Hive数据源时,不能直接加载带有复杂数据类型字段的表。而在dim_sku_info表中存在两个复杂数据类型的字段(平台属性和销售属性),故dim_sku_info不能直接加载,需对其进行以下处理。
(1)在hive客户端创建一个视图,如下。该视图已经将dim_sku_info表中的复杂数据类型的字段去掉,在后续的计算中,不再使用dim_sku_info,而使用dim_sku_info_view。
(2)在kylin中重新导入dim_sku_info_view视图
3.?创建model
1)点击Models,点击"+New"按钮,点击"★New?Model"按钮。
2)填写Model信息,点击Next?
3)指定事实表?
4)选择维度表,并指定事实表和维度表的关联条件,点击Ok
维度表添加完毕之后,点击Next。?
5)指定维度字段,并点击Next?
6)指定度量字段,并点击Next?
7)指定事实表分区字段(仅支持时间分区),点击Save按钮,model创建完毕?
4.?构建cube
1)点击new, 并点击new?cube
2)填写cube信息,选择cube所依赖的model,并点击next?
3)选择所需的维度,如下图所示?
4)选择所需度量值,如下图所示:?
5)cube自动合并设置,cube需按照日期分区字段每天进行构建,每次构建的结果会保存在Hbase中的一张表内,为提高查询效率,需将每日的cube进行合并,此处可设置合并周期。?
6)Kylin高级配置(优化相关,暂时跳过)?
7)Kylin相关属性配置覆盖?
8)Cube信息总览,点击Save,Cube创建完成?
9)构建Cube(计算),点击对应Cube的action按钮,选择build?
10)选择要构建的时间区间,点击Submit
11)点击Monitor查看构建进度?
5.?使用进阶
1)每日全量维度表及拉链维度表重复Key问题如何处理
按照上述流程,会发现,在cube构建流程中出现以下错误:
错误原因分析:
上述错误原因是model中的维度表dim_user_info为拉链表、dim_sku_info(dim_sku_info_view)为每日全量表,故使用整张表作为维度表,必然会出现订单明细表中同一个user_id或者sku_id对应多条数据的问题,针对上述问题,有以下解决方案。
在hive客户端为拉链表以及每日全量维度表创建视图,在创建视图时对数据加以过滤,保证从视图中查出的数据是一份全量最新的数据即可。
(1)创建维度表视图
(2)在DataSource中导入新创建的视图,之前的维度表,可选择性删除。
(3)重新创建model、cube。
2)如何实现每日自动构建cube
Kylin提供了Restful?API,因次我们可以将构建cube的命令写到脚本中,将脚本交给azkaban或者oozie这样的调度工具,以实现定时调度的功能。
脚本如下:
1.?维度和度量
维度:即观察数据的角度。比如员工数据,可以从性别角度来分析,也可以更加细化,从入职时间或者地区的维度来观察。维度是一组离散的值,比如说性别中的男和女,或者时间维度上的每一个独立的日期。因此在统计时可以将维度值相同的记录聚合在一起,然后应用聚合函数做累加、平均、最大和最小值等聚合计算。
度量:即被聚合(观察)的统计值,也就是聚合运算的结果。比如说员工数据中不同性别员工的人数,又或者说在同一年入职的员工有多少。
2.?Cube和Cuboid
有了维度跟度量,一个数据表或者数据模型上的所有字段就可以分类了,它们要么是维度,要么是度量(可以被聚合)。于是就有了根据维度和度量做预计算的Cube理论。
给定一个数据模型,我们可以对其上的所有维度进行聚合,对于N个维度来说,组合`的所有可能性共有2n种。对于每一种维度的组合,将度量值做聚合计算,然后将结果保存为一个物化视图,称为Cuboid。所有维度组合的Cuboid作为一个整体,称为Cube。
下面举一个简单的例子说明,假设有一个电商的销售数据集,其中维度包括时间[time]、商品[item]、地区[location]和供应商[supplier],度量为销售额。那么所有维度的组合就有24 =?16种,如下图所示:
一维度(1D)的组合有:[time]、[item]、[location]和[supplier]4种;
二维度(2D)的组合有:[time, item]、[time,?location]、[time,?supplier]、[item, location]、[item, supplier]、[location, supplier]3种;
三维度(3D)的组合也有4种;
最后还有零维度(0D)和四维度(4D)各有一种,总共16种。
注意:每一种维度组合就是一个Cuboid,16个Cuboid整体就是一个Cube。
3.?Cube构建算法
1)逐层构建算法(layer)
我们知道,一个N维的Cube,是由1个N维子立方体、N个(N-1)维子立方体、N*(N-1)/2个(N-2)维子立方体、......、N个1维子立方体和1个0维子立方体构成,总共有2^N个子立方体组成,在逐层算法中,按维度数逐层减少来计算,每个层级的计算(除了第一层,它是从原始数据聚合而来),是基于它上一层级的结果来计算的。比如,[Group by A, B]的结果,可以基于[Group by A, B, C]的结果,通过去掉C后聚合得来的;这样可以减少重复计算;当 0维度Cuboid计算出来的时候,整个Cube的计算也就完成了。
每一轮的计算都是一个MapReduce任务,且串行执行;一个N维的Cube,至少需要N次MapReduce Job。
?Cube逐层构建算法:
算法优点:
1)此算法充分利用了MapReduce的优点,处理了中间复杂的排序和shuffle工作,故而算法代码清晰简单,易于维护;
2)受益于Hadoop的日趋成熟,此算法非常稳定,即便是集群资源紧张时,也能保证最终能够完成。
算法缺点:
1)当Cube有比较多维度的时候,所需要的MapReduce任务也相应增加;由于Hadoop的任务调度需要耗费额外资源,特别是集群较庞大的时候,反复递交任务造成的额外开销会相当可观;
2)由于Mapper逻辑中并未进行聚合操作,所以每轮MR的shuffle工作量都很大,导致效率低下。
3)对HDFS的读写操作较多:由于每一层计算的输出会用做下一层计算的输入,这些Key-Value需要写到HDFS上;当所有计算都完成后,Kylin还需要额外的一轮任务将这些文件转成HBase的HFile格式,以导入到HBase中去;
总体而言,该算法的效率较低,尤其是当Cube维度数较大的时候。
2)快速构建算法(inmem)
也被称作逐段(By Segment) 或逐块(By Split) 算法,从1.5.x开始引入该算法,该算法的主要思想是,每个Mapper将其所分配到的数据块,计算成一个完整的小Cube 段(包含所有Cuboid)。每个Mapper将计算完的Cube段输出给Reducer做合并,生成大Cube,也就是最终结果。
如图所示解释了此流程:
与旧算法相比,快速算法主要有两点不同:
1) Mapper会利用内存做预聚合,算出所有组合;Mapper输出的每个Key都是不同的,这样会减少输出到Hadoop MapReduce的数据量,Combiner也不再需要;
2)一轮MapReduce便会完成所有层次的计算,减少Hadoop任务的调配。
4.?Cube存储原理
Kylin Cube存储原理:
1.?使用衍生维度(derived?dimension)
衍生维度用于在有效维度内将维度表上的非主键维度排除掉,并使用维度表的主键(其实是事实表上相应的外键)来替代它们。Kylin会在底层记录维度表主键与维度表其他维度之间的映射关系,以便在查询时能够动态地将维度表的主键翻译成这些非主键维度,并进行实时聚合。
衍生维度原理:
虽然衍生维度具有非常大的吸引力,但这也并不是说所有维度表上的维度都得变成衍生维度,如果从维度表主键到某个维度表维度所需要的聚合工作量非常大,则不建议使用衍生维度。?
2.?使用聚合组(Aggregation?group)
聚合组(Aggregation Group)是一种强大的剪枝工具。聚合组假设一个Cube的所有维度均可以根据业务需求划分成若干组(当然也可以是一个组),由于同一个组内的维度更可能同时被同一个查询用到,因此会表现出更加紧密的内在关联。每个分组的维度集合均是Cube所有维度的一个子集,不同的分组各自拥有一套维度集合,它们可能与其他分组有相同的维度,也可能没有相同的维度。每个分组各自独立地根据自身的规则贡献出一批需要被物化的Cuboid,所有分组贡献的Cuboid的并集就成为了当前Cube中所有需要物化的Cuboid的集合。不同的分组有可能会贡献出相同的Cuboid,构建引擎会察觉到这点,并且保证每一个Cuboid无论在多少个分组中出现,它都只会被物化一次。
对于每个分组内部的维度,用户可以使用如下三种可选的方式定义,它们之间的关系,具体如下。
1)强制维度(Mandatory),如果一个维度被定义为强制维度,那么这个分组产生的所有Cuboid中每一个Cuboid都会包含该维度。每个分组中都可以有0个、1个或多个强制维度。如果根据这个分组的业务逻辑,则相关的查询一定会在过滤条件或分组条件中,因此可以在该分组中把该维度设置为强制维度。
强制维度:
2)层级维度(Hierarchy),每个层级包含两个或更多个维度。假设一个层级中包含D1,D2…Dn这n个维度,那么在该分组产生的任何Cuboid中, 这n个维度只会以(),(D1),(D1,D2)…(D1,D2…Dn)这n+1种形式中的一种出现。每个分组中可以有0个、1个或多个层级,不同的层级之间不应当有共享的维度。如果根据这个分组的业务逻辑,则多个维度直接存在层级关系,因此可以在该分组中把这些维度设置为层级维度。?
层级维度:
3)联合维度(Joint),每个联合中包含两个或更多个维度,如果某些列形成一个联合,那么在该分组产生的任何Cuboid中,这些联合维度要么一起出现,要么都不出现。每个分组中可以有0个或多个联合,但是不同的联合之间不应当有共享的维度(否则它们可以合并成一个联合)。如果根据这个分组的业务逻辑,多个维度在查询中总是同时出现,则可以在该分组中把这些维度设置为联合维度。?
联合维度:
这些操作可以在Cube Designer的Advanced Setting中的Aggregation?Groups区域完成,如下图所示:?
聚合组的设计非常灵活,甚至可以用来描述一些极端的设计。假设我们的业务需求非常单一,只需要某些特定的Cuboid,那么可以创建多个聚合组,每个聚合组代表一个Cuboid。具体的方法是在聚合组中先包含某个Cuboid所需的所有维度,然后把这些维度都设置为强制维度。这样当前的聚合组就只能产生我们想要的那一个Cuboid了。
再比如,有的时候我们的Cube中有一些基数非常大的维度,如果不做特殊处理,它就会和其他的维度进行各种组合,从而产生一大堆包含它的Cuboid。包含高基数维度的Cuboid在行数和体积上往往非常庞大,这会导致整个Cube的膨胀率变大。如果根据业务需求知道这个高基数的维度只会与若干个维度(而不是所有维度)同时被查询到,那么就可以通过聚合组对这个高基数维度做一定的隔离。我们把这个高基数的维度放入一个单独的聚合组,再把所有可能会与这个高基数维度一起被查询到的其他维度也放进来。这样,这个高基数的维度就被隔离在一个聚合组中了,所有不会与它一起被查询到的维度都没有和它一起出现在任何一个分组中,因此也就不会有多余的Cuboid产生。这点也大大减少了包含该高基数维度的Cuboid的数量,可以有效地控制Cube的膨胀率。
3.?Row?Key优化
Kylin会把所有的维度按照顺序组合成一个完整的Rowkey,并且按照这个Rowkey升序排列Cuboid中所有的行。
设计良好的Rowkey将更有效地完成数据的查询过滤和定位,减少IO次数,提高查询速度,维度在rowkey中的次序,对查询性能有显著的影响。
Row key的设计原则如下:
1)被用作过滤的维度放在前边。
2)基数大的维度放在基数小的维度前边。?
4.?并发粒度优化
当Segment中某一个Cuboid的大小超出一定的阈值时,系统会将该Cuboid的数据分片到多个分区中,以实现Cuboid数据读取的并行化,从而优化Cube的查询速度。具体的实现方式如下:构建引擎根据Segment估计的大小,以及参数kylin.hbase.region.cut的设置决定Segment在存储引擎中总共需要几个分区来存储,如果存储引擎是HBase,那么分区的数量就对应于HBase中的Region数量。kylin.hbase.region.cut的默认值是5.0,单位是GB,也就是说对于一个大小估计是50GB的Segment,构建引擎会给它分配10个分区。用户还可以通过设置kylin.hbase.region.count.min(默认为1)和kylin.hbase.region.count.max(默认为500)两个配置来决定每个Segment最少或最多被划分成多少个分区。
由于每个Cube的并发粒度控制不尽相同,因此建议在Cube Designer 的Configuration Overwrites(上图所示)中为每个Cube量身定制控制并发粒度的参数。假设将把当前Cube的kylin.hbase.region.count.min设置为2,kylin.hbase.region.count.max设置为100。这样无论Segment的大小如何变化,它的分区数量最小都不会低于2,最大都不会超过100。相应地,这个Segment背后的存储引擎(HBase)为了存储这个Segment,也不会使用小于两个或超过100个的分区。我们还调整了默认的kylin.hbase.region.cut,这样50GB的Segment基本上会被分配到50个分区,相比默认设置,我们的Cuboid可能最多会获得5倍的并发量。?
可以与Kylin结合使用的可视化工具很多,例如:
ODBC:与Tableau、Excel、PowerBI等工具集成
JDBC:与Saiku、BIRT等Java工具集成
RestAPI:与JavaScript、Web网页集成
Kylin开发团队还贡献了Zepplin的插件,也可以使用Zepplin来访问Kylin服务。
1.?JDBC
1)新建项目并导入依赖
2)编码
3)结果展示
2.?Zepplin
1)Zepplin安装与启动
(1)将zeppelin-0.8.0-bin-all.tgz上传至Linux
(2)解压zeppelin-0.8.0-bin-all.tgz之/opt/module
(3)修改名称
(4)启动
可登录网页查看,web默认端口号为8080
http://hadoop102:8080
2)配置Zepplin支持Kylin
(1)点击右上角anonymous选择Interpreter
(2)搜索Kylin插件并修改相应的配置?
(3)修改完成点击Save完成?
3)案例实操
需求:查询员工详细信息,并使用各种图表进行展示
(1)点击Notebook创建新的note
(2)填写Note?Name点击Create?
(3)执行查询?
(4)结果展示?
(5)其他图表格式?
?
发表评论