• 关键字:Linux CentOS Hadoop Java
  • 版本: CentOS7 Hadoop2.9.0 JDK1.8
  • 说明:Hadoop从版本2开始加入了Yarn这个资源管理器,Yarn并不需要单独安装。只要在机器上安装了JDK就可以直接安装Hadoop,单纯安装Hadoop并不依赖Zookeeper之类的其他东西。


1.下载hadoop

本博文使用的hadoop是2.9.0
打开下载地址选择页面:
Hadoop各版本下载如图:



2.安装3个虚拟机并实现ssh免密码登录

2.1安装3个机器

安装3个机器,机器名称分别叫hserver1、hserver2、hserver3(说明机器名不这么叫可以,待会用hostname命令修改也行)。
如图:

2.2 修改这3台机器的/etc/hosts文件,在文件中添加以下内容:

vi /etc/hosts
192.168.8.203  hserver1
192.168.8.206  hserver2
192.168.8.207  hserver3

说明:为了免去后面一系列授权ping得通,以hserver1为例,在什么执行命令:

ping  -c 3  hserver2

如图:

2.3 给3个机器生成秘钥文件

以hserve1为例,执行命令,生成空字符串的秘钥(后面要使用公钥),命令是:

ssh-keygen  -t   rsa   -P  ''

如图:

因为我现在用的是root账户,所以秘钥文件保存到了/root/.ssh/目录内,可以使用命令查看,命令是:

ls    /root/.ssh/

如图:

2.4 在hserver1上创建authorized_keys文件

接下来要做的事情是在3台机器的/root/.ssh/目录下都存入一个内容相同的文件,文件名称叫authorized_keys,文件内容是我们刚才为3台机器生成的公钥。为了方便,我下面的步骤是现在hserver1上生成authorized_keys文件,然后把3台机器刚才生成的公钥加入到这个hserver1的authorized_keys文件里,然后在将这个authorized_keys文件复制到hserver2和hserver3上面。
首先使用命令,在hserver1的/root/.ssh/目录中生成一个名为authorized_keys的文件,命令是:

touch  /root/.ssh/authorized_keys

可以使用命令看,是否生成成功,命令是:

ls   /root/.ssh/

然后将hserver2和hserver3的id_rsa.pub分别改名为hserver2_rsa.pub和hserver3_rsa.pub,再将hserver2_rsa.pub和hserver3_rsa.pub两个文件传到hserver1的/root/.ssh目录下
如图:

然后将/root/.ssh目录中id_rsa.pub、hserver2_rsa.pub、hserver3_rsa.pub的内容复制到这个authorized_keys文件中,复制的方法很多了,可以用cat命令和vim命令结合来弄,也可以直接把这3台机器上的/root/.ssh/id_rsa.pub文件下载到本地,在本地将authorized_keys文件编辑好在上载到这3台机器上。
命令:

[root@localhost .ssh]# cat id_rsa.pub >> authorized_keys      
[root@localhost .ssh]# cat hserver2_rsa.pub >> authorized_keys
[root@localhost .ssh]# cat hserver3_rsa.pub >> authorized_keys

合并之后,我的hserver1机器上的/root/.ssh/authorized_keys文件内容是:

2.5 将authorized_keys文件复制到其他机器

hserver1机器的/root/.ssh/目录下已经有authorized_keys这个文件了,该文件的内容也已经OK了,接下来要将该文件复制到hserver2的/root/.ssh/和hserver3的/root/.ssh/。
复制的方法有很多,最简单的就是用SecureFX可视化工具操作。
复制完成后,可以看到三台机器的/root/.ssh目录下都有了这样的文件
我用的是scp命令传输:

[root@localhost .ssh]# ls
authorized_keys  hserver2_rsa.pub  hserver3_rsa.pub  id_rsa  id_rsa.pub  known_hosts

[root@localhost .ssh]# scp authorized_keys root@hserver2:/root/.ssh
root@hserver2's password: 
authorized_keys                                                          100% 1185     1.5MB/s   00:00

[root@localhost .ssh]# scp authorized_keys root@hserver3:/root/.ssh
root@hserver3's password: 
authorized_keys                                                          100% 1185     1.4MB/s   00:00

若是弹出提示输入yes,然后再输入那台机器的root密码就可以了
如图:

2.6 测试使用ssh进行无密码登录

2.6.1在hserver1上进行测试

输入命令:

ssh   hserver2

如图:
输入命令:

exit

如图:

