电商用户行为分析大数据平台之环境搭建
Easul Lv6

基本介绍

通过统计用户行为产生的数据,辅助PM(Project Manager),数据分析师或市场管理人员来分析产品,加以改进

常用名词

1
2
3
4
5
6
7
8
troubleshooting: 线上故障的排查与解决
PM: Project Manager(项目经理)
VV: Video Views(播放数)
PV: Page Views(页面浏览量)
UV: Unique Visitors(独立访客数)
CV: Content Views(内容展现数)
ETL: Extract-Transform-Load(数据仓库技术)
Accumulator: 累加器

项目设计流程

使用java的原因

java有大量的生态体系,大部分的项目都有java的api,直接套入很方便。且人员切换时,java更具有通用性。
用其他语言如scala,python,可能不是很通用。不整合大量组件的时候,只写一些小功能是可以的。

CDH

CDH是Cloudera公司发布的Hadoop版本,相当于企业级Hadoop,现在收费了

hive

hive基于hadoop的存储(HDFS)和计算(MapReduce)提供了数据仓库的功能
hive可以在hadoop建表(可以有索引,视图等东西),并可以对这些表进行SQL的统计分析
写的SQL语句,hive会在底层翻译成hadoop的MapReduce

其他配置与安装

这里需要安装java,hadoop,hive,mysql(作为hive的源数据和存储spark的数据),zookeeper(用于分布式组件的组织),kafka(用于获取实时消息),scala,spark,flume
原本的配置参考这里

hadoop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 需要每个结点都配置
# 资源调度相关配置
vi ~/software/hadoop-2.7.4/etc/hadoop/yarn-site.xml

<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

# 修改启动后,上传一个文件到hdfs
hdfs dfs -put test.txt /
# 访问hdfs:master:50070
# Utilities->Browse the file system
# 可以看到刚刚上传的文件
# 点击文件,可以查看这个文件在从机也是可以用的
# 访问http://master:8088/cluster/scheduler?openQueues=Queue:%20default
# 可以看到可用资源的一些信息

hive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 在master操作
cd ~/software
wget http://archive.apache.org/dist/hive/hive-2.3.6/apache-hive-2.3.6-bin.tar.gz
tar -zxvf apache-hive-2.3.6-bin.tar.gz
rm -rf apache-hive-2.3.6-bin.tar.gz
echo "
HIVE_HOME=/home/easul/software/apache-hive-2.3.6-bin
PATH=\$HIVE_HOME/bin:\$PATH
export PATH
" >> ~/.bash_profile
source ~/.bash_profile

# 原本slave1的mariaDB是10.1,对应mysql5.6或5.7
# 所以可以下mysql-connector-java-5.1.47.jar
# 用于hive连接mysql
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.41/mysql-connector-java-5.1.41.jar -P ~/software/apache-hive-2.3.6-bin/lib

配置hive-log4j2.properties

1
2
3
4
5
6
7
8
cp ~/software/apache-hive-2.3.6-bin/conf/hive-log4j2.properties.template ~/software/apache-hive-2.3.6-bin/conf/hive-log4j2.properties
vi ~/software/apache-hive-2.3.6-bin/conf/hive-log4j2.properties

# 配置log目录
property.hive.log.dir=/home/easul/software/hadoop-data/hive/logs

# 创建目录
mkdir -p /home/easul/software/hadoop-data/hive/logs

配置hive-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
cp ~/software/apache-hive-2.3.6-bin/conf/hive-default.xml.template ~/software/apache-hive-2.3.6-bin/conf/hive-site.xml
vi ~/software/apache-hive-2.3.6-bin/conf/hive-site.xml

