Hadoop3.x新特性
根据官方change log介绍,hadoop3.x的一些新的特性,部分如下:
1、最低支持JDK1.8。不再支持JDK1.7。
2、Yarn Timeline版本升为2.0。
3、高可靠支持超过2个NameNode节点。如果配置3个NameNode和5个JournalNode。
4、默认端口变化,具体变化如下:
Namenode ports: 50470 --> 9871, 50070 --> 9870, 8020 --> 9820
Secondary NN ports: 50091 --> 9869, 50090 --> 9868
Datanode ports: 50020 --> 9867, 50010 --> 9866, 50475 --> 9865, 50075 --> 9864
更多变化,请参见hadoop 3.x官方文档,地址为:
http://hadoop.apache.org/docs/r3.1.1/index.html
同时增加用户配置如下:
配置用户在hadoop3.0中需要指定用户
在start-dfs.sh,stop-dfs.sh文件的头部增加:HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_SECURE_USER=root
在start-yarn.sh,stop-yarn.sh头部增加:
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root
具体过程:
Hadoop伪分布式安装与配置
Hadopp伪分布式,即在单机模式下运行Hadoop。在这种环境下,将运行一个NameNode进程和一个SecondaryNameNode进程,一个ResourceManager进程及一个NodeManager和一个DataNode进程。共5个进程。其中SecondaryNameNode用于帮助NameNode进行日志和镜像文件的合并。ResourceManger用于处理MapReduce任务,它运行在yarn之上。NodeManager用于处理与DataNode的通讯和数据处理,DataNode用于存取数据。
伪分布式可以让读者快速的学习hdfs的命令及开发Mapreduce应用。对于学习hadoop有很大的帮助。
在安装之前,笔者有以下建议:
Ø 配置静态ip地址。虽然是单机模式,但也建议配置静态的ip地址,这有助于以后配置集群环境时,养成良好的习惯。
Ø 修改主机名称serverXX,本机的ip地址为:192.168.56.51则可以修改本主机的名称为server51。
Ø 由于启动hadoop的各个进程使用的是ssh。所以,必须要配置本机免密码登录。本章后面的步骤会讲到如何配置ssh免密码登录。
Ø 关闭防火墙。如果你的CentOS7没有安装防火墙,可以不用关闭了,如果已经安装了,请检查防火墙的状态,如果是运行状态请关闭防火墙并禁用防火墙开机自动运行。
Ø 使用非root用户。笔者在写本书前看了很多其他的教程,这些教程大多以root用户做为操作用户。但在真实的环境中,一般root用户只做一些特殊的操作。所以,笔者还是建议使用非root用户。本书的作者为王健,所以,后面的操作,都以weangjian做为操作的用户。读者也可以自己创建一个用户。并将此用户添加到wheel组,以便于执行sudo命令。
步1、配置静态IP地址
使用ssh登录CentOS7。然后使用ifconfig查看ip地址,如果没有ifconfig命令,可以使用sudo yum -y install net-tools安装ifconfig命令。其实在centOS7中,已经使用ip addr命令显示当前主机的ip地址。所以,你也可以不安装net-tools。
$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.201 netmask 255.255.255.0
上例显示为两块网卡,其中enp0s3的ip地址为:10.0.2.15此网卡为NAT网络,用于上网。enp0s8的ip地址为:192.168.56.51,此网卡为HostOnly网络,用于与宿主机进行通讯。我们要修改的就是enp0s8这个网卡,将它的ip地址设置为固定ip。
ip设置保存在文件中,这个目录为:/etc/sysconfig/network-scripts/。使用cd命令,切换到这个目录下。使用ls显示这个目录下的所有文件,你可能只会发现:ifcfg-enp0s3这个文件,现在使用 cp命令将ifcfg-enp0s3拷贝一份为ifcfg-enp0s8。
$ sudo cp ifcfg-enp0s3 ifcfg-enp0s8
使用vim命令修改为静态ip地址:
$ sudo vim ifcfg-enp0s8
将原来的dhcp修改成static即静态的地址,并设置具体的ip地址。其中,每一个网卡,都应该具有唯一的UUID,所以建议修改任意的一个值,以便于与之前的enp0s3的uuid不同。部分修改内容如下:
BOOTPROTO="static"
NAME="enp0s8"
UUID="d2a8bd92-cf0d-4471-8967-3c8aee78d101"
DEVICE="enp0s8"
IPADDR="192.168.56.51"
现在重新启动网络:
$ sudo systemctl restart network.service
由于重新启动网络,会修改ip地址,所以,在重新启动网络以后,必须要使用新的ip地址重新登录。(建议使用xshell远程登录)。
ssh 192.168.56.51
步2、修改主机名称
使用hostname命令,检查当前主机的名称:
$ hostname
localhost
使用hostnamectl命令,修改主机的名称:
$ sudo hostnamectl set-hostname server51
重新检查主机名称,可以发现,已经修改成了server51。
步3、配置hosts文件
hosts文件是本地DNS解析文件。配置此文件,可以根据主机名找到对应的ip地址。
使用vi命令,打开这个文件,并在文件中追加以下配置:
$ sudo vim etc/hosts
192.168.56.51server51
步3、关闭防火墙
CentOS7默认情况下,没有安装防火墙。你你以通过命令sudo firewall-cmd --state 检查防火墙的状态,如果显示 command not found一般为没有安装防火墙,此步可以忽略。以下命令检查防火墙的状态:
#firewall-cmd --state
running
running表示,防火墙正在运行。以下命令用于停止和禁用防火墙:
#systemctl stop firewalld.service
#systemctl disable firewalld.service
步4、配置当前用户免密码登录自己
使用ssh登录另一台主机,必须要输入密码,即使登录当前主机也必须要输入密码,检查登录当前主机是否输入密码:
# ssh server51
wangjian@server51's password:
正如上面显示的,如果提示输入密码,则没有ssh免密码登录。可以使用ssh-keygen命令生成公钥和私钥文件,并将公钥文件拷贝到被ssh登录的主机上。以下是ssh-keygen命令,输入以后直接按两次回车即可以生成公钥和私钥文件:
#ssh-keygen -t rsa
生成的公钥和私钥文件,将被放到~/.ssh/目录下。其中id_rsa文件为私钥文件,rd_rsa.pub为公钥文件。现在我们再使用ssh-copy-id将公钥文件发送到目标主机。由于是登录本机,所以,直接输入本本的名称即可:
#ssh-copy-id server51
此命令执行以后,会在~/.ssh目录下,多出一个用于认证的文件,其中保存了某个主机可以登录的公钥信息,这个文件为:~/.ssh/authorized_keys。如果读者感兴趣,可以使用cat命令查看这个文件中的内容。
现在再使用ssh server51登录本机,你将发现,不用再输入密码,即可以直接登录成功。
步5、安装和配置hadoop
将hadoop的压缩包上传到目录/opt下。
解压到这个目录,使用tar命令:
#tar -zxvf /opt/hadoop-3.x.tar.gz -C /opt/
配置hadoop-env.sh文件
配置JAVA_HOME,在配置文件hadoop-env.sh文件中配置:
export JAVA_HOME=/usr/local/java/jdk1.8
配置core-site.xml文件
注意hadoop3.0以后hdfs的端口号建议为:9820。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://server51:9820</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/datas/tmp</value>
</property>
</configuration>
配置hdfs-site.xml文件
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/datas/dfs/nn</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/datas/dfs/dn</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>/opt/datas/dfs/snn</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
配置mapred-site.xml文件
$ vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.cluster.local.dir</name>
<value>/opt/datas/mapred/local</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
配置yarn-site.xml文件:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>server51</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/opt/datas/nm-local-dir</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
通过hadoop classpath命令获取所有classpath的目录,然后配置到上述文件中:
使用hadoop classpath即可获取所有classpath:
<property>
<name>yarn.application.classpath</name>
<value>
/opt/hadoop-3.x/etc/hadoop:/opt/hadoop-3.x/share/hadoop/common/lib/*:/opt/hadoop-3.x/share/hadoop/common/*:/opt/hadoop-3.x/share/hadoop/hdfs:/opt/hadoop-3.x/share/hadoop/hdfs/lib/*:/opt/hadoop-3.x/share/hadoop/hdfs/*:/opt/hadoop-3.x/share/hadoop/mapreduce/lib/*:/opt/hadoop-3.x/share/hadoop/mapreduce/*:/opt/hadoop-3.x/share/hadoop/yarn:/opt/hadoop-3.x/share/hadoop/yarn/lib/*:/opt/hadoop-3.x/share/hadoop/yarn/*
</value>
</property>
配置workers文件
这个文件在之前的版本叫做slaves,但功能一样。主要用于在启动时启动DataNode和NodeManager。
server51
配置用户在hadoop3.0中需要指定用户
在start-dfs.sh,stop-dfs.sh文件的头部增加:HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_SECURE_USER=root
在start-yarn.sh,stop-yarn.sh头部增加:
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root
步6、配置hadoop环境变量
可以以独立的方式配置环境变量,只需要在/etc/profile.d/目录下创建一个sh文件即可。这样做的好处是文件相对比较独立。
$ sudo vim etc/profile.d/hadoop.sh
并在里面添加以下内容:
#!/bin/sh
export HADOOP_HOME=/opt/hadoop-3.x
export PATH=.:$PATH:$HADOOP_HOME/bin
使用 source命令,让环境变量生效:
$source etc/profile
然后使用hdfs version查看命令环境变量是否生效,如果配置成功,则会显示hadoop的版本:
[wangjian@weric101 weric]$ hdfs version
Hadoop 3.x
步7、初始化hadoop的文件系统
hadoop在使用之前,必须要先初始化hdfs文件系统,初始化的文件系统将会生成为hadoop.tmp.dir配置的目录下,即上面配置的/opt/hadoop_tmp_dir目录下。
$hdfs namenode -format
在执行命令完成以后,请在输出的日志中,找到:
Storage directory /opt/hadoop_tmp_dir/dfs/name has been successfully formatted.
这句话,即为初始化成功。
步8、启动hdfs和yarn
启动和停止hdfs及yarne的脚本在$HADOOP_HOME/sbin目录下。其中start-dfs.sh为启动hdfs的脚本,start-yarn.sh为启动ResourceManager的脚本 。以下分另启动dfs和yarn:
$ hadoop-3.x/sbin/start-dfs.sh
$ hadoop-3.x/sbin/start-yarn.sh
启动完成以后,通过jps来查看java进程快照,你会发现有五个进程正在运行:
$ jps
2608 NameNode
2737 DataNode
3505 Jps
2898 SecondaryNameNode
3156 NodeManager
3055 ResourceManager
其中:NameNode、SecondaryNameNode、DataNode是通过start-dfs.sh脚本启动的。ResourceManager和NodeManager由start-yarn.sh脚本启动的。
在启动成功以后,也可以通过 http://server51:9870查看namenode的信息,如图2.3.1所示:

图2.3.1
可以通过http://192.168.56.101:8088查看mapreduce的信息,如图2.3.2所示:

图2.3.2
至此,hadoop单机即伪分布式模式安装和配置成功。但是万里长征,我们这才是小小的一步。以下将通过hadoop的hdfs命令,操作hadoop的hdfs文件系统。




