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

基本介绍

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

常用名词

折叠代码块YAML 复制代码
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: 累加器

项目设计流程

Created with Raphaël 2.2.0需求分析方案设计数据实现编码实现功能测试性能调优

使用java的原因

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

CDH

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

hive

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

其他配置与安装

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

hadoop

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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操作

slave1mysql进行hive相关数据创建

折叠代码块SQL 复制代码
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测试

折叠代码块SQL 复制代码
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

折叠代码块BASH 复制代码
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

折叠代码块BASH 复制代码
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

相关启动

折叠代码块BASH 复制代码
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

测试

折叠代码块BASH 复制代码
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接收请求,后端接入tomcatJetty集群,来进行高并发下的负载均衡
后台数据请求可以作为log日志存储起来

日志文件

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

日志转移工具

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

flume

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

HDFS

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

Hadoop的数据清洗

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

Hive

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

Spark

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

 评论
来发评论吧~
Powered By Valine
v1.5.2