在Linux的Centos6.5搭建hadoop集群环境

Centos6.5搭建hadoop集群环境

先概括一下整体思路

  1. 安装centos6.5主机
  2. 关闭防火墙和selinux
  3. 配置网络
  4. 时间同步
  5. ssh无密码登录设置
  6. 安装jdk
  7. 安装hadoop
  8. 启动
  9. wordcount测试
  • 安装centos6.5主机
  1. 使用vmware创建三台centos操作系统

本人的三台主机名与IP如下:

master              192.168.9.128

slave1               192.168.9.129

slave2               192.168.9.130

  1. 添加用户

三台主机都添加相同名称与密码的普通用户,如 michael

useradd   michael

passwd    michael      --------设置密码

  1. 修改hosts文件

修改三台虚拟主机的hosts文件,保持一样

vi   /etc/hosts,  

追加:

192.168.9.128    master

192.168.9.129         slave1

192.168.9.130         slave2

  • 关闭防火墙与SELINUX

1、防火墙

#service iptables stop

#service ip6tables stop

这个命令可以临时关闭防火墙

 

#chkconfig iptables off

#chkconfig ip6tables off

这个命令可以永久关闭防火墙

 

#chkconfig iptables --list

#chkconfig ip6tables --list

这个命令可以查看防火墙的状态

2、SELINUX服务

# vi /etc/selinux/config

 

将文件里标红的部分改为disabled

 

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

 

重启后永久关闭selinux

 

#sestatus -v

这个命令可以查看selinux的状态

 

#setenforce 0

这个命令可以临时关闭selinux

 

 

 

三、配置网络

配置IP有两种方式:自动获取ip和设置静态IP

A、自动获取ip

# vi  /etc/sysconfig/network-scripts/ifcfg-eth0

ONBOOT=yes---------设置开机自动激活网卡

1、桥接模式:

相当于连接到物理机所在的网络中,与物理机的ip处在同一ip段位上,物理机网络的DHCP会自动分配ip给虚拟主机

2、Nat模式:

相当于连接到物理机的VMnet8网络中,与VMnet8处在同一ip段位上,同样,VMnet8会自动分配ip给虚拟主机

修改设置后,重置网络服务

#  service  network   restart

B、设置静态ip

只需要查看我注释的几项即可,没有就添加

1、桥接模式:

DEVICE=eth0

TYPE=Ethernet

UUID=edece2c6-947e-4e8b-ab2e-43ed59c6a614

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=static  ----------修改成staticnone都行

HWADDR=00:0C:29:5e:1f:c3

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

IPADDR=192.168.1.200   ----------设置成你想要的IP(与物理机在同一段位)

NETMASK=255.255.255.0   --------子网掩码

GATEWAY=192.168.1.1    ----------网关(与物理机一致)

 

 

2、Nat模式

DEVICE=eth0

TYPE=Ethernet

UUID=edece2c6-947e-4e8b-ab2e-43ed59c6a614

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=static     -----------修改成static

HWADDR=00:0C:29:5e:1f:c3

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

IPADDR=192.168.9.200    -----------设置成你想要的(VMnet8在同一段位即可)

NETMASK=255.255.255.0   --------子网掩码

GATEWAY=192.168.9.2   ----------网关(需设置成VMnet8提供的网关,一般结尾都是2)

DNS1=192.168.9.2     --------------DNS设置成与网关一致即可

 

PS:不管什么模式,去修改/etc/resolv.conf  添加

nameserver  网关ip

3、总结:

我们的目的是,三台主机能互相ping通,并能ping通物理机或者外网,以及物理机能ping通虚拟主机

四、时间同步

在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。

因此我们需要通过hwclock命令将系统时钟同步到硬件时钟。

 

1、查看系统当前时间

例子1

[root@master michael]# date

2018年 05月 10日 星期四 15:19:12 CST

 

例子2

[root@master michael]# date '+%y-%m-%d %H:%M:%S'

18-05-10 15:23:14

 

2、设置系统时间

#只有root权限才能设置,其他只能查看。

 

例子1:

[root@master michael]# date -s 20180510

2018年 05月 10日 星期四 00:00:00 CST

 

例子2:

[root@master michael]# date -s "20180510 15:18:00"

2018年 05月 10日 星期四 15:18:00 CST

3、Linux系统时间同步

一台机器时间好设置,如果是一个集群呢,很麻烦。这个时候,我们可以使用时间同步命令(此时,可以忽略第二步)

 

格式如下:

#  ntpdate      -u   时间服务器IP

 

例子1:

