参考书籍:
Hadoop大数据开发基础(第2版)(微课版)
作者: 张军 , 张良均 (主编) 余明辉 , 王新云 , 刘名军 (副主编)
实验准备
Windows操作系统
VMware虚拟机
xshell 和 xftp (非必须,所需软件包也可以在虚拟机中下载)
!!!重点: root用户
配置网络
在本次搭建过程中,我们在VMware虚拟机中使用NAT模式
网络.本文中介绍的是NAT模式网络配置.
当然你也可以使用桥接模式, 桥接模式连接网络虽然相对简单, 但是, 有这种情况: 宿主机IP变动, 虚拟机IP也跟着变动. VMware官方给出了方案:
"如果您在笔记本电脑或其他移动设备上使用虚拟机,请选择
复制物理网络连接状态
.
当您的网络变化时,此设置会导致 IP 地址更新. "
虽然这解决了IP地址跟随变化的问题, 但我个人认为, 变动的IP可能会在实验中造成不便.
以下是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
修改如下内容:
bootproto=static
onboot=yes
添加IP地址\网关\子网掩码\DNS信息:
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
查看主机名已配置成功, 重启后永久生效
使用xshell连接虚拟机
此步骤也可跳过
.
配置完IP后可以在windows中使用xshell连接你的虚拟机. 也可以在xshell里修改快捷键. 方便做粘贴操作等等.
配置yum源并安装软件
有几种配置yum源的方法, 例如在线源和本地源. 选择一种即可.
关于yum国内在线源配置, 可参考: 小橙.【已测有效】替换centos的yum源,本人是替换成功阿里云的镜像源
本文只介绍本地源的配置.
配置yum本地源
这里配置的是本地yum源, 即使没有网络也可以下载软件
进入/etc/yum.repo.d
目录下, 对里面的所有文件使用如下命令(保留CentOS-Media.repo):
mv Centos-xxx.repo Centos-xxx.rep.bak
然后使用命令vim CentOS-Media.repo
, 只修改如下内容:
baseurl=file:///media/
gpgcheck=0
enabled=1
把/dev/sr0挂载到/media,挂载前确保VMware虚拟机设置\CD/DVD\设备状态已连接
勾选。否则会失败
使用如下命令:
mount /dev/sr0 /media
显示写保护说明成功
使用yum clean all
清除yum缓存
使用yum安装软件
使用yum安装ssh远程连接和ntp时钟同步软件
yum install -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
添加如下内容:
export JAVA HOME=/usr/java/jdk1.8.0 281-amd64
#这里是JDK安装目录
使用source ~/.bashrc使修改生效,使用java -version
验证配置成功
如果你的系统自带OpenJDK, 你还需要切换一下版本:
update-alternatives --config java
输入要切换的版本序号即可
解压并修改Hadoop配置文件
解压Hadoop
解压Hadoop:
tar -xf hadoop-3.1.4.tar.gz
#或指定解压位置
tar -xzvf software.tar.gz -C /usr/local
配置环境变量
输入命令:
vim /etc/profile
添加如下内容:
export HADOOP_HOME=/usr/local/hadoop-3.1.4 #这里是你的Hadoop解压后的路径
export PATH=$HADOOP_HOME/bin:$PATH:$JAVA_HOME/bin
修改Hadoop相关配置文件
使用cd $HADOOP_HOME
或
cd /usr/local/hadoop-3.1.4/etc/hadoop
(Hadoop安装目录)进入Hadoop安装目录,
修改core-site.xml、hadoop-env.sh、yarn-env.sh、mapred-site.xml、yarn-site.xml、workers、hdfs-site.xml7个配置文件的内容。
core-site.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
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
#修改JAVA_HOME的值为JDK所在目录(注意版本,确保文件名正确/usr/java/...)
#(文件内高亮查找:/JAVA_HOME)
yarn-env.sh
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/usr/java/jdk1.8.0_281-amd64
mapred-site.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
<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
#删除localhost,添加以下内容
slave1
slave2
hdfs-site.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
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
start-yarn.sh和stop-yarn.sh
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
修改主机与IP地址映射
/etc/hosts
192.168.128.130 master master.centos.com
192.168.128.131 slave1 salve1.centos.com
192.168.128.132 slave2 slave2.centos.com
克隆和配置集群
克隆master为slave1和slave2。
配置slave1、slave2网络
vim /etc/sysconfig/network-scripts/ifcfg-ens33
...省略(与master方法一致,只是IP地址最后分别改为131和132)
service network restart#重启网卡服务
分别修改主机名:
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2
使用master查看是否能ping通slave1和slave2。
ping slave1
ping slave2
配置ssh免密登录
在master上使用如下命令:
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主节点下分别输入:
ssh slave1
ssh slave2
无需密码就能登录
禁用防火墙
分别在master、slave1、slave2关闭和禁用防火墙。
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld #查看若状态为inactive(dead)说明防火墙已关闭。
配置时钟同步服务
修改master的/etc/ntp.conf文件,
注释
掉以server开头
的行- 添加:
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
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd#查看状态为active说明成功
在slave1和slave2上同步并启动
ntpdate master
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd#查看状态为active说明成功
格式化HDFS
分别在master\slave1\slave2上使用命令 cd $HADOOP_HOME
进入Hadoop安装目录
输入如下命令进行格式化:
bin/hdfs namenode -format
启动Hadoop集群
在master上执行如下命令:
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
文件(需要到修改写入权限, 自行搜索)
192.168.128.130 master master.centos.com
192.168.128.131 slave1 salve1.centos.com
192.168.128.132 slave2 slave2.centos.com
在浏览器输入如下网址监控集群:
http://master:9870 #hdfs监控
http://master:8088 #yarn监控
http://master:19888 #jobhistory日志监控
关闭集群
在master上输入
cd $HADOOP
sbin/stop-dfs.sh
sbin/stop-yarn.sh
sbin/mr-jobhistory-daemon.sh stop historyserver
测试
以下是简单的指令测试hdfs系统能否正常使用:
hdfs dfs -ls / #查看hdfs系统根目录文件
hdfs dfs -mkdir /input #创建输入文件
hdfs dfs -put 本地文件路径 /input #上传文件到hdfs系统的input目录下
# 或hdfs dfs copyFromLocal 本地文件路径 /input
hdfs dfs -cat /input/文件名 #查看文件内容, 同样也可以通过网页监控HDFS查看
MapReduce编程
Eclipse安装Hadoop
- 首先在linux中安装Eclipse
- 下载
Hadoop-eclipse-plugin插件
的jar包, 并拷贝到eclipse安装目录的dropins
文件夹下面
-
使用
root
用户启动eclipse(在终端输入cd /..省略../eclipse, 进入你的eclipse安装目录, 输入./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
代码为例(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
hadoop jar /...省略.../WordCount.jar WordCount /input /output
这个命令的含义是:
hadoop jar jar文件路径 类名 输入文件所在的文件夹 输出文件夹(输出文件夹不需要事先创建)
执行结果:
/output
中出现两
个文件, _SUCCESS
文件表示成功, part-r-00000
文件中可以查看执行的结果(使用hdfs dfs -cat
指令或在网页监控http://master:9870
中的utilities\broswer the file system
中查看 )
本文也发布在了CSDN:「Hadoop实战基础:从集群搭建到编程测试」