Hadoop浅学习&实践学习——初级2.1[真实分布集群]

来源:互联网 发布:电梯优化问题奇偶 编辑:程序博客网 时间:2024/06/04 00:24

20161217 10:58——15:56;17:06——

操作备注:本博文基于《Hadoop浅学习&实践学习——初级1.0》和《Hadoop浅学习&实践学习——初级2.0[真实分布集群]》的实践经验,用于记录第二次部署实分布集群环境(别于单机版的伪分布)的实践流程。并最后梳理出干净利落、简洁实用的操作步骤。

参考链接:

  前两篇分别是伪分布实践和初级全分布实践中主要参考的文章,后两篇是更为全面、专业细致的全分布式模式环境部署相关的博文
      CentOS 6.5下Hadoop1.1.2环境搭建(单机版)
      http://www.linuxidc.com/Linux/2014-08/105268.htm
      Hadoop基础教程之分布式环境搭建
      http://www.kwstu.com/ArticleView/hadoop_201408181042089382
       Hadoop集群完全分布式模式环境部署
      http://blog.chinaunix.net/uid-25266990-id-3900239.html
       Centos6.4 +Hadoop 1.2.1集群完全分布模式配置(类似于上一博文,但有介绍hadoop管理命令)
      http://hao360.blog.51cto.com/5820068/1340598/

 操作步骤:

   环境说明:内部网络;运行linux的是Vmware平台;三台最小化安装的linux是CentOS6.5[final],32位系统;安装包有:jdk-7u79-linux-i586.tar.gz(32bit版本)、hadoop-1.2.1-bin.tar.gz(二进制安装包)

   逻辑说明:三台linux主机将分别命名为hadoop4、hadoop5、hadoop6,静态IP依次为192.168.0.46、192.168.0.56、192.168.0.66,其中hadoop4作为分布集群架构中的主节点,5和6作为slave节点。

一 . 配置三台CentOS6.5的主机名,并绑定指定主机名和各自IP

   主机名的配置文件是 /etc/sysconfig/network

   用于配置网卡的配置文件是 /etc/sysconfig/network-scripts/ifcfg-eth0  #Vmware中最小化方式安装centos后默认只有一块网卡eth0,对应的就是这一个配置文件

   用于绑定主机名和IP的配置文件是 /etc/hosts  #友情提示:在win7中这样的文件是 C:\Windows\System32\drivers\etc\hosts

   1.1依次将三台linux的主机名设定为hadoop4、hadoop5、hadoop6

     具体做法:

     (1)编辑方式打开/etc/sysconfig/network文件;(2)用对应的(想要设定为的)主机名替换文件中关键字HOSTNAME=“后面的字符串;(3)而后保存退出,即可。需要注意的是:如此,修改后需要重启系统,改动后的主机名才会生效。我的本次实践中看,主机名分别为hadoop4、hadoop5、hadoop6 。

   1.2 绑定主机名或别名和对应IP,在三台linux中

    默认安装完CentOS之后,eth0网卡是禁用状态,所以,首先启用网卡,通过命令行执行”ifconfig eth0 up“

    而后,具体做法:

     (1)编辑方式打开/etc/sysconfig/network-scripts/ifcfg-eth0;(2)将”ONBOOT=no“中的”no“修改为”yes“,表示网卡会随机启动(3)将”BOOTPROTO=dhcp“一行通过在行首添加注释符号”#“的方式注释掉,使之失效;(4)在文件末尾手动添加两行”IPADDR=192.168.0.XY“和”GATEWAY=192.168.0.1“,其中XY指代想要分配的内网IP,在我的实践中分别是46、56、66,即192.168.0.46等;(5)而后保存退出;(6)执行命令”service network restart“重启网络服务,使得配置生效。

    再而后,绑定主机名和IP的具体做法:

     (1)编辑方式打开/etc/hosts文件;(2)将主机名和对应的IP信息写入到该文件中 ,主机名或别名同IP之间要有间隔;(3)保存退出,即可。

      友情提示:这样做的好处 简单地说是在测试三台主机相互之间网络连接状态的时候除了可以使用”ping 192.168.0.XY“还可以使用”ping hadoopX“,即是说比如,在hadoop4主机中测试与hadoop5 之间的网络状况,可以使用”ping 192.168.0.56“或”ping hadoop5“两种方式,如果主机名简短一些,会更便于测试。而这其中的原理,简单地说在于主机访问一个域名的时候,首先会从本机的hosts文件中读取相关信息。

      上面三个配置文件修改之后,如下所示:

     

     

     


