前言
环境搭建
Hadoop分布式平台环境
前提准备
操作系统:CentOS7
机器:虚拟机3台,(master 192.168.1.201, slave1 192.168.1.202, slave2 192.168.1.203)
JDK:1.8.0_121(jdk-8u221-linux-x64.tar.gz)
Hadoop:2.9.2(http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz)
安装VMware和三台centoos
这儿我就不细分了,网上教程比我写的好的很多
起步
1、
在vmware安装好linux虚拟机后
重启虚拟机
在root权限的根目录下
修改IP地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
2、
修改BOOTPROTO=“static”
并为其添加IP和网关
IPADDR=“需要配置的IP地址”
GATEWAY=“192.168.1.2”
DNS1=“8.8.8.8”
3、
!wq保存后
执行:service network restart在这里插入图片描述
如果出现错误,执行reboot,重启虚拟机
修改主机名
4、
修改主机名:vi /etc/sysconfig/network
在hosts里面添加内容
vi /etc/hosts
并重启设备,重启后,查看主机名,已经修改成功
5、
修改window10的hosts文件
(1)进入C:\Windows\System32\drivers\etc路径
(2)打开hosts文件并添加如下内容
192.168.1.201 hadoop201
192.168.1.202 hadoop202
192.168.1.203 hadoop203
6、
关闭防火墙,并在命令里面ping虚拟机
防火墙基本语法:
firewall-cmd --state (功能描述:查看防火墙状态)
Service firewalld restart 重启
Service firewalld start 开启
Service firewalld stop 关闭
永久关闭:
systemctl stop firewalld.service停止
systemctl disable firewalld.service禁止开机启动
ping -c 3 slave1 (※ 3表示发送 3 个数据包)
接下来既可以快乐的使用xshell敲代码了
jdk环境(我这儿用的1.8)
1、卸载现有jdk
查询是否安装java软件:rpm -qa|grep java
如果安装的版本低于1.7,卸载该jdk:rpm -e 软件包
2、传输文件
opt下创建两个文件夹
mkdir software
mkdir module
在software下
tar -zxvf jdk-8u121-linux-x64.gz -C /opt/module/
依次解压
tar -xvf mysql文件名
复制路径
/opt/module/jdk1.8.0_121
/opt/module/hadoop-2.9.2
配置全局路径
vi /etc/profile
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_121
export PATH=$PATH:$JAVA_HOME/bin
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
让修改后的文件生效: source /etc/profile
以上就是配置好的Java环境和Hadoop环境变量。接下来我们再去配置好Hadoop的其他环境。
core-site.xml
<configuration>
<!-- 鎸囧畾HDFS涓璑ameNode鐨勫湴鍧€ -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop201:9000</value>
</property>
<!-- 鎸囧畾hadoop杩愯鏃朵骇鐢熸枃浠剁殑瀛樺偍鐩綍 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.9.2/tmp</value>
</property>
</configuration>
hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_121
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop203:50090</value>
</property>
</configuration>
Slaves(配置哪几台是datanode)
yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_121
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop202</value>
</property>
</configuration>
mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_121
mapred-site.xml
<configuration>
<!-- 指定mr运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
在vmware中对配置好的虚拟机进行克隆002,003(注意修改主机名和IP)
ssh免密码登录
每台机器执行:
ssh-keygen -t rsa
把 hadoop201 节点上的 authorized_keys 钥发送到其他节点
hadoop201 执行命令,生成 authorized_keys 文件:
ssh-copy-id -i /root/.ssh/id_rsa.pub hadoop201
把 authorized_keys 发送到 hadoop202 hadoop203 节点上
scp /root/.ssh/authorized_keys root@hadoop202:/root/.ssh/
scp /root/.ssh/authorized_keys root@hadoop203:/root/.ssh/
在hadoop201 节点测试免密码登录 hadoop202、hadoop203
命令:ssh 机器名
启动 Hadoop 集群
1.格式化 namenode 节点
只需要在 master 机器上执行就好 hdfs namenode -format
2. 启动集群:在master上执行 start-all.sh
启动时候发现resourcemanager没有起来关闭防火墙输入以下代码
sbin/yarn-daemon.sh start resourcemanager
在浏览器输入192.168.1.201:50070
在浏览器输入192.168.1.202:8088
完美搞定!
hive,flume,mysql,sqoop安装包和安装步骤在链接里面
链接:https://pan.baidu.com/s/1C3e4FpeX-RQ-9GVak6rekA
提取码:sed6
flume环境
安装好文件以后
flume配置
配置flie-hdfs.conf文件
# 相当定义 Flume 的三个组件变量名
a3.sources = r3
a3.sinks = k3
a3.channels = c3
# Describe/configure the source
a3.sources.r3.type = spooldir
a3.sources.r3.spoolDir = /opt/data_log/
a3.sources.r3.fileSuffix = .log
a3.sources.r3.fileHeader = true
a3.sources.r3.inputCharset = GBK
# Describe the sink
a3.sinks.k3.type = hdfs
a3.sinks.k3.hdfs.path = hdfs://hadoop201:9000/flume/%Y%m%d/%H
#上传文件的前缀
a3.sinks.k3.hdfs.filePrefix = wuyou-
#是否按照时间滚动文件夹
a3.sinks.k3.hdfs.rollSize = 0
a3.sinks.k3.hdfs.rollCount = 0
a3.sinks.k3.hdfs.useLocalTimeStamp = true
a3.sinks.k3.hdfs.fileType = DataStream
# Use a channel which buffers events in memory
a3.channels.c3.type = memory
a3.channels.c3.capacity =30000
a3.channels.c3.transactionCapacity = 30000
# Bind the source and sink to the channel
a3.sources.r3.channels = c3
a3.sinks.k3.channel = c3
基于scrapy实现的数据抓取
分析网页
点击进入网页
我们先来看看网页构造。再来分析思路:
由于我们需要的大数据岗位的分布数据,所以我们就直接搜索条件,分析大数据岗位在全国的一个分布情况。
我的思路是,既然需要字段,而且这个页面上的所有字段并没有我们需要的全部,那我们就需要进入到每一个网址里面去分析我们的字段。先来看看进去后是什么样子。
我们需要的字段都在这里面了,所以,我们就可以开始动手写代码了。
实现代码
抓取全部岗位的网址
我们之前说过,要进入到每一个网址去,那么就必然需要每一个进去的入口,而这个入口就是这个:
新建一个爬虫项目:
scrapy startproject qianchengwuyou
然后打开我们的项目,进入瞅瞅会发现啥都没有,我们再cd到我们的项目里面去开始一个爬虫项目
scrapy genspider qcwy https://search.51job.com/
当然,这后边的网址就是你要爬取的网址。
首先在开始敲代码之前,还是要设置一下我们的配置文件settings.py中写上我们的配置信息:
# 关闭网页机器人协议
ROBOTSTXT_OBEY = False
# mongodb地址
MONGODB_HOST='127.0.0.1'
# mongodb端口号
MONGODB_PORT = 27017
# 设置数据库名称
MONGODB_DBNAME = '51job'
# 存放本数据的表名称
MONGODB_DOCNAME = 'jobTable'
# 请求头信息
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User_Agent' :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
# 下载管道
ITEM_PIPELINES = {
'qianchengwuyou.pipelines.QianchengwuyouPipeline': 300,
}
# 下载延时
DOWNLOAD_DELAY = 1
然后再去我们的pipelines.py中开启我们的爬虫保存工作
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
import pymongo
class QianchengwuyouPipeline:
def __init__(self):
host = settings['MONGODB_HOST']
port = settings['MONGODB_PORT']
self.client = pymongo.MongoClient(host=host,port=port)
self.db = self.client[settings['MONGODB_DBNAME']]
self.coll = self.db[settings['MONGODB_DOCNAME']]
def process_item(self, item, spider):
data = dict(item)
self.coll.insert(data)
return item
def close(self):
self.client.close()
定义好pipelines.py之后,我们还需要去items.py中去定义好我们需要爬取的字段,用来向pipelines.py中传输数据