[root@master michael]# ntpdate -u time.windows.com

10 May 15:26:28 ntpdate[6453]: adjust time server 52.168.138.145 offset -0.010554 sec

 

若不加上-u参数, 会出现以下提示:no server suitable for synchronization found;连不上时间服务器IP也会出现此提示,这个时候可以换一个时间服务器。

 

-u:此参数可以越过防火墙与主机同步

最后,我们将系统时间同步到硬件时钟上,输入命令:

hwclock  -w

 

备注:    ntp常用服务器:

 

中国国家授时中心:210.72.145.44

NTP服务器(上海) ntp.api.bz

美国: time.nist.gov

复旦: ntp.fudan.edu.cn

微软公司授时主机(美国) time.windows.com

北京邮电大学 : s1a.time.edu.cn

清华大学 : s1b.time.edu.cn

北京大学 : s1c.time.edu.cn

台警大授时中心(台湾)asia.pool.ntp.org

五、ssh无密码登录

Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。

  1. SSH无密码原理

Master(NameNode)作为客户端,要实现无密码连接到服务器Slave(DataNode)上时,需要在Master上生成一个密钥对,即一个公钥和一个私钥,然后将公钥复制到所有的Slave上。当Master通过SSH连接Slave时,Slave就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码

我们所需要做的就是将客户端Maste的公钥复制到Slave上。

  1. Master无密码登录slave1

     使用普通用户进行设置,尽可能的不要使用root用户

  1. 生成密钥

输入命令:ssh-keygen –t     rsa 

一路回车下去,就会在相应的用户的主目录下生成隐藏目录.ssh。里面有一个私钥文件id_rsa和一个公钥文件id_rsa.pub

  1. 无密码登录自己

进入.ssh目录,将公钥文件更名为authorized_keys文件,即可实现ssh连接自己不再需要密码。确保authorized_keys的权限为600

$  mv    id_rsa.pub    authorized_keys

结果验证

ssh            localhost

成功后,最好删除id_rsa.pub文件

  1. 拷贝authorized_keys到虚拟主机slave1

首先要确保slave1的用户的主目录下有隐藏目录.ssh

没有的话,创建出来

$ mkdir  ~/.ssh

修改权限为700

$ chmod 700 ~/.ssh

然后拷贝

scp  ~/.ssh/authorized_keys  michael@slave1:~/.ssh/authorized_keys

输入yes,回车输入密码

  1. 结果验证

复制成功后,开始连接进行验证

ssh   michael@slave1

此时,发现连接slave1时,无需在输入密码了 ^_^

PS: master无密码登录slave2,就重复第三步和第四步

  1. slave1无密码登录master

依然使用普通用户michael进行设置

  1. 生成密钥

 通过输入命令:ssh-keygen  -t   rsa  ,一路回车,生成slave1的私钥和公钥文件

  1. 无密码登录自己

进入隐藏目录~/.ssh

将公钥文件内容追加到authorized_keys文件中。(注意,此时authorized_keys里已经存在master主机的公钥)

$  cat  id_rsa.pub  >>  authorized_keys

进行验证:ssh  localhost

  1. 拷贝公钥文件到master

我们需要将slave1的公钥备份到master主机上

scp   ~/.ssh/id_rsa.pub  michael@master:~/.ssh/id_rsa.pub_slave1

yes

输入密码,回车

  1. 追加slave1公钥文件到authorized_keys中

然后连接master,  将slave1的公钥追加到master的authorized_keys文件中

ssh   michael@master 输入密码登录

cat  ~/.ssh/id_rsa.pub_slave1 >>  ~/.ssh/authorized_keys

  1. 进行验证

退回到slave1中,

$  exit

进行验证,输入

$  ssh michael@master,  看看是否需要密码,应该成功。

 

如果想slave2无密码登录master,只需要重复slave1登录master的步骤即可

六、安装jdk

很多新手在安装软件时,安装路径都是模棱两可的,对于安装后产生的软件文件,存储位置更是乱七八糟,甚至一个目录中有好几个软件的相关文件。这是一个非常不好的习惯。所以,我们最好养成一个良好习惯,所有的软件都安装到某一个父目录中,比如:/home/michael/soft。然后我们在此目录下再创建相应软件名的子目录管理安装时产生的软件文件~~~如下:
/home/michael/soft/jdk

/home/michael/soft/hadoop

/home/michael/soft/eclipse

 

在这里,我只讲.tar.gz格式的jdk安装   (点这里进入jdk各个历史版本下载页面)

准备工作:使用普通用户michael 上传jdk-8u162-linux-x64.tar.gz安装包到master主机的目录soft下

