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
显示:
不是UTF-8,用head/cat命名查看,中文乱码(影响后续进程),需对文件格式进行转换:
iconv -f gb2312 SogouQ.sample -o SogouQ.sample2
再次查看即可正常显示中文。
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
结果:
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
结果如下:
可见其血统关系是: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)——存结果