二、设定三台linux主机间相互由SSH免密登录

    备注:本次实践中将hadoop4设定作为主节点,hadoop5和6两台设定作为slave节点,这里的三台linux相互由SSH免密登录指代的是 由主节点到slave节点之间的SSH方式相互免密码登录,即hadoop4分别与hadoop5、hadoop6之间相互免密登录,不涉及作为slave节点的两台主机之间的免密码登录。

    具体做法:

   默认最小化安装的CentOS6.5[final]是没有ssh、ssh-keygen、scp等命令的,即是说,有ssh的服务端,但没有ssh客户端。所以要想使用这些个命令,首先安装ssh的客户端,通过在命令行执行”yum -y install openssh-5.3p1-118.1.el6_8.i686 “来进行。

    友情提示:这一点(安装包及命令的关系[是否是包含我们需要的命令])可以通过命令行执行”yum whatprovides */ssh“或”yum whatprovides */ssh-keygen“等来确定。

    2.1 在hadoop4中生成rsa文件并生成authorized_keys文件

   (1) 在安装完openssh-5.3p1-118.1.el6_8.i686之后,执行命令”ssh-keygen -t rsa”来生成关于rsa的两个文件:id_rsa和id_rsa.pub。

    在执行命令”ssh-keygen -t rsa”的过程中会出现交互信息,直接回车就可以,第一次交互是要指定rsa文件的存放路径,直接回车就会在命令默认设定路径下生成文件;第二、三次交互是要输入id_rsa的口令,要想实现SSH方式免密登录,最核心的就在这里:直接回车,就像交互提示中说明的那样:empty for no passphrase。在一次实践中发现(并不绝对是这样),其实这里口令的输入只能有两个,一是与当前用户相同的系统口令,二是直接回车的空口令(那次实践中发现输入非用户口令会遇到问题:Saving the key failed: /root/.ssh/id_rsa.)。命令”ssh-keygen -t rsa”的执行效果如下图:

     

     

    备注1:关于id_rsa和id_rsa.pub这两个文件的使用,后者id_rsa.pub首先用在生成rsa文件的主节点主机中将其复制一份重命名为authorized_keys,前者id_rsa用于将其拷贝一份到想要通过SSH方式免密登录主节点主机的其他linux系统主机中对等相同的路径下,比如本次实践中在hadoop4中生成rsa文件到默认的/root/.ssh/路径下,欲实现hadoop5通过SSH方式免密登录hadoop4,那么需要将id_rsa复制到主机hadoop5的/root/.ssh/路径下。综上,二者结合,hadoop4中在基于公钥文件id_rsa.pub复制生成文件authorized_keys之后,拥有了hadoop4生成的is_rsa文件的hadoop5就能够通过SSH方式免密登录到hadoop4系统中。

    备注2:(1)在完成了免密登录的前期设置之后(基于“备注1”),可以通过命令“ssh localhost”在生成rsa的主机本机中测试是否设定成功,也可以在拷贝了生成rsa文件主机的id_rsa文件的第二台主机中通过命令“ssh 192.168.0.46”或“ssh hadoop4”来测试由SSH方式免密登录设定是否成功。(2)但是,需要高度(!!)注意的是,即使前期SSH方式免密登录设定是正确的,免密登录也不一定能顺利实现。这种情况一般是因为操作系统安全机制的问题,默认CentOS系统安装完成后防火墙中是有ssh服务端口的匹配策略的,在iptables服务开启状态下这时iptables方面可以排除,剩下的重点就在于selinux了!经检验,在selinux开启状态下一般会存在设定正常,但免密登录失败!(因系统而已,有的系统selinux开启状态下并不影响SSH方式免密登录的实现,所以“一般”而非“绝对”)

   友情提示1:本次实践中通过ssh_keygen生成的是rsa文件,据说还有一种是dsa文件,RSA 认证是 ssh 密钥认证的最初形式,ssh 协议的版本 1 使用的是 RSA 密钥,而 DSA 密钥却用于协议级 2,这是 ssh 协议的最新版本。这点可以参考:理解OpenSSH的RSA和DSA认证过程 https://my.oschina.net/lionel45/blog/381207

   友情提示2:查看selinux状态的命令为”getenforce“;临时关闭selinux服务的命令为”setenforce 0“;永久关闭selinux服务的命令为”vi /etc/sysconfig/selinux“(编辑方式打开/etc/sysconfig/selinux),将”SELINUX=enforcing“一行字段”enforcing“修改为”disabled“。

     

   (2)在与rsa文件相同目录下基于公钥生成名为authorized_keys的文件

       通过如下命令:

        cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

    友情提示:这样做的原理(理论),在于ssh服务端的配置文件 /etc/ssh/sshd_config中的默认设定的服务规则”AuthorizedKeysFile     .ssh/authorized_keys“中规定的公钥文件为authorized_keys。

        效果图如下:(这里的截图是主机Admin中的案例重现)

     

   备注:这样设定在hadoop4本机生成名为authorized_keys的文件后,已经可以实现本机SSH方式免密登录自己,意义似乎不大,但是一种检测设定成功与否的方式,如下:

     

      (3)修改id_rsa文件的权限——高级别

          执行命令 ”chmod 600 /root/.ssh/id_rsa“

         备注1: 否则,完成上面的操作后,在hadoop4中尝试免密登录hadoop4本机时会提示该目录的权限过于开放(Permissions 0644 for ‘/root/.ssh/id_rsa’ are too open),并要求输入hadoop4主机的root密码——免密登录失败。(不提高id_rsa文件的权限,自己免密登录到自己都会失败)

         备注2:高级别权限是说能访问该文件或目录的用户有限、很少,低级别权限是说大多数用户都能访问。

        关于id_rsa文件自身权限与其所在目录权限的设定对ssh方式免密登录成功的影响,见下图:

        

        

      另外,关于selinux开启与否与SSH免密登录设定成功后能否顺利实现免密登录的关系,见下图:

         

  

   20161217 17:06——20:19

    2.2 将id_rsa文件拷贝到hadoop5对等路径下(实现从hadoop5由SSH方式免密登录到hadoop4)

     (1)在主机hadoop5中root的家目录下手工创建名为”.ssh“的目录,执行mkdir .ssh (首先必须手工创建这样的目录!)

     (2)在 主机hadoop4中将id_rsa文件远程传送到主机hadoop5中对等路径下,执行 scp /root/.ssh/id_rsa root@hadoop5:~/.ssh/  (其中”~“等效于”/root“)

     (3)在主机hadoop5中将目录”.ssh“的权限属性值设定为750,或说保持默认,至少要保证不能是777

     

     2.3将id_rsa.pub文件拷贝到hadoop5对等路径下并重命名(实现从hadoop4由SSH方式免密登录到hadoop5)

      为了实现这个功能,作为slave结点的主机hadoop5的公钥文件中必须要包含作为主结点主机的公钥信息,这样作为主节点的hadoop4就可以顺利安全地访问这slave结点hadoop5了。在hadoop5中执行如下命令:
      cd  ~/.ssh  #进入hadoop5主机root用户的家目录下的子目录.ssh中

      scp root@hadoop4:~/.ssh/id_rsa.pub ./authorized_keys   #执行scp命令远程索取hadoop4中的id_rsa.pub文件并重命名为文件authorized_keys放到当前目录下

      备注:(1)保持authorized_keys文件的默认传送过来时的权限属性就好,最小权限不能低于644,如不能是664(相比id_rsa文件权限属性默认的644是不可行的,这里公钥文件的权限属性值要宽泛一些);(2)保证hadoop5中的selinux服务是关闭着的。(做了设定SSH免密登录的前期工作后,通过ssh登录目标主机(不论是本机登录自己还是登录其他主机)时,若目标主机是开着selinux服务的,一般地,免密登录都将失败);(3)基于2.2和2.3的操作,要注意到的是,所需要的rsa两个文件都是由作为主节点主机的hadoop4生成的!

      如此,基于本环节的设定后,hadoop4便能够通过SSH免密登录到hadoop5中了。详见下图:

      

      

      接下来,借鉴hadoop4与hadoop5之间通过SSH相互免密登录的实现,完成hadoop4到hadoop6之间的相互免密登录的设定

      小结:主节点主机到slave节点主机之间通过SSH相互免密登录的实现中,(1)所需要的rsa两个文件都是由作为主节点主机的hadoop4生成的。(2)id_rsa文件设定权限为600原样拷贝到hadoop5对等路径下,id_rsa.pub文件权限属性可以保持默认644拷贝到hadoop5对等路径下并重命名为文件名为authorized_keys的文件。(3)保证通过SSH登录之前目标主机的selinux服务是关闭状态(不论是自己登陆自己,还是登录到别机,登录的对象就是目标主机) 这样三个环节的操作,就可以实现主节点与slave节点间的免密登录。

       另外,其实,实现了主节点主机与slave节点主机之间的SSH方式相互免密登录,作为slave节点的各个主机之间也就可以通过SSH相互免密登录了。

     

     

     