第一步: 查看

查看是否安装过其他的jdk软件包:# rpm -qa | grep  java

第二步: 卸载

如果第一步中有查出安装过,此时需要切换到root用户下进行卸载。

 命令格式: # rpm -e --nodeps  软件包名

第三步:解压

注意:一定要切换回普通用户

将压缩包解压到当前目录下

$  tar   -zvxf   jdk-8u162-linux-x64.tar.gz

查看一下:ls

第四步: 建软链接文件

最好创建软连接,方便以后更换jdk版本时,不用更改环境变量配置

命令格式:

$ ln  -s  jdk1.8.0_162   jdk

第五步: 配置环境变量

配置环境变量有三种文件可修改(/etc/profile   ~/.bash_profile   ~/.bashrc),在这里,我选择了/etc/profile,这个文件需要切换成root用户

 

# vi  /etc/profile    --追加如下信息:

JAVA_HOME=/home/michael/soft/jdk

JRE_HOME=$JAVA_HOME/jre

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export  JAVA_HOME   JRE_HOME   CLASSPATH   PATH

第六步: 生效配置文件

重启机器

# reboot

或者也可以使用命令

# source /etc/profile

第七步:  测试

使用命令

$  java -version   回车

$  javac        回车

 出现信息翻滚,即配置成功

第八步:其他机器安装JDK

  • 其他两台虚拟主机slave1,slave2也可以安装上述步骤去安装。
  • 也可以使用scp命令将解压好的软件包和配置文件拷贝过去。拷贝时一定要思考,应该使用什么用户去做。否则出现权限问题。

我选择拷贝。

 

使用普通用户michael,拷贝安装包

$  scp  ~/soft/ jdk1.8.0_162  michael@slave1:~/soft/ jdk1.8.0_162

(ps:如果@slave1不好使的话,写slave1的IP地址)

使用root用户拷贝配置文件

#  scp  /etc/profile  root@slave1:/etc/profile

PS:如果slave1中没有soft目录,在拷贝时可能会出现错误,建议先创建出来

 

然后ssh连接slave1创建软链接。

$  ln  -s  jdk1.8.0_162   jdk

slave2亦是如此

 

PS:详情可见http://blog.sina.com.cn/s/blog_182e362f60102x0uh.html

 

七、安装hadoop

准备工作,使用普通用户将安装包hadoop2.7.3.tar.gz上传到master主机中的soft目录下

 

1、解压

$  tar  -zvxf    hadoop2.7.3.tar.gz

查看 $  ls

2、创建软连接

$  ln   -s   hadoop-2.7.3   hadoop

4、配置环境变量

此时,要切换到root用户下,进行修改文件/etc/profile,追加内容

HADOOP_HOME=/home/michael/soft/hadoop

PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_HOME PATH

 

保存退出,重置文件生效。hdfs  -version查一下

5、创建目录

我们需要在hadoop的根目录~/soft/hadoop下创建四个目录,用于进行存放以后产生的数据。 命令:mkdir     dfs   dfs/name   dfs/data   tmp

 

dfs是name和data的父目录

name:--------------------namenode实例的存储目录

data:---------------------datanode实例的存储目录

tmp:---------------------临时文件的存储目录

6、修改hadoop的配置文件

   我们需要修改hadoop中etc/hadoop下的六个文件:core-site.xml、hdfs-site.xml、

mapred-site.xml、yarn-site.xml、以及hadoop-env.sh、slaves

1)、修改core-site.xml

<configuration>

  <property>

        <name>fs.defaultFS</name>    #默认文件系统名称,用于指定host,post

        <value>hdfs://master:9000</value>

  </property>

  <property>

       <name>hadoop.tmp.dir</name>  #指定临时文件的存储路径

       <value>file:/home/michael/soft/hadoop/tmp</value>

  </property>

  <property>

       <name>io.file.buffer.size</name>  #用于指定序列文件的缓冲区大小

       <value>131702</value>

  </property>

</configuration>

2)、修改hdfs-site.xml

<configuration>

             <property>

                 <name>dfs.namenode.name.dir</name>      #用于指定namenode存储路径

            <value>file:/home/michael/soft/hadoop/dfs/name</value>

        </property>

        <property>

                <name>dfs.datanode.data.dir</name >  #用于指定datenode存储路径

                <value>file:/home/michael/soft/hadoop/dfs/data</value>

        </property>

        <property>

                <name>dfs.replication</name>  #用于指定副本个数

                <value>3</value>

        </property>

        <property>

                <name>dfs.namenode.secondary.http-address</name>  #二主节点的端口

                <value>master:9001</value>

        </property>

        <property>

                <name>dfs.webhdfs.enabled</name> 

                <value>true</value>        #启用webHDFS检测namenode和datanode

        </property>

