Hdoop完全分布式运行模式(2)----Linux

Hdoop完全分布式运行模式(2)----Linux
 
①Hadoop运行的前提是本机已经安装了JDK,配置JAVA_HOME变量
②在Hadoop中启动多种不同类型的进程
        例如NN,DN,RM,NM,这些进程需要进行通信!
        在通信时,常用主机名进行通信!
        
        在192.168.6.100机器上的DN进程,希望访问192.168.6.104机器的NN进程!
        需要在集群的每台机器上,配置集群中所有机器的host映射!
        配置:
            Linux:   /etc/hosts
        不配报错:  
                 DNS映射异常,HOST映射异常
③注意权限
        hadoop框架在运行需要产生很多数据(日志),数据的保存目录,必须让当前启动hadoop进程的用户拥有写权限!
 
    1.准备三台安装了Linux系统的电脑(或者安装了三台Linux的虚拟机)
        1.1关闭防火墙,静态ip,主机名称
            想xshell成功连接每一台linux,需要:
                (1)[admin @slave01~]# sudo vim /etc/hosts------在其余两台slave102,slave103上一样的操作
                                                        192.168.1.101 slave101------对应的普通用户为:admin
                                                        192.168.1.102 slave102------对应的普通用户为:admin
                                                        192.168.1.103 slave103------对应的普通用户为:admin
                            这里的192.168.1.101可以使用ifconfig查到自己Linux的ip地址
                  (2)  [root@master ~]# vim /etc/selinux/config
                    
                  (3)  [root@master ~]# systemctl status firewalld----查看防火墙是否关闭
                        [root@master ~]# systemctl stop firewalld----关闭防火墙
                        [root@master ~]# systemctl disable firewalld ---启动时不开防火墙
 
 
编写集群分发脚本xsync(master是伪分布式中的主机名,可以看我写的另一篇关于伪分布的文章)
         1.2将主机master中的/opt/module复制到3台客户机(我的三台主机分别叫slave101,slave102,slave103,创建的三个普通用户是:admin,admin,admin)
            1)复制
                        [root@master /]# scp -r /opt/module  root@slave101:/opt/module-------scp可以实现服务器与服务器之间的数据拷贝
                        [root@master /]# scp -r /opt/module  root@slave102:/opt/module
                        [root@master /]# scp -r /opt/module  root@slave103:/opt/module
            2)因为是在root下复制的,所以module之下的文件或目录的拥有者和拥有组都是root,这里需要改成admin(以主机slave101为例)
                        [root@slave101 ~ ] chown admin:admin -R /opt/module----R是表示递归,使得该文件夹之下的文件或目录都改变
                或     [admin@slave101 ~]sudo chown admin:admin -R /opt/module
            3)查看是否成功(以slave101为例)
                        [root@slave101 ~]# cd /opt/module     ----~表示当前账号的位置,即/home/root
                        [root@slave101 module]# ll
                          -
 
        1.3需要分别在/etc/profile中配置JAVA_HOME和HADOOP_HOME
                        [admin@master ~]$ sudo scp /etc/profile root@slave101:/etc/profile------将master中配置好的复制到slave101,slave102,slave103中
                        [admin@master ~]$ sudo scp /etc/profile root@slave102:/etc/profile
                        [admin@master ~]$ sudo scp /etc/profile root@slave103:/etc/profile
            是否复制成功(以slave101为例)
                        [admin@slave101 ~]$ cat /etc/profile
                           有这个说明成功了
        记住:
                     [admin@slave101 ~]$ source /etc/profile-----每台都需要,这相当于更新一下
 
这里很有可能会出现以下情况
                    [admin@slave101 ~]$java -version
                    [admin@slave101 ~]$ javac -version
,不同,是因为Linux自带的jdk没有删除
                    [root@slave101 ~]# rpm -qa|grep java
                    
                    [root@slave101 ~]# rpm -e --nodeps  java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64---将上面的Java开头的按这种方式删除
最后
                    [root@slave101 ~]# source /etc/profile
                    [root@slave101 ~]# java -version
                    [root@slave101 ~]# javac -version 
 
rsync远程同步工具
    主要用于备份和镜像。具有速度快,避免复制相同内容和支持符号链接的优点。
    rsync与scp区别:用rsync做文件的复制要比scp快,rsync只对差异文件做更新。scp是把所有文件都复制过去
