目标:
大数据项目练习
需求:
从招聘网站上(暂定智联招聘)爬取招聘信息,通过词频统计,分析企业对IT人才需求
使用框架:
平台:阿里云
爬虫:scrapy
https://docs.scrapy.org/en/latest/index.html
中文分词:结巴中文分词
https://github.com/fxsjy/jieba
日志收集:Flume
数据计算平台:Hadoop
流程
1.通过爬虫爬取指定岗位的招聘信息
2.使用结巴分词对招聘信息进行分词,生成待处理文件
3.使用Flume定期收集文件
4.使用MapReduce完成名词过滤与统计等工作
5.使用Hive完成数据入库
6.通过Hue展示数据
进度记录
1.Scrapy安装
没有再Windows下安装Scrapy,原因是看到网上好多文章说在Windows下配置环境十分麻烦,所以直接在CentOS7下安装了
yum -y update
yum install gcc libffi-devel python-devel openssl-devel
yum groupinstall -y development
yum install libxslt-devel
yum install python-setuptools
easy_install pip
easy_install lxml
pip install scrapy
运行scrapy startprojcet xxx如果出错的话,我这里是因为twisted的版本不正确,执行以下命令,安装指定版本的twisted就可以了。
sudo pip install twisted==13.1.0
启动爬虫的方法
scrapy crawl xxx
2.安装结巴分词
easy_install jieba
结巴分词可以添加自定义字典便于修正错误的分词
3.在信息收集阶段
①使用结巴分词对招聘信息进行词语分割,此时对数据进行预处理,将标点符号(这里要考虑到全角和半角标点)和数字都去除掉,然后形成的每条招聘信息的格式为:列以“\t\t”分割,切出的词以”\t”分割
这里的分割不能以,等在招聘信息中可能出现的符号做分割,否则会出现识别错乱的问题,也不能以空格分割,因为有些技术的英文描述可能包括空格。
title url 切割后的招聘信息
xxxx http://xxxx xxx yyy zzz xxx
②可以以多个关键字作为招聘信息收集的根页面,例如我选取了“Spark”,“hadoop”,“大数据”。把这些url设置为start_urls,但是这样就会出现搜索重复的问题,所以需要用bloomfilter对url进行过滤去重。
安装bloomfilter的方法
sudo pip install pybloomfiltermmap
bloomfilter的使用方法参考以下blog:
http://blog.csdn.net/zcc_0015/article/details/50608063
③在项目里我为了不爬到太久远的数据,所以在爬虫中设置了页数限制,当达到页数限制后,计数器归零,爬虫从下一个start_url开始重新爬数据。
4.使用Flume手机爬虫爬下来的数据,导入到hdfs中
①flume的安装比较简单,只需要解压,配置conf目录下的flume-env.sh中的JAVA_HOME即可
②要注意的是flume对Java的版本要求,由于我装的是Java7,所以Flume最高只能用1.6的,1.7以上需要Java8
③测试flume是否能够正确运行在bin目录下执行
flume-ng version
④flume的使用完全依赖于配置文件
agent1.sources = spooldirSource
agent1.channels = fileChannel
agent1.sinks = hdfsSink
agent1.sources.spooldirSource.type=spooldir
agent1.sources.spooldirSource.spoolDir=/home/hadoop/PyWorkspace/myspider/data
agent1.sources.spooldirSource.channels=fileChannel
agent1.sinks.hdfsSink.type=hdfs
agent1.sinks.hdfsSink.hdfs.path=hdfs://hadoop000:8020/flume/cys
agent1.sinks.hdfsSink.hdfs.filePrefix=%y-%m-%d
agent1.sinks.hdfsSink.hdfs.idleTimeout=3
agent1.sinks.sink1.hdfs.round = true
# Number of seconds to wait before rolling current file (0 = never roll based on time interval)
agent1.sinks.hdfsSink.hdfs.rollInterval = 3600
# File size to trigger roll, in bytes (0: never roll based on file size)
agent1.sinks.hdfsSink.hdfs.rollSize = 0
agent1.sinks.hdfsSink.hdfs.rollCount = 0
agent1.sinks.hdfsSink.hdfs.batchSize = 1000
#Rounded down to the highest multiple of this (in the unit configured using hdfs.roundUnit), less than current time.
agent1.sinks.hdfsSink.hdfs.roundValue = 1
agent1.sinks.hdfsSink.hdfs.roundUnit = minute
agent1.sinks.hdfsSink.hdfs.useLocalTimeStamp = true
agent1.sinks.hdfsSink.channel=fileChannel
agent1.sinks.hdfsSink.hdfs.fileType = DataStream
agent1.channels.fileChannel.type = file
agent1.channels.fileChannel.checkpointDir=/home/hadoop/app/flume-1.6.0/bin/checkpoint
agent1.channels.fileChannel.dataDirs=/home/hadoop/app/flume-1.6.0/bin/dataDir
启动方法
./flume-ng agent -f ../conf/hdfs.conf -n agent1 -Dflume.root.logger=INFO,console
Flume采用了spooldirSource的模式来收集文件
spooldirSource源允许您通过将要提取的文件放入磁盘上的“spooling”目录中来提取数据。此源将监视新文件的指定目录,并在新文件显示时解析新文件中的事件。事件解析逻辑是可插入的。在给定文件被完全读入通道之后,它被重命名以指示完成(或可选地被删除)。
因为放入检测目录的文件不能被修改,所有爬虫爬到的数据将先缓存在其他目录当中,但完成数据收集工作之后,再将文件移动到spooldir文件夹中。将文件移动到spooldir的操作是在爬虫的spider_closed()方法中完成的。应该也可以用Kafka的工作流实现。
5.原本想在项目里加入Azkaban实现昨天调度,不过,这个项目实在是有点太简单了,决定放弃使用框架实现作业调度,用shell应该也能实现。
ps:已经使用shell完成了工作调度
6.使用MR基本实现了原有的功能设想,但是当需要进行扩充的时候,想要实现更复杂的数据处理,用MR就有点复杂了,可以采用MR对源数据进行ETL,再使用Hive来进行数据统计。
7.使用Python进行分词也存在一些问题,就是爬数据和分词放在一起之后,生成的数据就是经过分词处理的,有的时候会出现分词错误的情况,这个时候就需要重新爬一遍数据才能完成新的分词工作。这点非常的不好,所以应该把分词工作放在后面,爬虫只负责收集数据,不负责任何形式的数据处理,这样,收集来的数据就不用因为修改逻辑而无法使用了。
Hive实现数据分析和Hue的数据展示,暂时搁置。