</configuration>

3)、修改mapred-site.xml

此目录下没有该文件,我们需要将mapred-site.xml.template 复制一份,改成此名。

然后再修改:

<configuration>

         <property>

                 <name>mapreduce.framework.name</name>

                <value>yarn</value>

        </property>

        <property>

                <name>mapreduce.jobhistory.address</name>  # Server IPC host:port

                <value>master:10020</value>

        </property>

        <property>

                <name>mapreduce.jobhistory.webapp.address</name>

                <value>master:19888</value>      # Server Web UI host:port

        </property>

</configuration>

4)、修改yarn-site.xml

<configuration>

 

<!-- Site specific YARN configuration properties -->

         <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.resourcemanager.address</name> 

                <value>master:8032</value> 

       </property> 

       <property> 

                <name>yarn.resourcemanager.scheduler.address</name> 

                <value>master:8030</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.resource-tracker.address</name> 

                <value>master:8031</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.admin.address</name> 

                <value>master:8033</value> 

        </property> 

        <property> 

                <name>yarn.resourcemanager.webapp.address</name> 

                <value>master:8088</value> 

        </property> 

</configuration>

5)、修改hadoop-env.sh

打开此文件,重新设置JAVA_HOME的值。否则不能启动  

# The java implementation to use.

#export JAVA_HOME=${JAVA_HOME}

export JAVA_HOME=/home/michael/soft/jdk

6)、修改slaves文件

    打开此文件,删除默认的localhost,增加两个从节点

     slave1

slave2

7)、修改yarn-env.sh

我们最好也重新设置一下此文件的java_home

# export JAVA_HOME=/home/y/libexec/jdk1.6.0/

export JAVA_HOME=/home/michael/soft/jdk---------------------增加内容

if [ "$JAVA_HOME" != "" ]; then

 

7、拷贝文件

为了节省时间,不再重新配置hadoop的配置文件和profile,我们将hadoop整个安装包和profile通过scp命令 复制到另外两台slave1和slave2上的相应位置,不需要修改任何东西。

$  scp  -r  ~/soft/hadoop   michael@slave1:~/soft/ hadoop-2.7.3

$  scp  -r  ~/soft/hadoop   michael@slave2:~/soft/ hadoop-2.7.3

 

切换root用户

#  scp   /etc/profile  root@slave1:/etc/profile

#  scp   /etc/profile  root@slave2:/etc/profile

别忘记创建软链接文件

$  ln   -s   hadoop-2.7.3   hadoop

8、重启

此时,我们集群搭建成功了,为了确保配置文件生效,我们最好reboot所有的机器

八、启动集群

格式化

$  hdfs   namenode  -format           ------开始格式化分布式文件系统

格式化过程中:查看是否有什么warn:有的话,请百度,修正后再进行后续操作

 

ps:格式化文件系统就相当于格式化磁盘。频繁的格式化会出现master不能启动slave上的服务。

启动

$  start-all.sh  -----------启动集群

查看相关日志信息,有错排错

查看进程

Jps 

 

查看三台虚拟主机的hadoop相关进程

[michael@Master hadoop]$  jps           --------------------master四个进程

10210 Jps

9698 SecondaryNameNode

9864 ResourceManager

9497 NameNode

 

[michael@slave1 hadoop]$  jps                    --------------------slave1三个进程

8071 NodeManager

8279 Jps

7961 DataNode

 

[michael@slave2 hadoop]$  jps                    --------------------slave2三个进程

 

5266 NodeManager

5155 DataNode

5444 Jps

 

Web访问网页

192.168.9.128:50070

192.168.9.128:8088

都出现两个活跃节点,就完全配置成功

 

如果想使用master:50070 ,即用主机名代替ip,请修改window系统:

C:\Windows\System32\drivers\etc下的hosts文件,添加ip-hostname键值对

如:

192.168.9.128   master

关闭集群

stop-all.sh    关闭所有主机

总结

 如果格式化期间没有错误、警告等,以后调错,就不要再格式化,只需要进行 启动,关闭,启动等操作即可。

九、案例测试

     我们可以使用自带的一个单词统计程序wordcount 来统计某个文件内的信息。

     详情请访问:

http://blog.sina.com.cn/s/blog_182e362f60102x0mq.html

猜你喜欢

转载自blog.csdn.net/superXZT/article/details/82975077