例如:将master中的/opt/software目录同步到slave01的admin用户的/opt/software目录
[admin@master opt]$ rsync -rvl /opt/software/  admin@slave101:/opt/software
a:递归
v:显示复制过程
l:拷贝符号链接
 
 
xsync---集群分发脚本:目的是将一台客户机上所对应的文件夹之下的文件通过这个脚本文件直接发送到别的客户机上
1).放置脚本的地方----/home/admin/bin,admin用户可以在系统任何地方直接执行
[admin@slave101 ~]$ mkdir bin
[admin@slave101 ~]$ cd bin/
[admin@slave101 bin]$touch xsync 
[admin@slave101 bin]$ vim xsync
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
#校验参数是否合法
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=101; host<104; host++)); do
        echo ------------------- slave$host --------------
        rsync -rvl $pdir/$fname $user@slave$host:$pdir    
done
修改xsync的权限
[admin@slave101 bin]$ sudo chmod 777 xsync
[admin@slave101 bin]$ xsync /usr/local/bin
其中[admin@slave101 ~]$ basename /opt/module/hadoop-2.7.2-----结果为 :  hadoop-2.7.2
       [admin@slave101 ~]$ dirname /opt/module/hadoop-2.7.2-------结果为: /opt/moudle
cd -P:P表示追踪绝对路径
        [admin@slave101 ~]$ mkdir a
        [admin@slave101 ~]$ ln -s a b---------创建链接b->a
        [admin@slave101 ~]$ cd -P b---"-P"是对软链接进行操作的
,找到了a
pwd:显示当前的路径
whoami:表示当前的用户名
        [admin@slave101 ~]$ whoami----结果为:admin01
host=101;host<104;host++---表示主机IP地址的最后一位,如slave101的主机IP为192.168.1.101
 rsync -rvl $pdir/$fname $user@slave$host:$pdir---相当于:[admin@master ~]$ rsync -rvl /opt/module admin@slave101:/opt/module
 
测试
[admin@slave101 ~]$ cd /opt
[admin@slave101 opt]$ mkdir test
[admin@slave101 opt]$ cd test
[admin@slave101 test]$ touch t.txt
[admin@slave101 test]$ xsync test-----是否成功,可以去看slave102中的/opt中是否有test文件
 
(1).这里可能会遇到不能实现,则可以将xsync移到/usr/local/bin
[admin@slave101 ~]$ cd /home/admin01/bin
[ admin@slave101 bin]$ sudo mv xsync /usr/local/bin
[ admin@slave101 bin]$ cd /usr/local/bin
[admin@slave01 bin]$ sudo chmod 777 xsync    #修改权限
[admin@slave101 bin]$ xsync /usr/local/bin
这里我以前slave101对应的用户名为admin01,slave102对应的用户名为admin02------因为user只能得到slave101上的用户admin01,当实现 [admin01@slave101]$xsync /usr/local/bin时,出现错误,因为slave102对应的用户是admin02,user取不到该用户名, 所以我将所以的用户名改成了admin
但是在root下,[root@slave101]$xsync /usr/local/bin可以,因为user可以获得slave102,slave103的root用户
 
(2).可以在slave101,slave102,slave103中配置(以slave101为例)
    [root@slave101~]# vim /etc/hosts
    192.168.1.101 slave101
    192.168.1.102 slave102
    192.168.1.103 slave103
 
(3).为什么把脚本xsync放置在/home/admin/bin或者/usr/local/bin中,是因为
[admin@slave101 ~]$ echo $PATH----上面两个都在这个路径下,这表示可以在任何地方使用这个脚本,相当于win10中的环境变量的设置
 

 

集群配置

    1.集群部署规划

         slave101       slave102   slave103

 

    2.配置集群

        (1)核心配置文件

        配置core-site.xml

        [admin@slave101 ~]$ cd /opt/module/hadoop-2.7.2/etc/hadoop

        [admin@slave101 hadoop]$ sudo vim core-site.xml

fs.defaultFS用来告诉Hadoop这是个分布式系统还是本地,hdfs://....表示这是一个分布式系统

        (2)HDFS配置文件

        配置hadoop-env.sh

        [admin@slave101 hadoop]$ sudo vim hadoop-env.sh

        export JAVA_HOME=/opt/module/jdk1.8.0_144

        配置hdfs-site.xml

        [admin@slave101 hadoop]$ sudo vim hdfs-site.xml

        (3)YARN配置文件

        配置yarn-env.sh

        [admin@slave101 hadoop]$ sudo vim yarn-env.sh

        export JAVA_HOME=/opt/module/jdk1.8.0_144

        配置yarn-site.xml

        [admin@slave101 hadoop]$sudo vim yarn-site.xml

        (4)MapReduce配置文件

        配置mapred-env.sh

        [admin@slave101 hadoop]$ sudo vim mapred-env.sh

        export JAVA_HOME=/opt/module/jdk1.8.0_144

        配置mapred-site.xml

        [admin@slave101 hadoop]$ sudo vim mapred-site.xml

