# bigdata-charpter1 **Repository Path**: java_small_ant/bigdata-charpter1 ## Basic Information - **Project Name**: bigdata-charpter1 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-06 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 作业说明 ### 1. 基于Zookeeper实现简易版配置中心要求实现以下功能 1. 创建一个Web项目,将数据库连接信息交给Zookeeper配置中心管理,即:当项目Web项目启动时,从Zookeeper进行MySQL配置参数的拉取 2. 要求项目通过数据库连接池访问MySQL(连接池可以自由选择熟悉的) 3. 当Zookeeper配置信息变化后Web项目自动感知,正确释放之前连接池,创建新的连接池 #### 查看效果 运行 DemoApplication #### 创建zk中的配置 ```bash create /jdbc {"url":"jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false","password":"","name":"root"} ``` #### 修改zk中的配置 ```bash set /jdbc {"url":"jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false","password":"","name":"root"} ``` #### 删除ZK配置 ```bash delete /jdbc ``` ### 二:Hbase作业 在社交网站,社交APP上会存储有大量的用户数据以及用户之间的关系数据,比如A用户的好友列表会展示出他所有的好友,现有一张Hbase表,存储就是当前注册用户的好友关系数据,如下 #### 需求 1. 使用Hbase相关API创建一张结构如上的表 2. 删除好友操作实现(好友关系双向,一方删除好友,另一方也会被迫删除好友) 例如:uid1用户执行删除uid2这个好友,则uid2的好友列表中也必须删除uid1 #### 个人分析 1.创建如图所示的表 ```bash # 查看创建表之后的数据 scan relations ``` 2.当uid1用户执行删除uid2这个好友,则uid2的好友列表中也必须删除uid1,可以使用协处理器来完成。 ```bash # 做删除操作 delete 'relations','user1','friends:user2' # 查看操作之后的结果 scan relations ``` 3. 通过java生成一个对象继承协处理器BaseRegionObserver,重写postDelete。 #### 打包部署验证步骤 ``` hdfs dfs -put relationship.jar hdfs dfs -put relationship.jar /processor alter 'relations',METHOD =>'table_att','Coprocessor'=>'hdfs://linux121:9000/processor/relationship.jar|com.lagou.hbase.RelationShipProcessor|1001|' ``` ### 三、Azkaban 现有用户点击行为数据文件,每天产生会上传到hdfs目录,按天区分目录,现在我们需要每天凌晨两点定时导入Hive表指定分区中,并统计出今日活跃用户数插入指标表中。 日志文件 clicklog userId click_time index uid1 2020-06-21 12:10:10 a.html uid2 2020-06-21 12:15:10 b.html uid1 2020-06-21 13:10:10 c.html uid1 2020-06-21 15:10:10 d.html uid2 2020-06-21 18:10:10 e.html 用户点击行为数据,三个字段是用户id,点击时间,访问页面 hdfs目录会以日期划分文件,例如: /user_clicks/20200621/clicklog.dat /user_clicks/20200622/clicklog.dat /user_clicks/20200623/clicklog.dat ... Hive表 原始数据分区表 create table user_clicks(id string,click_time string ,index string) partitioned by(dt string) row format delimited fields terminated by '\t' ; 需要开发一个import.job每日从hdfs对应日期目录下同步数据到该表指定分区。(日期格式同上或者自定义) 指标表 create table user_info(active_num string,dateStr string) row format delimited fields terminated by '\t'; 需要开发一个analysis.job依赖import.job执行,统计出每日活跃用户(一个用户出现多次算作一次)数并插入user_inof表中。 作业: 开发以上提到的两个job,job文件内容和sql内容需分开展示,并能使用azkaban调度执行。 #### 实现思路 1.启动hdfs、yarn集群,启动hive元数据服务,启动azkaban ```bash start-dfs.sh # 启动dfs集群 start-yarn.sh # 启动yarn集群 hive --service metastore & # 启动hive元数据 hive # 进入hive命令行窗口 # 启动 azkaban cd /opt/lagou/servers/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT bin/start-solo.sh ``` 2.准备数据并上传到hdfs上 mkdir -p /home/hadoop/azkaban vi clicklog.dat uid1 2020-04-01 12:10:10 a.html uid2 2020-04-01 12:15:10 b.html uid1 2020-04-01 13:10:10 c.html uid1 2020-04-01 15:10:10 d.html uid2 2020-04-01 18:10:10 e.html # 上传到hdfs上 hadoop fs -mkdir -p /user_clicks/20210401 hadoop fs -put clicklog.dat /user_clicks/20210401 hadoop fs -cat /user_clicks/20210401/clicklog.dat 3.Hive中创建两张表 原始数据分区表user_clicks ```hiveql create table user_clicks(id string,click_time string ,index string) partitioned by(dt string) row format delimited fields terminated by '\t'; ``` 指标表user_info ```hiveql create table user_info(active_num string,datestr string) row format delimited fields terminated by '\t'; ``` 4.在 任务 节点上编写如下四个文件: 编写import.job ```bash type=command command=sh /root/import.sh ``` 4.1 编写/root/import.sh:hive从HDFS导入数据到表的shell脚本 ```bash #!/bin/sh ## 每天的日志存储的目录名称,根据日期获取 yesterday=`date -d last-day +%Y%m%d` ## HIVE_HOME HIVE_HOME=/opt/lagou/servers/hive-2.3.7 ## 源日志文件 LOG_FILE=/user_clicks/$yesterday/clicklog.dat ## hive执行.sql脚本 ${HIVE_HOME}/bin/hive --hiveconf LOAD_FILE_PARAM=${LOG_FILE} --hiveconf yesterday=${yesterday} -f /root/import.sql ``` 4.2 编写/root/import.sql:将HDFS上的日志导入到hive表的sql脚本 ```sql LOAD DATA INPATH '${hiveconf:LOAD_FILE_PARAM}' OVERWRITE INTO TABLE default.user_clicks PARTITION(dt='${hiveconf:yesterday}'); ``` 4.3 编写analysis.job ```bash type=command dependencies=import command=sh /root/analysis.sh ``` 4.3.1 编写/root/analysis.sh ```bash #!/bin/bash ## 每天的日志存储的目录名称,根据日期获取 yesterday=`date -d last-day +%Y%m%d` echo "昨天时间:'$yesterday'" ## HIVE_HOME HIVE_HOME=/opt/lagou/servers/hive-2.3.7 ## hive执行.sql脚本 ${HIVE_HOME}/bin/hive --hiveconf yesterday=${yesterday} -f /root/analysis.sql ``` 4.3.2 编写analysis.sql ```sql insert into table default.user_info(active_num, datestr) (select id, dt from user_clicks where dt='${hiveconf:yesterday}' group by dt, id); ``` 5 将import.job 和 analysis.job两个文件本地打包,上传到azkaban调度中心执行,具体执行结果见图: src/main/resources/result_images/azkaban执行结果.pnggit init