使用Hadoop完成对电商日志的分析-2

使用Hadoop完成对电商日志的分析-2

一、项目要求

根据电商日志文件进行以下分析:

  1. 统计页面浏览量(每行记录就是一次浏览)。
  2. 统计各个省份的浏览量(需要解析IP)。
  3. 日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)。

ETL目标: 解析出有价值的字段,包括:ip、url、pageId(topicId对应的页面Id)、country、province、city。

二、技术背景

1. Hadoop概述

Hadoop是一个开源的分布式计算平台,能够对大量数据进行高效的存储和处理。它的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce计算模型。

2. ETL流程

ETL过程分为三个步骤:

  • 抽取(Extract): 从原始数据源中提取数据。
  • 转换(Transform): 对提取的数据进行清洗、过滤、转换。
  • 加载(Load): 将转换后的数据加载到目标数据存储中。

三、数据准备

日志文件格式

假设我们的电商日志文件格式如下:

timestamp | ip | url | topicId | country | province | city

示例日志记录:

2023-06-18 12:34:56 | 123.45.67.89 | /product/123 | 456 | China | Guangdong | Shenzhen

四、实现步骤

1. 环境准备

确保Hadoop集群已经搭建完成,并且HDFS和MapReduce服务正常运行。我们将使用Hadoop的MapReduce编写数据处理程序。

2. 数据上传至HDFS

将本地日志文件上传到HDFS中的指定目录。

hadoop fs -put /path/to/local/logfile /path/to/hdfs/logs/

3. 编写MapReduce程序

我们将编写两个MapReduce程序,一个用于统计页面浏览量,另一个用于统计各个省份的浏览量。

3.1 统计页面浏览量

Mapper代码:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class PageViewMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split("\\|");
        if (fields.length >= 3) {
            word.set(fields[2].trim());  // url
            context.write(word, one);
        }
    }
}

Reducer代码:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class PageViewReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
}
3.2 统计各省份的浏览量

Mapper代码:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class ProvinceViewMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split("\\|");
        if (fields.length >= 6) {
            word.set(fields[5].trim());  // province
            context.write(word, one);
        }
    }
}

Reducer代码:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class ProvinceViewReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

4. 运行MapReduce任务

编译打包上述Java代码,并在Hadoop集群上运行MapReduce任务。

hadoop jar pageview.jar com.example.PageViewDriver /path/to/hdfs/logs /path/to/hdfs/output/pageview
hadoop jar provinceview.jar com.example.ProvinceViewDriver /path/to/hdfs/logs /path/to/hdfs/output/provinceview

5. 结果查看

运行完成后,可以通过HDFS命令查看结果:

hadoop fs -cat /path/to/hdfs/output/pageview/part-r-00000
hadoop fs -cat /path/to/hdfs/output/provinceview/part-r-00000

五、总结

通过Hadoop的MapReduce,我们实现了对电商日志文件的分析,包括统计页面浏览量和各省份的浏览量。ETL过程中,我们只解析出所需的字段,提高了数据处理的效率。在实际生产环境中,可以将这些MapReduce任务定时调度,定期处理增量日志数据,实现实时的数据分析和监控。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值