三、基础环境准备——搭建java环境

      3.1 上传jdk压缩包文件到hadoop4中

        (1)把jdk-7u79-linux-i586.tar.gz(32bit版本)文件通过winscp工具上传到haddop4的root家目录中

        (2)进入/usr/local路径下,cd  /usr/local

        (3)将jdk压缩包解压到当前目录中,tar xzvf  /root/jdk-7u79-linux-i586.tar.gz

        (4)为解压后的jdk安装目录创建软连接,ln -s jdk1.7.0_79 java (非必要,唯便捷尔)

        (5)将java加入全局环境配置,vim /etc/profile,编辑方式打开/etc/profile并在文件底部添加如下内容:

            #====JAVA--JDK-env===================================
            export JAVA_HOME=/usr/local/java
            export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
            export PATH=$PATH:$JAVA_HOME/bin
        (6)更新profile的内容,使得改动立即生效,source /etc/profile

         (7)检查java的安装效果和全局环境变量的设定,java -version,效果分别如下:

        

        

     备注:包含主机名的设定、主机名或别名与IP的绑定、安装ssh客户端、关闭selinux服务、java环境的搭建等这些基础运行环境,除了作为主节点的hadoop4要设定外,作为slave节点的hadoop5和6也要进行配置、部署,并且要与主节点主机中的配置完全一致。