2.6.2 在hserver2上进行测试
方法类似2.7.1,只不过命令变成了ssh hserver1和ssh hserver3,但是一定要注意的是,每次ssh完成后,都要执行exit,否则你的后续命令是在另外一台机器上执行的。

2.6.3 在hserver3上进行测试
方法类似2.7.1,只不过命令变成了ssh hserver1和ssh hserver2,但是一定要注意的是,每次ssh完成后,都要执行exit,否则你的后续命令是在另外一台机器上执行的。**



3.安装jdk和hadoop

说明,为了省去一系列获取管理员权限,授权等繁琐操作,精简教程,这里都是使用root账户登录并且使用root权限进行操作。

3.1 安装JDK
安装jdk在这里不在细数,如果有需要可以参考该博文:






在CentOS 7上安装JDK1.8



卸载 查看已经安装的jdk [root@bogon jre]# rpm -qa|grep jdk ...


http://taweb.top/index.php/2017/11/25/18.html


3.2 安装hadoop

3.2.1 上载文件并解压缩

在opt目录下新建一个名为hadoop的目录,并将下载得到的hadoop-2.9.0.tar上载到该目录下

进入到该目录,执行命令:

[root@localhost ~]# mkdir /opt/hadoop
[root@localhost ~]# cd /opt/hadoop
[root@localhost ~]# wget https://bbcbackup.oss-cn-shenzhen.aliyuncs.com/run/linux/hadoop-2.9.0.tar.gz

执行解压命令:

tar  -xvf   hadoop-2.9.0.tar.gz

3.2.2新建几个目录

在/root目录下新建几个目录,复制粘贴执行下面的命令:(注意三台机器都要在/root中新建这几个目录)

mkdir  /root/hadoop  
mkdir  /root/hadoop/tmp  
mkdir  /root/hadoop/var  
mkdir  /root/hadoop/dfs  
mkdir  /root/hadoop/dfs/name  
mkdir  /root/hadoop/dfs/data

3.2.3 修改etc/hadoop中的一系列配置文件

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop目录内的一系列文件。

3.2.3.1 修改core-site.xml

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop/core-site.xml文件
在<configuration>节点内加入配置:

<property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
   </property>
   <property>
        <name>fs.default.name</name>
        <value>hdfs://hserver1:9000</value>
   </property>

3.2.3.2 修改hadoop-env.sh

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop/hadoop-env.sh文件
将export JAVA_HOME=${JAVA_HOME}
修改为:
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
说明:修改为自己的JDK路径

3.2.3.3 修改hdfs-site.xml

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop/hdfs-site.xml文件
在<configuration>节点内加入配置:

<property>
   <name>dfs.name.dir</name>
   <value>/root/hadoop/dfs/name</value>
   <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
</property>
<property>
   <name>dfs.data.dir</name>
   <value>/root/hadoop/dfs/data</value>
   <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
</property>
<property>
   <name>dfs.replication</name>
   <value>2</value>
</property>
<property>
      <name>dfs.permissions</name>
      <value>false</value>
      <description>need not permissions</description>
</property>

说明:dfs.permissions配置为false后,可以允许不要检查权限就生成dfs上的文件,方便倒是方便了,但是你需要防止误删除,请将它设置为true,或者直接将该property节点删除,因为默认就是true。

3.2.3.4 新建并且修改mapred-site.xml
在该版本中,有一个名为mapred-site.xml.template的文件,复制该文件,然后改名为mapred-site.xml,命令是:

cp /opt/hadoop/hadoop-2.9.0/etc/hadoop/mapred-site.xml.template /opt/hadoop/hadoop-2.9.0/etc/hadoop/mapred-site.xml

修改这个新建的mapred-site.xml文件,在<configuration>节点内加入配置:

<property>
    <name>mapred.job.tracker</name>
    <value>hserver1:49001</value>
</property>
<property>
      <name>mapred.local.dir</name>
       <value>/root/hadoop/var</value>
</property>
<property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
</property>

3.2.3.5 修改slaves文件

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop/slaves文件,将里面的localhost删除,添加如下内容:

hserver2  
hserver3

3.2.3.6 修改yarn-site.xml文件

修改/opt/hadoop/hadoop-2.9.0/etc/hadoop/yarn-site.xml文件,
在<configuration>节点内加入配置(注意了,内存根据机器配置越大越好,我这里只配2个G是因为机器不行):

