1.需求

  对CDN的点击日志数据清洗

2.详细设计

  进行MR编程,对日志文件数据进行清洗,并将清洗后的数据加载到hive外部表

3.使用idea进行MR编程

  这里不进行详细的记录。项目源码链接如下:

  1. 链接:https://pan.baidu.com/s/1ABNMJTw7_w0U7duAHk0Bkg
  2. 提取码:q7uj
  3. 复制这段内容后打开百度网盘手机App,操作更方便哦

image.gif

4.本机测试

4.1直接运行main方法,若出现异常:

  1. Exception in thread "main" java.lang.NullPointerException
  2. at java.lang.ProcessBuilder.start(ProcessBuilder.java:1012)
  3. at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
  4. 解决方案:
  5. 1)、在https://github.com/4ttty/winutils 下载hadoop.dll和winutils.exe 文件。
  6. 2)、配置hadoop家目录:System.setProperty("hadoop.home.dir","D:\\appanzhuang\\cdh\\hadoop-2.6.0-cdh5.7.0");
  7. #注意d盘是我的hadoop实际的解压目录。
  8. 3)、把hadoop.dll拷贝到C:\Windows\System32下面
  9. 4)、把winutils.exe文件拷贝到${HADOOP_HOME}/bin目录下

image.gif
4.2再运行main方法,output目录有输出
   1.17 hadoop之基于某电商离线处理项目架构和实现二(ETL数据清洗) - 图3image.gif

  1. 这是我们想要的8个字段,源文件是有72个字段
  2. input的文件夹存放的是点击日志,链接如下:
  3. 链接:https://pan.baidu.com/s/15aHR5xdm_HKD8R6IgJrHJQ
  4. 提取码:mpkx
  5. 复制这段内容后打开百度网盘手机App,操作更方便哦

image.gif

5.服务器测试

5.1将代码打包并上传服务
  将设置hadoop环境变量的哪一行代码注释然后package打包。
   1.17 hadoop之基于某电商离线处理项目架构和实现二(ETL数据清洗) - 图6image.gif
5.2 服务器运行测试运行

  1. #将点击日志上传hadoop hdfs上
  2. hdfs dfs -mkdir -p /g6/hadoop/accesslog/20180717
  3. hdfs dfs -put hadoop-click-log.txt /g6/hadoop/accesslog/20180717
  4. #创建结果输出目录
  5. hdfs dfs -mkdir -p /g6/hadoop/access/output
  6. #运行jar包
  7. hadoop jar /home/hadoop/lib/g6-hadoop-1.0.jar \
  8. com.ruozedata.hadoop.mapreduce.driver.LogETLDriver \
  9. /g6/hadoop/accesslog/20180717 /g6/hadoop/access/output
  10. #查看结果
  11. hdfs dfs -text /g6/hadoop/access/output/part-r-00000

image.gif
5.3优化-.以shell脚本方式运行jar包提交命令

  1. vim g6-train-hadoop.sh #新建一个脚本文件,编辑添加如下内容
  2. process_date=20190331
  3. echo "step1 mr etl"
  4. hadoop jar /home/hadoop/lib/g6-hadoop-1.0.jar com.ruozedata.hadoop.mapreduce.driver.LogETLDriver /g6/hadoop/accesslog/20180717 /g6/hadoop/access/output/$process_date
  5. chmod u+x g6-train-hadoop.sh #添加可执行的权限
  6. . g6-train-hadoop.sh #执行脚本

image.gif

6.使用hive完成最基本的统计分析

6.1创建一张清洗后的hive表

  1. hive #进入hive命令行
  2. show databases;
  3. use hive;
  4. #创建一张清洗后的表
  5. create external table g6_access (
  6. cdn string,
  7. region string,
  8. level string,
  9. time string,
  10. ip string,
  11. domain string,
  12. url string,
  13. traffic bigint
  14. ) partitioned by (day string)
  15. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  16. LOCATION '/g6/hadoop/access/clear' ;

image.gif
6.2移动数据到hive的外部表对应的目录

  1. hdfs dfs -mkdir -p /g6/hadoop/access/clear/day=20180717
  2. hdfs dfs -mv /g6/hadoop/access/output/20190331/part-r-00000 /g6/hadoop/access/clear/day=20180717
  3. hdfs dfs -ls /g6/hadoop/access/clear/day=20180717

image.gif
6.3添加分区信息并查询

  1. alter table g6_access add if not exists partition(day='20180717');
  2. select * from g6_access limit 10;

image.gif
6.4统计分析
  select domain,sum(traffic) from g6_access group by domain;
6.5优化以shell脚本方式完成数据清洗以及挂载到hive表
  vim g6-train-hadoop.sh #新建一个脚本文件,编辑添加如下内容

  1. #!/bin/bash
  2. if [ $# != 1 ] ; then
  3. echo "USAGE: g6-train-hadoop.sh <dateString>"
  4. echo " e.g.: g6-train-hadoop.sh 20190402"
  5. exit 1;
  6. fi
  7. process_date=$1
  8. echo "================step1: mapreduce etl==============="
  9. hadoop jar /home/hadoop/lib/g6-hadoop-1.0.jar com.ruozedata.hadoop.mapreduce.driver.LogETLDriver /g6/hadoop/accesslog/20180717 /g6/hadoop/access/output/day=$process_date
  10. echo "================step2: create extral table if not exit================"
  11. hive -e "use hive;
  12. create external table if not exists g6_access (
  13. cdn string,
  14. region string,
  15. level string,
  16. time string,
  17. ip string,
  18. domain string,
  19. url string,
  20. traffic bigint
  21. ) partitioned by (day string)
  22. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  23. LOCATION '/g6/hadoop/access/clear' ;"
  24. echo "================step3: etl data mv to DW================"
  25. hdfs dfs -rm -r /g6/hadoop/access/clear/day=$process_date
  26. hdfs dfs -mkdir -p /g6/hadoop/access/clear/day=$process_date
  27. hdfs dfs -mv /g6/hadoop/access/output/day=$process_date/* /g6/hadoop/access/clear/day=$process_date
  28. echo "================step4: alter partition================"
  29. hive -e "use hive;
  30. alter table g6_access add if not exists partition(day='${process_date}');"

image.gif
sh -x g6-train-hadoop.sh 20190405 #以debug方式运行脚本