<!--修改javax.jdo.option.ConnectionURL的值为jdbc-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://slave1:3306/hive_metadata?createDatabaseIfNotExist=true</value>
</property>
<!--修改javax.jdo.option.ConnectionDriverName的值为jdbc驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--修改javax.jdo.option.ConnectionUserName-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!--修改javax.jdo.option.ConnectionPassword-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!--设置hive在hdfs的表目录-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/home/easul/software/hadoop-data/hive/warehouse</value>
</property>
<!--修改验证为false,否则hive --service metastore &会有Caused by: MetaException...,可看下边的 hive本地模式开启不成功-->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!--修改验证为true,否则hive --service metastore &会有Hive--MetaException...,可看下边的参考连接-->
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<!--修改${system:java.io.tmpdir}为自定义目录,修改${system:user.name}为结点名master-->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/easul/software/hadoop-data/hive/tmp/master</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/home/easul/software/hadoop-data/hive/tmp/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/easul/software/hadoop-data/hive/tmp/master</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/home/easul/software/hadoop-data/hive/tmp/master/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>

# 用于hive无法创建表,报下边的错
# Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
hive --service metastore &

# 创建目录
mkdir -p /home/easul/software/hadoop-data/hive/warehouse
mkdir -p /home/easul/software/hadoop-data/hive/tmp
mkdir -p /home/easul/software/hadoop-data/hive/tmp/master