<property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hserver1</value>
   </property>
   <property>
        <description>The address of the applications manager interface in the RM.</description>
        <name>yarn.resourcemanager.address</name>
        <value>${yarn.resourcemanager.hostname}:8032</value>
   </property>
   <property>
        <description>The address of the scheduler interface.</description>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>${yarn.resourcemanager.hostname}:8030</value>
   </property>
   <property>
        <description>The http address of the RM web application.</description>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>${yarn.resourcemanager.hostname}:8088</value>
   </property>
   <property>
        <description>The https adddress of the RM web application.</description>
        <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>
        <description>The address of the RM admin interface.</description>
        <name>yarn.resourcemanager.admin.address</name>
        <value>${yarn.resourcemanager.hostname}:8033</value>
   </property>
   <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
   </property>
   <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
        <discription>每个节点可用内存,单位MB,默认8182MB</discription>
   </property>
   <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
   </property>
   <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
</property>
   <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
</property>

说明:yarn.nodemanager.vmem-check-enabled这个的意思是忽略虚拟内存的检查,如果你是安装在虚拟机上,这个配置很有用,配上去之后后续操作不容易出问题。如果是实体机上,并且内存够多,可以将这个配置去掉。

当以上步骤都完成后hadoop也就配置完成了,最后将已经配置好的/opt/hadoop目录复制到hserver2和hserver3的/opt目录下(注意hserver2和hserver3安装的JDK的路径必须要和hserver1的路径一致)
还是用scp命令传输:

scp -r /opt/hadoop root@hserver2:/opt/ 
scp -r /opt/hadoop root@hserver3:/opt/



4.启动hadoop

4.1在namenode上执行初始化

因为hserver1是namenode,hserver2和hserver3都是datanode,所以只需要对hserver1进行初始化操作,也就是对hdfs进行格式化。
进入到hserver1这台机器的/opt/hadoop/hadoop-2.9.0/bin目录,也就是执行命令:

cd   /opt/hadoop/hadoop-2.9.0/bin

执行初始化脚本,也就是执行命令:

./hadoop  namenode  -format

如图:
稍等几秒,不报错的话,即可执行成功,如图: 
格式化成功后,可以在看到在/root/hadoop/dfs/name/目录多了一个current目录,而且该目录内有一系列文件

4.2在namenode上执行启动命令

因为hserver1是namenode,hserver2和hserver3都是datanode,所以只需要再hserver1上执行启动命令即可。
进入到hserver1这台机器的/opt/hadoop/hadoop-2.9.0/sbin目录,也就是执行命令:

cd    /opt/hadoop/hadoop-2.9.0/sbin

执行初始化脚本,也就是执行命令:

./start-all.sh

第一次执行上面的启动命令,会需要我们进行交互操作,在问答界面上输入yes回车
如图:



5.测试hadoop

haddoop启动了,需要测试一下hadoop是否正常。
执行命令,关闭防火墙,CentOS7下,命令是:

systemctl   stop   firewalld.service

hserver1是我们的namanode,该机器的IP是192.168.119.128,在本地电脑访问如下地址:http://192.168.119.128:50070/
自动跳转到了overview页面
如图:
在本地浏览器里访问如下地址:192.168.119.128:8088自动跳转到了cluster页面
如图:



Hadoop退出安全模式

hadoop为了防止数据丢失,启动了“安全模式”的设置,每次启动hadoop后一段时间内集群处于安全模式,该模式下集群会检查各节点文件块的记录,如果数据块中满足replication设置值的数据块的数量在总数据块数量中所占比例没有超过一定值(称为安全模式阀值,默认为0.999f),那么集群将持续处于安全模式,在该模式下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入 安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

但是如果是在小型测试集群,往往因为结点数量较少,很可能导致集群一直处于安全模式无法自动退出,这种情况下我们可以通过两种方式进行设置:

1.在HDFS配置文件中修改安全模式阀值

在hdfs-site.xml中设置安全阀值属性,属性值默认为0.999f,如果设为1则不进行安全检查

<property>
  <name>dfs.safemode.threshold.pct</name>
  <value>0.999f</value>
  <description>
    Specifies the percentage of blocks that should satisfy
    the minimal replication requirement defined by dfs.replication.min.
    Values less than or equal to 0 mean not to wait for any particular
    percentage of blocks before exiting safemode.
    Values greater than 1 will make safe mode permanent.
  </description>
</property>

因为是在配置文件中进行硬修改,不利于管理员操作和修改,因此不推荐此方式

2.直接在bash输入指令脱离安全模式(推荐)

在安全模式下输入指令:

hadoop dfsadmin -safemode leave