四、核心应用部署——安装并运行hadoop

      4.1在主节点主机hadoop4中完成hadoop应用的安装和全局环境的配置

          (1)将hadoop二进制安装包hadoop-1.2.1-bin.tar.gz 上传到hadoop4主机root用户的家目录下,通过winscp工具

          (2)进入/usr/local路径下,cd  /usr/local

          (3)将hadoop安装包解压到当前目录下(二进制安装包,解压完成就是安装完成),tar xzvf  /root/hadoop-1.2.1-bin.tar.gz

          (4)为hadoop的安装目录创建软连接,ln -s  hadoop-1.2.1  hadoop

          (5)将hadoop加入全局环境配置,vim /etc/profile,编辑方式打开/etc/profile并在文件底部添加如下内容:

            #=========hadoop-env=============
            export HADOOP_HOME=/usr/local/hadoop
            export PATH=$PATH:$HADOOP_HOME/bin

           

           (6)更新profile的内容,使得改动立即生效,source /etc/profile

           (7)检查全局环境配置的效果,在任意路径|位置下输入start后按tab键,会显示出位于/usr/local/hadoop中的备选命令

           

           或通过执行命令cd来查看,cd $HADOOP_HOME,可以看出该变量是否等价于/usr/local/hadoop,如下:

           

