「Hadoop实战基础:从集群搭建到编程测试」

242 阅读6分钟

参考书籍:

Hadoop大数据开发基础(第2版)(微课版)

作者: 张军 , 张良均 (主编) 余明辉 , 王新云 , 刘名军 (副主编)

实验准备

Windows操作系统

VMware虚拟机

CentOS-7-x86_64-DVD-2009.iso

jdk-8u281-linux-x64.rpm

hadoop-3.1.4.tar.gz

xshell 和 xftp (非必须,所需软件包也可以在虚拟机中下载)

!!!重点: root用户

配置网络

在本次搭建过程中,我们在VMware虚拟机中使用NAT模式网络.本文中介绍的是NAT模式网络配置.

当然你也可以使用桥接模式, 桥接模式连接网络虽然相对简单, 但是, 有这种情况: 宿主机IP变动, 虚拟机IP也跟着变动. VMware官方给出了方案:

image.png "如果您在笔记本电脑或其他移动设备上使用虚拟机,请选择 复制物理网络连接状态 . 当您的网络变化时,此设置会导致 IP 地址更新. "

image.png

虽然这解决了IP地址跟随变化的问题, 但我个人认为, 变动的IP可能会在实验中造成不便.

以下是NAT模式网络配置.

Windows中

  1. 在控制面板\网络和 Internet\网络和共享中心\更改适配器设置中,开启VMnet8网卡

image.png

  1. 右击属性\Internet协议版本4,输入:

Ip地址: 192.168.128.2

子网掩码: 255.255.255.0

默认网关: 192.168.128.1

DNS: 8.8.8.8

image.png

VMware中

打开虚拟网络编辑器\VMnet8:

image.png

取消勾选"使用本地DHCP服务将IP地址分配给虚拟机"

设置子网192.168.128.0网段,子网掩码255.255.255.0 image.png

点击NAT设置, 设置网关192.168.128.1

image.png

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配置成功

image.png

输入ping www.baidu.com, 可以ping通

image.png

更改主机名

使用hostnamectl set-hostname master设置主机名为master

使用hostname查看主机名已配置成功, 重启后永久生效

使用xshell连接虚拟机

此步骤也可跳过.

配置完IP后可以在windows中使用xshell连接你的虚拟机. 也可以在xshell里修改快捷键. 方便做粘贴操作等等.

image.png

image.png

配置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\设备状态已连接勾选。否则会失败

image.png

使用如下命令:

mount /dev/sr0 /media

显示写保护说明成功

image.png

使用yum clean all清除yum缓存

使用yum安装软件

使用yum安装ssh远程连接和ntp时钟同步软件

yum install -y openssh-server openssh-clients ntp ntpdate

安装和配置JDK\Hadoop

使用xftp把Hadoop和JDK安装包传输到CentOS中

image.png

这里使用的是jdk-8u281-linux-x64.rpmhadoop-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验证配置成功

image.png

如果你的系统自带OpenJDK, 你还需要切换一下版本:

update-alternatives --config java

输入要切换的版本序号即可

image.png

解压并修改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_HOMEcd /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。

image.png

配置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

image.png

无需密码就能登录

禁用防火墙

分别在master、slave1、slave2关闭和禁用防火墙。

systemctl stop firewalld 
systemctl disable firewalld
systemctl status firewalld #查看若状态为inactive(dead)说明防火墙已关闭。

image.png

配置时钟同步服务

修改master的/etc/ntp.conf文件,

  1. 注释掉以server开头的行
  2. 添加:
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文件

  1. 注释server开头的行
  2. 并添加:
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说明成功

image.png

格式化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

image.png

在slave1\slave2上使用jps, 显示:

NameNode、DataNode

image.png

说明启动成功

监控集群

为了方便在Windows上监控集群, 需要配置域名与IP映射:

修改windows中的C:\Windows\System32\drivers\etc\hosts文件(需要到修改写入权限, 自行搜索)

image.png

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日志监控

image.png

关闭集群

在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查看

image.png

image.png

MapReduce编程

Eclipse安装Hadoop

  1. 首先在linux中安装Eclipse
  2. 下载Hadoop-eclipse-plugin插件的jar包, 并拷贝到eclipse安装目录的dropins文件夹下面

image.png

  1. 使用root用户启动eclipse(在终端输入cd /..省略../eclipse, 进入你的eclipse安装目录, 输入./eclipse)

  2. windows\preferences中设置Hadoop Map/Reduce的安装目录(Hadoop安装目录)

image.png

  1. 点击windows\showView\MapReduce Tools中,选择Map/Reduce Locations

image.png

  1. 点击右上角的紫色大象logo, 创建新的Map/Reduce Locations

  2. Host输入master, 两个端口号分别输入80328020

image.png

  1. 在Project Explorer中可以成功看到hdfs系统中的内容,说明成功

image.png

编写代码并导出为Jar

以Hadoop官方的WordCount代码为例(WordCount源码页面), 新建项目, 代码编写完成后, 右击project explorer中的项目, 选择export导出为JAR文件, 指定一个Jar文件路径

image.png

编写测试文件

  1. cat > 测试文件名或路径 << EOF 输入几段文字和句子, 最后输入EOF作为结束符

  2. 首先使用hdfs dfs -mkdir /input 在hdfs中创建一个输入文件

  3. 然后使用hdfs dfs -put 测试文件的路径 /input上传到hdfs的/input文件夹中

  4. 输入hdfs dfs -cat /input/文件名 可以查看到内容成功上传

上传到Hadoop执行

使用hadoop jar指令, 在Hadoop上执行WordCount

hadoop jar /...省略.../WordCount.jar WordCount /input /output

这个命令的含义是:

    hadoop jar jar文件路径 类名 输入文件所在的文件夹 输出文件夹(输出文件夹不需要事先创建)

image.png

执行结果:

/output中出现个文件, _SUCCESS文件表示成功, part-r-00000文件中可以查看执行的结果(使用hdfs dfs -cat指令或在网页监控http://master:9870中的utilities\broswer the file system中查看 )

image.png

image.png

本文也发布在了CSDN:「Hadoop实战基础:从集群搭建到编程测试」