目标:
大数据项目练习
需求:
从招聘网站上(暂定智联招聘)爬取招聘信息,通过词频统计,分析企业对IT人才需求
使用框架:
平台:阿里云
爬虫:scrapy
https://docs.scrapy.org/en/latest/index.html
中文分词:HanLP中文分词
https://github.com/hankcs/HanLP
日志收集:Flume
数据计算平台:Hadoop
流程
1.通过爬虫爬取指定岗位的招聘信息,生成待处理文件
2.使用Flume定期收集文件
3.使用spark做为数据处理平台
4.在spark中使用HanLP做中文分词工作
5.使用shell做工作流调度
6.实现半自动化处理
开发过程遇到的问题
1.由于是从网页上爬内容,所以遇到了一个无法使用trim去掉的空格,UTF-8编码的空格(194 160),解决方法:
byte[] utf8Space = new byte[]{(byte) 0xc2, (byte) 0xa0};
String mSpace = new String(utf8Space, "utf8");
//[-62,-92]空格去除
word = word.replaceAll(mSpace,"");
2.HanLP在本地模式下运行的很好,但是在集群模式下存在一些问题
在集群模式下,在代码中动态添加自定义分词无效,自定义分词只能以添加自定义分词文件的形式存在
①hanlp.properties需要放到spark的conf目录下
②修改hanlp.properties中的root指向linux的本地存储字典信息的文件夹
③集群上所有的机器都需要完成步骤②
④当自定义分词词典更新后,删除custom文件夹下的.bin文件,自定义分词才会生效
3.flume使用的是spooldir模式,在此模式下,有一个变量要注意,因为我希望整行读入数据,在spark中也是默认为每行为一条记录的,所以要保证flume在将数据传输到hdfs是数据的结构保持不变。
LINE有个设置每行字符个数的属性:deserializer.maxLineLength,默认是2048,大于这个字符数的行将被截断。
修改方法
agent1.sources.spooldirSource.deserializer.maxLineLength =1048576
设一个比较大的上限,保证每行数据不会被截断。
4.crontab使用
crontab -e
进入编辑界面,以下代码用来实现每天定时启动任务脚本
53 13 * * * /home/hadoop/lib/start_tech_analyze.sh &>/home/hadoop/data/tech_analyze_log.txt 2>&1
①使用crontab时,一定要加上输出内容的重定向&>/home/hadoop/data/tech_analyze_log.txt 2>&1
,否则一方面看不到输出结果,另一方面crontab会默认输出到/var/mail/$user下,越攒越多。
②使用crontab时,执行脚本在默认情况下是不会加载用户的环境变量的,所以要在脚本中加载用户环境变量
. ~/.bash_profile
③crontab操作
$ service crond start //启动服务
$ service crond stop //关闭服务
$ service crond restart //重启服务