Spark之搜狗日志查询实战

时间:2023-03-08 21:59:54
Spark之搜狗日志查询实战

1、下载搜狗日志文件:

地址:http://www.sogou.com/labs/resource/chkreg.php

2、利用WinSCP等工具将文件上传至集群。

3、创建文件夹,存放数据:

mkdir /home/usr/hadoopdata

4、将搜狗日志数据移到(mv命令)3中创建的目录下,并解压

tar -zxvf SogouQ.mini.tar.gz 

5、查看解压后文件格式

file SogouQ.sample

显示:Spark之搜狗日志查询实战

不是UTF-8,用head/cat命名查看,中文乱码(影响后续进程),需对文件格式进行转换:

iconv -f gb2312 SogouQ.sample -o SogouQ.sample2

再次查看即可正常显示中文。

Spark之搜狗日志查询实战

6、启动集群(Hadoop、spark)。启动后,进入hadoop安装目录下,在hdfs上新建存放数据的目录,并将5中已进行格式转换后的日志文件放到hdfs上,再查看文件是否上传成功,命令如下:

cd /home/usr/hadoop/hadoop-2.8.
hadoop fs -mkdir /sogoumini
hadoop fs -put /home/chenjj/hadoopdata/testdata/SogouQ.sample2 /sogoumini
hadoop fs -ls /sogoumini/SogouQ.sample2

结果:

Spark之搜狗日志查询实战

7、进入spark安装目录下bin,启动spark-shell,由于本集群采用yarn模式部署的,故启动时选取yarn,其他参数可自行配置。

cd spark/spark-2.1.-bin-hadoop2./bin
./spark-shell --master yarn --executor-memory 2g --driver-memory 2g

8、进入spark-shell后,执行以下操作,在每句后面有说明

val path="hdfs:///sogoumini/SogouQ.sample2"——声明路径
val sogouminirdd=sc.textFile(path)——读取hdfs上搜狗日志文件
sogouminirdd.count()——查看文件总共多少条记录
val mapsogouminirdd=sogouminirdd.map(_.split("\\s")).filter(_.length==)——筛选出格式正确的数据
mapsogouminirdd.count()——查看格式正确的有多少条,是否所有数据均正确
val firstmapsogouminirdd=mapsogouminirdd.filter(_().toInt==).filter(_().toInt==)——筛选出当日搜索结果排名第一同时点击结果排名也是第一的数据量
firstmapsogouminirdd.count()——查看结果是第多少条数据

注:(1) 元数据文件格式和官网描述不一致问题,官方说明排名和用户点击的顺序号之间是以Tab键分隔的,而实际是以空格分隔。

解决方法: spark分词时用split("\\s")代替split("\t"))。

9、使用toDebugString查看RDD血统(lineage)

firstmapsogouminirdd.toDebugString

结果如下:

Spark之搜狗日志查询实战

可见其血统关系是:HadoopRDD->MappedRDD->MappedRDD->FilteredRDD->FilteredRDD->FilteredRDD。

10、用户ID查询次数排行榜:

val sortrdd=mapsogouminirdd.map(x=>(x(),)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
sortrdd.count()

11、将结果存放在hdfs中:

val outputpath="hdfs:///sogoumini/SogouQresult.txt"——存放路径及文件名
sortrdd.saveAsTextFile(outputpath)——存结果