20161218   10:30——14:45

    4.2 在主节点主机hadoop4中完成hadoop应用的初始化配置

         备注:hadoop应用需要配置的文件有/usr/local/hadoop/conf下的:masters、slaves、hadoop-env.sh(文件中HADOOP_CLASSPATH的配置是可选的)、core-site.xml、hdfs-site.xml、mapred-site.xml

        学习备注:在$HADOOP的conf目录中编辑方式打开配置文件的时候,除了文件master可以被tab自动补全外,core-site.xml等均不能被自动补全,这里涉及到的配置有/root/.bashrc 和 /etc/bashrc  有待分解。——已解除,在hadoop的一级目录下也存在masters文件,而编辑也正是在$HADOOP当下执行的,而非子目录conf下。

      (1)masters和slaves的配置,指定分布集群的主节点主机和slave节点主机

        分别先后以编辑方式打开masters和slaves文件,分别将其中默认的”localhost“字段改为”hadoop4“和”hadoop5“、”hadoop6“,而后保存退出。如下:

     

     

      (2)hadoop-env.sh的配置,设定java环境

     

     (3)core-site.xml的配置,配置HDFS的IP地址或主机名 和端口号

        fs.default.name是NameNode的URL

     

     (4)hdfs-site.xml的配置,配置hadoop的namenode和datanode相关文件的存储 和 slave节点主机数量

      dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。

      dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。

      dfs.replication是数据需要备份的数量,对应于slave节点主机的数量,(据说默认是3,这应该是yum或源码包安装时的默认值),如果此数大于集群的机器数会出错。
      此处的name1和data1等目录不能提前创建,如果提前创建会出问题。

     

     (5)mapred-site.xml的配置,配置JobTracker的IP地址或主机名 和端口号

      mapred.job.tracker是JobTracker的主机(或者IP)和端口

     备注:《Hadoop浅学习&实践学习——初级2.0》中mapred-site.xml文件的配置里,错将主机”hadoop0“写作了”hadoop“,或许是slave主机中进程没全启动的另一个原因(第一个原因是iptables中没有匹配某些端口号或者没有禁用iptables服务)

     

   4.3 将hadoop4中的hadoop安装目录传动到hadoop5和6对等路径下

      scp -r hadoop-1.2.1/ hadoop5:/usr/local  #到主节点主机hadoop4的/usr/local目录下,执行scp命令将目录传送到slave节点主机上对应的/usr/local中。在slave节点中执行相应的scp命令也可以,反正可以相互免密登录。

      scp -r hadoop-1.2.1/ hadoop6:/usr/local

   4.4 为hadoop5和6中的hadoop安装目录创建软连接

     

   4.5 为hadoop5和6中的hadoop应用创建全局环境配置

     

   4.6 在hadoop4中启动hadoop进程,执行格式化和启动脚本

    (1)hadoop namenode -formate

     

    (2)start-all.sh

     

   4.7 检查进程信息和hadoop网页服务

    (1)jps   #该命令包含在jdk安装包中,要想使用则必须部署了java环境并且设定了全局环境配置

     

     

     

    (2.1)为50070、50030添加iptables端口匹配策略或关闭iptables服务

    (2.2)192.168.0.46:50030  ; 192.168.0.46:50070

      

     

     (3)终端查看集群状态,hadoop dfsadmin -report

      备注:或许因为上面namenode启动失败的原因,下面没有看到集群状态信息

     

     


操作备注:下一步要处理的是本博文2.1实践记录中namenode进程启动失败的问题。

20161218 21:26——21:45(重新部署hadoop应用并实践成功)——23:24(记录并总结)

