1.日志采集
生产日志:
(1)安装nginx
sudo apt-get install nginx
(2)上传shop.html文件到/var/www/html目录
(3)浏览器访问
http://master/shop.html
网页每隔几秒刷新一次,就会产生一条访问日志
(4)监控nginx生成的访问日志
sudo tail -F /var/log/nginx/access.log
采集日志:用flume
(1)创建/home/hadoop/web_log目录
mkdir /home/hadoop/web_log
(2)进入/home/hadoop/web_log目录
cd /home/hadoop/web_log
(3)创建nginx_memory_hdfs.properties文件,填写以下内容:
# agent 起个名字叫做 a1
# 设置 a1 的 sources 叫做 r1
a1.sources = r1
# 设置 a1 的 sinks 叫做 k1
a1.sinks = k1
# 设置 a1 的 channels 叫做 c1
a1.channels = c1
# 设置 r1 的类型是 exec,用于采集命令产生的数据
a1.sources.r1.type = exec
# 设置 r1 采集 tail -F 命令产生的数据
a1.sources.r1.command = tail -F /var/log/nginx/access.log
# 设置 c1 的类型是 memory
a1.channels.c1.type = memory
# 设置 c1 的缓冲区容量
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 设置 k1 的类型是 hdfs
a1.sinks.k1.type = hdfs
# 设置 k1 输出路径,按照时间在 hdfs 上创建相应的目录
a1.sinks.k1.hdfs.path = /web_log/%y-%m-%d/%H
a1.sinks.k1.hdfs.filePrefix = events-
# 设置 k1 输出的数据保存为文本
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
# 把时间戳放入数据的头中
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 设置 r1 连接 c1
a1.sources.r1.channels = c1
# 设置 k1 连接 c1
a1.sinks.k1.channel = c1
(4)使用nginx_memory_hdfs.properties文件启动Flume
flume-ng agent -n a1 -c conf -f /home/hadoop/web_log/nginx_memory_hdfs.properties
(5)去HDFS检查日志数据是否采集到/web/log目录
2.ETL
(1)清洗数据:
hadoop jar /home/hadoop/web_log/NginxEtl.jar 2020-06-17 18
注:是自己HDFS上的日期 2020-06-17 18
生成的数据保存在hdfs上的/web_log/2020-06-17/18目录中。
编写web_log_etl.sh脚本
#!/bin/bash
hadoop -jar /home/hadoop/web_log/NginxEtl.jar $1 $2
给脚本可执行的权限
chmod 777 web_log_etl.sh
运行此脚本
/home/hadoop/web_log/web_log_etl.sh 2020-06-17 18
3.搭建数据仓库
编写web_log_import.sh 脚本
给脚本可执行的权限
chmod 777 web_log_etl.sh
#!/bin/bash
HQL="
CREATE DATABASE IF NOT EXISTS web_log;
USE web_log;
CREATE TABLE IF NOT EXISTS ods_web_log(
path string
)
PARTITIONED BY (day string, hour string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
LOAD DATA INPATH '/web_log/etl/$1/$2' INTO TABLE ods_web_log PARTITION(day='$1', hour='$2');
"
hive -e "$HQL"
在web_log目录下下
./web_log_import.sh 21-12-08 09
21-12-08 09自己HDFS上的日期
编写web_log_analysis.sh脚本
给脚本可执行的权限
chmod 777 web_log_etl.sh
#!/bin/bash
HQL="
USE web_log;
DROP TABLE IF EXISTS dwd_web_log;
CREATE TABLE dwd_web_log AS
SELECT path, day, hour
FROM ods_web_log
WHERE day='$1' AND hour='$2';
DELETE jar /home/hadoop/web_log/UDFGetShop.jar;
ADD jar /home/hadoop/web_log/UDFGetShop.jar;
CREATE TEMPORARY FUNCTION GET_SHOP as 'com.dzqc.udf.GetSHOP';
DROP TABLE IF EXISTS dws_web_log;
CREATE TABLE dws_web_log AS
SELECT GET_SHOP(path) shop, day, hour
FROM dwd_web_log;
DROP TABLE IF EXISTS ads_web_log;
CREATE TABLE ads_web_log AS
SELECT shop
, COUNT(*) count
, day
, hour
, DENSE_RANK() OVER(ORDER BY COUNT(*) DESC) rank
FROM dws_web_log
GROUP BY shop,day,hour;
"
hive -e "$HQL"
./web_log_import.sh 21-12-08 09
21-12-08 09自己HDFS上的日期
拉这个jar包
在dbeaver上运行
运行
SELECT * FROM web_log.ods_web_log;
SELECT * FROM web_log.dwd_web_log;
结果
运行
SELECT * FROM web_log.dws_web_log;
结果
运行
SELECT * FROM web_log.ads_web_log;
结果
5.保存结果
导出Hive数据到MySQL需要我们先做以下几个准备操作:
(1)查看MySQL管理员的账户和密码
sudo cat /etc/mysql/debian.cnf
(2)使用管理员账户和密码登录MySQL
mysql -u debian-sys-maint -p
(3)创建web_log数据库,用来存相关的表
CREATE DATABASE IF NOT EXISTS web_log;
(4)创建web_log用户,设置密码为123456
CREATE USER ‘web_log’@’%’ IDENTIFIED BY ‘123456’;
(5)授予web_log用户操纵web_log数据库的权限
GRANT ALL PRIVILEGES ON web_log. * TO ‘web_log’@’%’;
FLUSH PRIVILEGES;
(6)退出MySQL使用web_log用户登录,并使用web_log数据库;
mysql -u web_log -p123456
(7)创建shop_count_rank表,存储hive导出的数据
CREATE TABLE shop_count_rank (
shop varchar(10) NOT NULL,
count int,
day char(10) NOT NULL,
hour char(2) NOT NULL,
PRIMARY KEY(shop, day, hour)
);
编写web_log_export.sh脚本
**#!/bin/bash
sqoop export
--connect jdbc:mysql://localhost:3306/web_log
--username web_log
--password 123456
--table shop_count_rank
--export-dir /user/hive/warehouse/web_log.db/ads_web_log
--input-fields-terminated-by "\001"
-m 1**
增量导出hive数据到mysql
sqoop export
–connect jdbc:mysql://localhost:3306/web_log
–username web_log
–password 123456
–table shop_count_rank
–export-dir /user/hive/warehouse/web_log.db/ads_web_log
–input-fields-terminated-by “\001”
-m 1
在MYSQL上查看
(1)先进入mysql
mysql -u web_log -p123456
(2)切换到web_log
use web_log;
(3)查看表
show tables;
(4)查询表中的内容
select * from shop_count_rank;