hive环境配置
Relative path in absolute URI
Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
hive本地模式开启不成功
Hive–MetaException(message:Required table missing

配置hive-env.sh

1
cp ~/software/apache-hive-2.3.6-bin/conf/hive-env.sh.template ~/software/apache-hive-2.3.6-bin/conf/hive-env.sh

配置hive-config.sh

1
2
3
4
5
6
vi ~/software/apache-hive-2.3.6-bin/bin/hive-config.sh

# 添加如下环境变量
export JAVA_HOME=/home/easul/software/java-se-8u41-ri
export HADOOP_HOME=/home/easul/software/hadoop-2.7.4
export HIVE_HOME=/home/easul/software/apache-hive-2.3.6-bin

mysql操作

在slave1的mysql进行hive相关数据创建

1
2
3
4
5
6
7
8
9
-- 创建数据库
create database if not exists hive_metadata;
-- 授予数据库权限给用户hive,密码为hive
grant all privileges on hive_metadata.* to 'hive'@'%' identified by 'hive' with grant option;
grant all privileges on hive_metadata.* to 'hive'@'localhost' identified by 'hive' with grant option;
grant all privileges on hive_metadata.* to 'hive'@'master' identified by 'hive' with grant option;
-- 刷新权限
flush privileges;
use hive_metadata;

hive测试

1
2
3
4
5
6
7
8
9
10
11
-- 命令行输入hive
-- 创建一张表,同时指定表的分隔符为空格,别的分隔符无法导入数据
create table users(id int, name string) row format delimited fields terminated by ' ';
-- 从外部导入数据,txt文件的数据用空格分割
load data local inpath '/home/easul/test.txt' into table users;
-- 查询数据
select * from users;
-- 不是全表查询会启动MapReduce
select name from users;
-- 删除表
drop table users;

kafka

1
2
3
# 每个结点都操作
# 下载所需的jar包
wget https://repo1.maven.org/maven2/org/slf4j/slf4j-nop/1.7.21/slf4j-nop-1.7.21.jar -P ~/software/kafka_2.11-0.10.1.0/libs

flume

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 我的flume在slave1
# 修改一些配置
vi ~/software/apache-flume-1.7.0-bin/conf/log_collection.properties

a1.sources = source1
a1.channels = channel1
a1.sinks = sink1

a1.sources.source1.type = TAILDIR
# 给文件定义一个组
a1.sources.source1.filegroups = f1
# 监控的日志路径
a1.sources.source1.filegroups.f1=/home/easul/software/hadoop-data/testlog/.*.log
# 关闭文件头
a1.sources.source1.fileHeader = flase
# 配置拦截器
a1.sources.source1.interceptors = i1
a1.sources.source1.interceptors.i1.type = timestamp
# =============================================================================
# 数据放到hdfs
a1.sinks.sink1.type = hdfs
# 设置放到的hdfs路径
a1.sinks.sink1.hdfs.path = hdfs://master:8020/logs
a1.sinks.sink1.hdfs.fileType = DataStream
a1.sinks.sink1.hdfs.writeFormat = TEXT
a1.sinks.sink1.hdfs.rollInterval = 1
a1.sinks.sink1.hdfs.filePrefix=%Y-%m-%d
# =============================================================================
# 设置是基于内存还是基于文件缓冲,基于文件安全性更高,内存断电就没有了。并且数据量过多,可以先缓存到文件
a1.channels.channel1.type = file
# 设置缓冲文件的检查点
a1.channels.channel1.checkpointDir=/home/easul/software/hadoop-data/flume_data/checkpoint
# 设置缓冲文件的数据目录
a1.channels.channel1.dataDirs= /home/easul/software/hadoop-data/flume_data/data
# =============================================================================
# 组件间的绑定
a1.sources.source1.channels = channel1
a1.sinks.sink1.channel = channel1

# 在slave1创建所需日志文件夹
mkdir -p /home/easul/software/hadoop-data/testlog/
# 在master创建hdfs文件夹
hdfs dfs -mkdir /logs

相关启动

1
2
3
4
5
6
7
8
9
# master
start-dfs.sh
start-yarn.sh
# 每个结点
zkServer.sh start
kafka-server-start.sh -daemon /home/easul/software/kafka_2.11-0.10.1.0/config/server.properties
# slave1,没问题可以启动守护进程
# --name后边指定的是配置文件中agent的名称a1,不要写错
flume-ng agent --conf-file /home/easul/software/apache-flume-1.7.0-bin/conf/log_collection.properties --name a1 -Dflume.root.logger=WARN, console

测试

1
2
3
4
5
6
7
8
9
10
11
12
# salve1
echo "1
2
3
4
5" > ~/test.txt
cp ~/test.txt /home/easul/software/hadoop-data/testlog/
# master
# 有文件即传输成功
hdfs dfs -ls /logs
# 查看文件内容
hdfs dfs -text /logs/xxx

离线日志采集流程

数据来源

网站,app,日志,电话,短信等等,这些数据会请求后台服务器

后台服务器

数据量少可以用tomcat,Jetty
数据量过万,就需要用Nginx接收请求,后端接入tomcat或Jetty集群,来进行高并发下的负载均衡
后台数据请求可以作为log日志存储起来

日志文件

通常有预定格式,且至少每天一份
如果有多个web服务器,则日志文件就会有多份

日志转移工具

使用crontab,python脚本,java的quartz等定时调度工具转移这些日志到flume agent监控的目录中

flume

启动后可以用于监控某个目录是否有新日志产生
有新文件,就可以先将数据缓存到channel,然后通过sink发送给某个地方(HDFS,kafka等)

HDFS

HDFS(Hadoop Distributed File System)最后存储每天的log数据
用Hadoop存储是因为它可以存储大量数据
如果每天1T数据,时间长了,一个服务器就放不下了,所以需要存储到Hadoop大数据分布式存储系统中

Hadoop的数据清洗

Hadoop HDFS中原始的日志数据,会经过数据清洗,是因为数据中有很多不符合预期的数据,需要过滤掉
清洗常用MapReduce,自己开发MR作业
然后用crontab,Oozie或自研工具定时调度作业(MR作业或Hive作业)
然后再在HDFS另一个文件存储清洗过的日志文件

Hive

HDFS清洗后的数据可以导入Hive的某个表中
可以使用动态分区,Hive使用分区表,每个分区放一天的数据
Hive,底层基于HDFS,可以作为大数据的数据仓库
数据仓库可能需要ETL的建模,ETL会将原始日志所在的一个表,转换成几十,上百张表,形成数据仓库
然后公司统计分析人员就可以用数据仓库中的表,执行临时或每天定时的Hive SQL ETL作业,进行大数据的统计分析

Spark

Spark通常会针对Hive中的数据进行开发,也即将Hive中的某些表作为数据来源
Spark,Hadoop,Storm都可能使用Hive中数据仓库的表

 评论