1.实验环境
1.1操作系统
macOS Mojave 10.14.1
1.2虚拟化软件
VMware Fusion
1.3虚拟机操作系统
ubuntu18.04 64 位
1.4数据
sogou500w数据
2.实验步骤和方法流程
2.1安装jdk
前往官网下载jdk1.8,安装位置为/home/kyle/env。
2.1.2配置环境变量
vsudo vim /etc/profile
export JAVA_HOME=/home/kyle/env/java/jdk1.8
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
source /etc/profile
查看是否安装成功: java -version
2.2安装hadoop
2.2.1安装ssh
sudo apt-get install ssh
sudo apt-get install rsync
2.2.2设置ssh免密登陆
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
check免密登陆: ssh localhost
2.2.3配置hadoop环境
cd /home/kyle/app/hadoop
vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/home/kyle/env/jdk1.8
vim etc/hadoop/core-site.xml
fs.defaultFS
hdfs://localhost:9000
vim etc/hadoop/hdfs-site.xml
dfs.replication
1
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vim etc/hadoop/mapred-site.xml
mapreduce.framework.name
yarn
vim etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
2.2.4配置hadoop环境变量
sudo vim /etc/profile
export HADOOP_PATH=/home/kyle/app/hadoop
export PATH=$PATH:$HADOOP_PATH/bin:$HADOOP_PATH/sbin
source /etc/profile
2.2.5格式化hdfs文件系统
hdfs namenode -format
2.2.6打开查看关闭dfs和yarn
start-dfs.sh
start-yarn.sh
jps
stop-dfs.sh
stop-yarn.sh
2.3安装spark
2.3.1下载spark安装spark
安装位置为/home/kyle/env
2.3.2配置spark环境变量
sudo vim /etc/profile
export SPARK_HOME=/home/kyle/env/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source /etc/profile
2.3.3 配置spark环境
2.3.3.1查看python位置
python3
import sys
print(sys.path)
结果为/usr/bin/python3.6
2.3.3.2 在spark中配置python3.6环境变量
cd /home/kyle/env/spark/conf
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
export PYSPARK_PYTHON=/usr/bin/python3
2.3.4 运行pyspark
pyspark
2.4 pyspark进行简单数据处理
2.4.1统计行数
sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogou.count()
2.4.2查找有某个单词的行
baidu_lines = sogou.filter(lambda line: "百度" in line)
baidu_lines.first()
baidu_lines.count()
2.5编写spark的python程序
2.5.1 统计关键词的查询次数并进行排序
#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[2], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t1")
2.5.2统计独立uid数
#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogouf = sogou.map(lambda line: line.split("\t"))
#num_uid 独立的用户id数量
num_uid = sogouf.map(lambda fields:fields[1]).distinct().count()
file = open('/home/kyle/job/t2.txt','w')
file.write('num_uid = '+str(num_uid))
2.5.3 根据访问次数对网址进行排序
#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[5], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t3")
2.5.4 统计每小时的搜索量
#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: x[0][:-4]).map(lambda x: (x, 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t4")
2.5.5 用户查询次数排行榜
#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[1], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/timesRank")
2.6通过spark-submit name.py 运行程序
spark-submit t1.py
2.7对输出文件进行处理
输出结果都在home/kyle/job下,其中t1,t3,t5中含有多个文本文件。为了便于分析,只选取关键词查询次数中的前30,即t1中的前30。
cd /home/kyle/job/t1
head -30 part-00000 > ../t1.txt
网址中的前30,t3;用户查询次数的前30,t5;方法同上。而统计每小时的搜索量则是所有数据分布在多个文件夹中。处理方法为:
cd /home/kyle/job/t4
cat part-* > ../t4.txt
2.8使用excel对统计结果进行分析
3 统计结果
3.1 pyspark
3.1.1 统计数据总条数
sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogou.count()
3.1.2查找有某个单词的行
baidu_lines = sogou.filter(lambda line: "百度" in line)
baidu_lines.first()
baidu_lines.count()
图1中展示了打开pyspark后欢迎界面,查询的数据总条数为5000000条,数据中含有”百度”的数据的总条数为38441条。
所有的python文件放置的位置为/home/kyle/job/py
命名为t1.py, t2.py, t3.py, t4.py, t5.py。具体程序参见2.5或者附件程序。
cd /home/kyle/job/py
3.2.1 统计关键词查询次数并进行排序程序参见2.5.1
spark-submit t1.py
执行过程中会输出查询结果的文件。图2为排名前30的关键词及其搜索次数。图3为其的柱状图表示。从柱状图中可以直观地看出,sogou的搜索关键词排名第一的毫无疑问是另外一个搜索引擎,因为第一名是”百度”,第二名是”baidu”。
3.2.2 统计独立uid数量程序参见2.5.2
图4为独立用户id数量的结果,数量为1352664,由3.1可以知道查询的总次数的总条数为5000000条,平均每位用户的查询次数为3.696次。
3.2.3 根据访问次数对网址进行排序(前10)程序参见2.5.3或附件
图5为执行结果的前10条数据。图6为访问次数前10的网址及其占比。可以看到与3.2.1中的结果是一致的www.baidu.com的访问次数占据前10的43%。
3.2.4 统计每小时的搜索量程序参见2.5.4或附件
图7为每小时的搜索量,可以看到2011年12月31号的数据存在明显异常。
图8为2011年12月30号每小时搜索量的变化图。可以看到搜索量在零点时处于较低的位置,而后一直缓慢下降,至凌晨5点,搜索量开始缓慢上升,7点开始迅速上升;而后从9点到21点一直处于一个较高的位置。
3.2.5 用户查询次数排行榜(前10)程序参见2.5.5或附件
图9为用户查询次数的前10条数据。可以看到查询次数最多的用户这一天的查询次数居然高达11528次。也就是说该用户平均每7.5秒进行一次查询。所以基本可以判断,该用户为爬虫。图10为查询次数前十的用户查询次数占比图。
4 总结
本次实验,首先部署好spark的实验环境。然后利用pyspark进行了简单的查询操作,比如查询数据的总条数,查询含有某个单词的数据的总条数,打印第一条等。之后在编写python独立程序,统计了搜索关键词的查询次数并进行了排序,统计了独立的用户数量,根据网站访问次数进行排序,统计了每小时的搜索量,对每个用户的搜索次数进行了统计并排序。最后对这些数据进行了分析。得出了以下结论:(1)使用sogou的用户中有很多人会直接搜索百度;(2)独立uid的数量为1352664,数据的总条数为5000000条,平均每位用户每天的查询次数为3.696次。(3)每小时的搜索量体现的数据为白天搜索量大,凌晨搜索量小。(4)基本可以判断,搜索量排名第一的用户为爬虫,因为其平均每7.5秒便进行一次搜索。(5)31号的每小时的搜索量非常不正常,如图7所示,所以没有纳入每小时搜索量的统计。