操作备注:将实践失败的hadoop实分布|全分布集群环境(核心的hadoop服务)搁浅,新建。梗概如下: 将hadoop4中二进制方式安装的hadoop的安装目录重命名搁置起来,删除该目录的软连接,hadoop5和6中也如此。而后hadoop4中重新解压安装hadoop应用到/usr/local路径下并新建安装目录的软连接,再而后仿照先前做法,分别将该目录一并远程传送到hadoop5和6中对等路径下,并为之新建软连接。——二进制方式部署应用服务的好处就在于便捷,可以从繁琐的安装搭建过程中解脱出来,在当前应用出现问题的时候,便于新装替换,通过案例重现的方式,尝试新的配置来排查、处理问题。

  备注:推到重来,将”四、核心应用部署——安装并运行hadoop“中4.2及以后的部分操作全部搁浅放置,重做4.2及以后的部分。

   推倒操作:首先进入到/usr/local路径下,而后:

   (1)mv hadoop-1.2.1/ hadoop-1.2.1-bak  #将先前的安装目录重命名搁置起来

   (2)rm -rf  hadoop #删除先前安装目录的软连接

      备注:hadoop5和6主机中做同样的处理操作。

   重来操作:

     (1)tar xzvf ~/hadoop-1.2.1-bin.tar.gz  #重新从hadoop4主机root用户的家目录中将hadoop安装包解压到/usr/local路径下

     (2)ln -s hadoop-1.2.1/ hadoop #为新的安装目录创建软连接

      备注:如此做法中,不需要为新的hadoop应用配置全局环境,接着使用先前应用的配置就可以。接下来回到到4.2步骤中,进行后操作流程。下面主要记录新部署hadoop应用的过程中初始化配置文件部分的不同之处,新应用的配置文件参数基本采用的是《《Hadoop浅学习&实践学习——初级2.0》中的配置信息(2.0博文中的配置是基于1.0的单机配置改动过来的)。如下:

      (1)masters、slaves、hadoop-env.sh、core-site.xml、mapred-site.xml中的内容与本文中上面配置一致

      (2)在hdfs-site.xml中,配置hadoop分布主机数量(只有这一项改动,只配置slave数量)

       <configuration>
       <property>
       <name>dfs.replication</name>
       <value>2</value>
       </property>
       < /configuration>

       接下来继续回到上面的流程,按照4.3 将hadoop4中的hadoop安装目录传动到hadoop5和6对等路径下、4.4 为hadoop5和6中的hadoop安装目录创建软连接 做下来,跳过4.5(因为新hadoop与旧的除了安装时间之外其他完全一致,故接着使用先前的全局环境配置就可以),而后接着做4.6和4.7的操作,这次看到的与先前旧应用返回的信息不同,是成功了,分别如下:

       (1)hadoop namenode -format

                 start-all.sh  # 在hadoop4中执行格式化hdfs并启动hadoop进程。理论上,二者可以一并执行,通过”hadoop namenode -format && start-all.sh“

       

       

       

       

       (2.1)jps  #在三台linux主机中都可以执行改命令来看本机中hadoop的进程信息检查进程信息和hadoop网页服务

       

       

       

       (2.2)hadoop dfsadmin -report #在三台linux主机中都可以执行改命令来看hadoop的集群环境的状态信息(见上图在hadoop6中的执行)

       

       

       (2.3) 192.168.0.46:50030  ; 192.168.0.46:50070 #通过浏览器访问这两个URL可以查看相应的web服务界面

        备注:下面50030web界面对应的事jobtracker进程服务,50070的web界面对应的是namenode进程的服务。相比本博文中namenode进程启动失败时看到web信息,这里基于上面新安装部署的hadoop应用环境中namenode进程启动成功,下面50070显示出相应的界面,并且成功地检测到了两个slave节点主机,其中,”live nodes“可以点进去看到具体的nodes信息详情界面,如下图:

       

         

 

         

  小结:通过上面新安装搭建hadoop实|全分布集群环境(主应用服务),并重新换用不同的配置信息,使得完全实现了基础的实分布集群环境。可见,之前两次失败的实践(实分布实践博文2.0中进程能够全部启动,但是50070web界面中检测不到live nodes;实分布集群博文2.1本文的实践中主节点主机的namenode进程启动不了)应该相应地分别与基础运行环境(如iptables的影响)和 hadoop应用的配置文件初始化配置有关系(实分布实践博文2.0的实践中应该与这两者都有关系,在2.0中iptables影响后可能即使重新格式化hdfs并重启hadoop进程也无效)!

  操作备注:接下来,(1)基于2.1本博文实践成功的操作记录,整理出一份简洁、实用的操作步骤|部署工序 (2)搁置成功的新hadoop环境,本博文记录的先前旧的hadoop应用,将其启用,调试其配置,学习hadoop配置文件的理论基础并同时进一步学习相应配置文件的相关配置!(3)或通过调试2.1博文中记录的实践环境的配置文件,进一步学习hadoop的初始化配置。



    

0 0
原创粉丝点击