参考书籍:
Hadoop大数据开发基础(第2版)(微课版)
作者: 张军 , 张良均 (主编) 余明辉 , 王新云 , 刘名军 (副主编)
配置网络
在本次搭建过程中,我们在VMware虚拟机中使用NAT模式网络
Windows中
- 在控制面板\网络和 Internet\网络和共享中心\更改适配器设置中,开启
VMnet8
网卡 - 右击属性\Internet协议版本4,输入:
Ip地址
: 192.168.128.2
子网掩码
: 255.255.255.0
默认网关
: 192.168.128.1
DNS
: 8.8.8.8
VMware中
打开虚拟网络编辑器\VMnet8:
取消勾选"使用本地DHCP服务将IP地址分配给虚拟机"
设置子网
192.168.128.0网段,子网掩码
255.255.255.0
点击NAT设置, 设置网关
192.168.128.1
CentOS7中
输入vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改如下内容:
shell
bootproto=static
onboot=yes
添加Ip地址\网关\子网掩码\DNS信息:
shell
IPADDR=192.168.128.130
GATEWAY=192.168.128.131
NETMASK=255.255.255.0
DNS1=8.8.8.8
保存后,使用systemctl restart network
重启网卡
使用ifconfig
指令查看IP配置成功
输入ping www.baidu.com
, 可以ping通
更改主机名
使用hostnamectl set-hostname master
设置主机名为master
使用hostname
查看主机名已配置成功, 重启后永久生效
配置yum源并安装软件
这里配置的是本地yum源, 即使没有网络也可以下载软件
进入/etc/yum.repo.d
目录下, 对里面的所有文件使用如下命令(保留CentOS-Media.repo):
shell
mv Centos-xxx.repoCentos-xxx.rep.bak
然后使用命令vim CentOS-Media.repo
, 只修改如下内容:
shell
baseurl=file:///media/
gpgcheck=0
enabled=1
把/dev/sr0挂载到/media,挂载前确保VMware虚拟机设置\CD/DVD\设备状态已连接
勾选。否则会失败,使用如下命令:
mount /dev/sr0 /media
显示写保护说明成功
使用yum clean all
清除yum缓存
使用yum安装ssh远程连接和ntp时钟同步软件
shell
yum insatall -y openssh-server openssh-clients ntp ntpdate
安装和配置JDK\Hadoop
使用xftp把Hadoop和JDK安装包传输到CentOS中
这里使用的是jdk-8u281-linux-x64.rpm
和hadoop-3.1.4.tar.gz
安装和配置JDK
安装JDK
使用rpm -ivh jdk-8u281-linux-x64.rpm
安装JDK
配置JDK
输入命令: vim ~/.bashrc
添加如下内容:
shell
export JAVA HOME=/usr/java/jdk1.8.0 281-amd64
使用source ~/.bashrc使修改生效,使用java -version
验证配置成功
解压并修改Hadoop配置文件
解压Hadoop
解压Hadoop并修改配置文件: tar -xf hadoop-3.1.4.tar.gz
修改Hadoop相关配置文件
cd /usr/local/hadoop-3.1.4/etc/hadoop
目录(Hadoo安装目录),
修改core-site.xml、hadoop-env.sh、yarn-env.sh、mapred-site.xml、yarn-site.xml、workers、hdfs-site.xml7个配置文件的内容。
core-site.xml
xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/log/hadoop/tmp</value>
</property>
</configuration>
hadoop-env.sh
shell
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
#修改JAVA_HOME的值为JDK所在目录(注意版本,确保文件名正确/usr/java/...)
#(文件内高亮查找:/JAVA_HOME)
yarn-env.sh
shell
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
mapred-site.xml
xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- jobhistory properties -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
yarn-site.xml
xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address</name>
<value>${yarn.resourcemanager.hostname}:8090</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/hadoop/yarn/local</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data/tmp/logs</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs/</value>
<description>URL for job history server</description>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
</configuration>
workers
shell
#删除localhost,添加以下内容
slave1
slave2
slave3
hdfs-site.xml
xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
为了防止Hadoop集群启动失败,需要修改Hadoop集群启动和关闭服务的文件。启动和关闭服务的文件在/usr/local/hadoop-3.1.4/sbin/目录下,需要修改的文件分别是start-dfs.sh、stop-dfs.sh、start-yarn.sh和stop-yarn.sh。 start-dfs.sh、stop-dfs.sh
shell
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
start-yarn.sh和stop-yarn.sh
shell
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
修改主机与IP地址映射
/etc/hosts
shell
192.168.128.130 master master.centos.com
192.168.128.131 slave1 salve1.centos.com
192.168.128.132 slave2 slave2.centos.com
192.168.128.133 slave3 slave3.centos.com
克隆和配置集群
克隆master为slave1和slave2。
配置slave1、slave2网络(与master方法一致,只是IP地址最后分别改为131和132)
shell
vim /etc/sysconfig/network-scripts/ifcfg-ens33
...省略
service network restart#重启网卡服务
修改主机名:
shell
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
使用master查看是否能ping通slave1和slave2。
shell
ping slave1
ping slave2
配置ssh免密登录
在master上使用如下命令:
shell
ssh-keygen -t rsa #三次Enter键
ssh-copy-id -i /root/.ssh/id_rsa.pub master
ssh-copy-id -i /root/.ssh/id_rsa.pub slave1
ssh-copy-id -i /root/.ssh/id_rsa.pub slave2 #按提示输入yes和密码
验证SSH是否能够无密钥登录。在master主节点下分别输入:
shell
ssh slave1
ssh slave2
无需密码就能登录
禁用防火墙
分别在master、slave1、slave2关闭和禁用防火墙。
shell
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld #查看若状态为inactive(dead)说明防火墙已关闭。
配置时钟同步服务
修改master的/etc/ntp.conf文件,
- 注释掉以server开头的行
- 添加:
shell
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10
修改slave1、slave2的/etc/ntp.conf文件
- 注释掉server开头的行,并添加:
- server master
在master启动ntp
shell
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd#查看状态为active说明成功
在slave1和slave2上同步并启动
shell
ntpdate master
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd#查看状态为active说明成功
格式化HDFS
分别在master\slave1\slave2上输入命令:
vim /etc/profile
添加如下内容:
shell
export HADOOP_HOME=/usr/local/hadoop-3.1.4#这里是你的Hadoop解压后的路径
export PATH=$HADOOP_HOME/bin:$PATH:$JAVA_HOME/bin
分别在master\slave1\slave2上使用命令 cd $HADOOP_HOME
进入Hadoop安装目录
输入如下命令进行格式化:
shell
bin/hdfs namenode -format
启动Hadoop集群
在master上执行如下命令:
shell
cd $HADOOP
sbin/start-dfs.sh
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver
在master上使用jps, 显示:
NameNode、SecondaryNameNode、ResourceManager和JobHistoryServer
在slave1\slave2上使用jps, 显示:
NameNode、DataNode
说明启动成功
监控集群
为了方便在Windows上监控集群, 需要配置域名与IP映射:
修改windows中的C:\Windows\System32\drivers\etc\hosts
文件(需要到修改写入权限, 自行搜索)
shell
192.168.128.130 master master.centos.com
192.168.128.131 slave1 salve1.centos.com
192.168.128.132 slave2 slave2.centos.com
192.168.128.133 slave3 slave3.centos.com
在浏览器输入如下网址监控集群:
bash
http://master:9870 #hdfs监控
http://master:8088 #yarn监控
http://master:19888 #jobhistory日志监控
关闭集群
在master上输入
shell
cd $HADOOP
sbin/stop-dfs.sh
sbin/stop-yarn.sh
sbin/mr-jobhistory-daemon.sh stop historyserver
测试
以下是简单的指令测试hdfs系统能否正常使用:
shell
hdfs dfs -ls / #查看hdfs系统根目录文件
hdfs dfs -mkdir /input #创建输入文件
hdfs dfs -put 本地文件路径 /input #上传文件到input
hdfs dfs -cat /input/文件名 #查看文件内容, 同样也可以通过网页监控HDFS查看
MapReduce编程
Eclipse安装Hadoop
- 首先在linux中安装Eclipse
- 下载
Hadoop-eclipse-plugin插件
的jar包, 并拷贝到eclipse安装目录的dropins
文件夹下面 - 使用
root
用户启动eclipse, 在windows\preferences
中设置Hadoop Map/Reduce
的安装目录(Hadoop安装目录) - 点击
windows\showView\MapReduce Tools
中,选择Map/Reduce Locations
- 点击右上角的
紫色大象logo
,创建新的Map/Reduce Locations
Host
输入master, 两个端口号分别输入8032
和8020
- 在Project Explorer中可以成功看到hdfs系统中的内容,说明成功
编写代码并导出为Jar
这里使用Hadoop官方的WordCount代码, 编写完成后, 右击project explorer中的项目文件, 选择export
导出为JAR文件, 指定一个Jar文件路径
编写测试文件
cat > 测试文件名或路径 << EOF
输入几段文字和句子, 最后输入EOF作为结束符
首先使用hdfs dfs -mkdir /input
在hdfs中创建一个输入文件
然后使用hdfs dfs -put 测试文件的路径 /input
上传到hdfs的/input文件夹中
输入hdfs dfs -cat /input/文件名
可以查看到内容成功上传
上传到Hadoop执行
使用hadoop jar指令, 在Hadoop上执行WordCount
shell
hadoop jar /root/WordCount.jar WordCount /input /output
这个命令的含义是:
scss
hadoop jar jar文件路径 类名 输入文件夹 输出文件夹(输出文件夹不需要事先创建)
执行结果: /output中出现两个文件, _SUCCESS
表示成功, part-r-00000
文件中可以查看执行的结果(使用hdfs dfs -cat
指令或在网页监控http://master:9870
中的utilities\broswer the file system )