3.在集群上分发配置好的Hadoop配置文件

    [admin@slave101 hadoop]# xsync  /opt/module/hadoop-2.7.2/

    测试

    [admin@slave102 hadoop]$ cat core-site.xml

 

集群单点启动

    (1)如果集群是第一次启动,需要格式化namenode

    [adamin@slave101 hadoop-2.7.2]$ hadoop namenode -format

    (2)在slave101上启动namenode

    [admin@slave101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode

    [admin@slave101 hadoop-2.7.2]$ jps----看是否有namenode

    (3)在slave101,slave102,slave103上分别启动datanode

    [admin@slave101 hadoop-2,7,2]$ sbin/hadoop-daemon.sh start datanode

    [admin@slave102 hadoop-2,7,2]$ sbin/hadoop-daemon.sh start datanode

    [admin@slave103 hadoop-2,7,2]$ sbin/hadoop-daemon.sh start datanode

 

ssh免密码登录

    1.xshell免登陆linux(以主机slave103为例)

    (1).

    (2).一直点下一步,直到需要输入密码

    (3).点击保存文件到桌面(id_rsa_2048.pub)

(4).

[admin@slave103 ~]$cd .ssh----没有那个文件或目录

[admin@slave103 ~]$ ssh-keygen -t rsa -----连续点击回车键三下,出现如下图表示成功

ssh-keygen表示生成密钥,rsa表示非对称算法,即生成的私钥和公钥不同

图中的id_rsa表示私钥,id_rsa.pub表示公钥

[admin@slave103 ~]$ cd .ssh

[admin@slave103 .ssh]ll

    (5).使用工具Xftp 6将生成的公钥(桌面上的文件id_rsa_2048.pub)拖到/home/admin/.ssh

    (6).

[admin@slave103 .ssh] cat id_rsa_2048.pub >> authorized_keys---将xshell生成的公钥放入authorized_keys,该文件就是slave03该主机允许别的主机免密码访问自己存放别的主机的公钥的地方

[admin@slave103 .ssh]$ cat id_rsa_2048.pub

[admin@slave103 .ssh]$ cat authorized_keys

---一样

 

(7).在xshell中,右击Hadoop_Slave103,点击属性

    (8).点击用户身份验证

    (9).在xshell中右击Hadoop_Slave103,点击打开,就可以免密码连接了

 

2.主机slave103免密码登录主机slave101,slave101

(1).这里还需要配置ssh文件

     [admin@slave103 ~]$ sudo vim /etc/ssh/sshd_config

(2).[admin@slave103 ~]$ ssh-keygen -t rsa------ssh-keygen表示生成密钥,rsa:非对称算法,即生成的公钥和私钥不一样

(3).[admin@slave103 ~]$ cd .ssh

     [admin@slave103 .ssh]$ ssh-copy-id admin@slave101---即将slave103中的id_rsa.pub公钥复制到authorized_keys中,存放授权过得无密登录服务器公钥

        [admin@slave103 .ssh]$ ssh admin@slave101----成功

(4).[admin@slave103 .ssh]$ ssh-copy-id admin@slave103----将自己的公钥复制到自己的authorized中,即也可以通过ssh连接自己

(5).这里需要将slave101,slave102,slave103中的公钥分别复制到不同的主机,使得他们之间可以相互通信

注意:这里很有可能会出现slave101去ssh slave102,slave103,死活都连不上,但是slave102去ssh slave101,slave103一下子就连上了,在网上找了很久都没有找到原因,一气之下,把.ssh删了,重新来,就都可以了.

 

 

脚本--xcall---在集群的所有机器上批量执行同一条命令,比如

[admin@slave101 ~]$ xcall ifconfig----则会显示slave101,slave102,slave103的IP地址

创建过程

[admin@slave101 ~]$ cd bin 

[admin@slave101 bin]$ touch xcall

[admin@slave101 bin]$ vim xcall---加入如下内容:

#!/bin/bash

#在集群的所有机器上批量执行同一条命令

if(($#==0))

then

        echo 请输入您要操作的命令!

        exit

fi

        echo 要执行的命令是$*

#循环执行命令

for((i=101;i<=103;i++))

do

        echo-------------slave$i--------------

        ssh slave$i $*

done

[admin@slave101 bin]$ chmod u+x xcall

测试

[admin@slave101 ~]$ xcall jps

从图可以看到,该命令对于slave102不起作用,这是因为

[admin@slave101 ~]$ ssh admin@salve102

[admin@slave102 ~]$jps

[admin@slave101 ~]$ ssh admin@slave102 jps    这两种写法执行是不同的 

①ssh 目标机器

        登录之后,执行某个命令!

        属于Login-shell,会自动读取 /etc/profile文件中定义的所有的变量!

②ssh 目标机器  命令

        属于non-login-shell

        不会读取/etc/profile

        如果在使用命令时,我们需要使用/etc/profile定义的一些变量,需要在

        目标机器的对应的用户的家目录/.bashrc中添加以下代码

        source /etc/profile

        如果不添加以上代码,在执行start-all.sh | stop-all.sh一定会报错!

 

[admin@slave102 ~]$ ll -al----查看是否有隐藏文件.bashrc

[admin@slave102 ~]$ vim .bashrc

测试

[admin@slave101 ~]$ xcall jps

 

群起集群

    1.配置slaves

    [admin@slave101 hadoop-2.7.2]$ cd etc/hadoop

    [admin@slave101 hadoop]$ vim slaves

    加入slave101,slave102,slave103

 

    2.启动集群

        2.1如果是第一次启动,需要格式化Namenode

        2.2启动HDFS

        因为前面已经将namenode,datanode 启动了,先关闭

        [admin@slave101 hadoop-2.7.2]$ xcall sbin/hadoop-daemon.sh stop datanode

        [admin@slave101 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode

        2.3测试

        [admin@slave101 hadoop-2.7.2]$ xcall jps

 

        2.4启动HDFS

        [admin@slave101 hadoop-2.7.2]$sbin/start-dfs.sh

        2.5测试

        [admin@slave101 hadoop-2.7.2]$xcall jps

        2.6启动Yarn----NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。

        [admin@slave102 hadoop-2.7.2]$ sbin/start-yarn.sh

        2.7测试

        [admin@slave101 hadoop-2.7.2]$ xcall jps

3.集群测试

[admin@slave101 haoop-2.7.2]$ mkdir wcinput

[admin@slave101 hadoop-2.7.2]$cd wcinput

[admin@slave101 wcinput]$ touch wc.input

[admin@slave101 wcinput]$ vim wc.input

 

[admin@slave101 ~]$ hadoop fs -mkdir /input--创建文件

查看http://hadoop101:50070/dfshealth.html#tab-overview

点击

        ---创建成功

这里有一个疑问:

[admin@slave101 hadoop-2.7.2]$hadoop fs -mkdir input1,在/和hadoop-2.7.2上都可以创建,但都存在与/

[admin@slave101 hadoop-2.7.2]$ hadoop fs -put wcinput  /input/---将文件wcinput传入input中,点击input文件,出现下面结果,说明传入进去了

[admin@slave101 hadoop-2.7.2]$ cd share/hadoop/mapreduce

[admin@slave101 mapreduce]$ ll

 ----运行示例

[admin@slave101 mapreduce]$ hadoop jar hadoop-mapreduce-examples-2.7.2.jar wordcount     /input /wcinput/wc.input    /output                                                                                     例子                          计算词的个数的类名        数据的来源                   结果

 

---出现了output,点击output

----说明运行成功

xshell中查看

[admin@slave101 hadoop-2.7.2]$ hadoop fs -cat  /output/*

4.集群启动/停止方式总结

1.各个服务组件逐一启动/停止

    1).分别启动/停止HDFS组件

        hadoop-daemon.sh start/stop  namenode/datanode/secondarynamenode

    2).启动/停止yarn

        yarn-daemon.sh start/stop   resourcemanager/nodemanager

 

2.各个模块分开启动/停止

    1).整体启动/停止HDFS

            start-dfs.sh     /   stop-dfs.sh

    2).整体启动/停止yarn

            start-yarn.sh  / stop-yarn.sh

    3).包括HDFS和YARN的启动/停止(resourcemanager需要手动开启和停止)

            start-all.sh   /stop-all.sh

5.时间同步问题

[admin@slave101 ~]$ xcall date

-----时间不同步

[admin@slave101 ~]$ sudo ntpdate -u ntp7.aliyun.com----ntpdate是指通过ntp(网路时钟服务),自动请求一个服务器,把这个服务器的时间当成最新的时间(ntp7.aliyun.com为阿里云服务器)

[admin@slave101 ~]$ xcall date

---时间同步了

永久的

[admin@slave101 ~]$ crontab -e---点击回车,编辑

---将这句语句写入,即1个小时就同步一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值