使用Hadoop完成对电商日志的分析-2
一、项目要求
根据电商日志文件进行以下分析:
- 统计页面浏览量(每行记录就是一次浏览)。
- 统计各个省份的浏览量(需要解析IP)。
- 日志的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任务定时调度,定期处理增量日志数据,实现实时的数据分析和监控。