Hadoop2.2.0 HA + Jdk1.8.0 + Zookeeper3.4.5 + Hbase0.98 集群搭建详细过程(服务器集群)

来源:互联网 发布:无标度网络的度分布 编辑:程序博客网 时间:2024/06/12 00:54

一、前言

    过完年在外实习,实习中的一部分主要工作就是关于hadoop的搭建和维护。其实hadoop的搭建本身并不是什么难题,主要是当一些之前没怎么用过linux、没怎么用到java的可怜的孩纸们来搞hadoop的时候会相当的揪心,非常不巧我也是的。因此可以说,学hadoop的过程是一个很痛苦但是也很有成就感的过程。
    先说一下我学习hadoop的过程,由于之前没有用过linux,java也就一知半解基本没用过,因此在学hadoop的前,我补了一段时间的基础知识,主要针对linux。hadoop的环境主要在linux上,在学hadoop之前最好具备一定的linux基础知识,大体上有这么一些(当然不止这么多,只能说如果这些都不具备,会相当痛苦的):基本的本件操作指令(mkdir、rm、scp、mv这一类),还有关于环境变量的配置、网络设置、权限、安装软件等等,不是很多,但是学起来也不少。由于hadoop是用java编写,因此最好自己写过一些java程序,不然在hadoop运行或者搭建的过程中报的java错误可能就会让你很迷惑。
    啰嗦一点,顺便说一下自己学hadoop时的心情吧。最初学hadoop感觉相当的新奇,认为自己学了hadoop出来工作基本不愁,充满了自信。随着学习的深入,发现hadoop的水还是比较深的,这时候我就开始反思自己对hadoop的认识了,我不能确定hadoop就是一个非常适合自己的工作,或者说我是在接触更多知识后对自己的一种怀疑,因为很多大公司貌似已经不用hadoop了,而且有出现了很多的框架storm、spark等,这个时期我比较迷茫,而且在学习的时候也遇到了很多的困难,发现hadoop的运维也是相当的难熬的。现在的话,对待hadoop和之前又不相同了,我不知道对错,但是现在对hadoop的理解是一个工具,我没有太多的想法想钻研hadoop,仅仅作为一个工具使用,类似于mysql,Python这些工具和语言,知识适用于不同的环境而已。学hadoop最美好的回忆是在学习的时候我难以自拔地喜欢了一个女生,那段时间是我动力最大的时期,也是我最卖命度过hadoop最痛苦的一段时期。

二、集群搭建

    我所搭建的hadoop平台是在十多台的服务器上,操作系统为scientific linux,按以下的操作步骤可以完成搭建,其中很多配置项是在运行程序出问题后经过调整后最终配置内容。

1.注意

    1.所有使用root权限的操作必须慎重,hadoop所有的配置过程中必须谨慎!    2.所有软件的安装位置:Jdk在/usr/java/jdk1.8.0下;Hadoop在/home/hadoop/hadoop2.2.0下;Zookeeper3.4.5在/home/hadoop/hadoop-2.2.0/zookeeper-3.4.5下;hbase-0.98在/home/hadoop/hadoop-2.2.0/hbase-0.98下    3.Hadoop2.2官方提供32位,自己提供的64位版本。可以自己编译,可以下载。

2.准备工作

[plain] view plaincopy
  1. 1.防火墙(所有机器)(root用户)     
  2. /etc/init.d/iptables stop   //关闭防火墙  
  3. chkconfig iptables off   //关闭开机启动  
  4. 2.时间(所有机器)(root用户)  
  5. date -s "2014-5-13 09:56:33"//设置日期  
  6. 3.用户(所有机器)(root用户)  
  7. useradd hadoop  //创建hadoop用户  
  8. passwd hadoop   //密码  
  9. vim /etc/sudoers <span style="font-family: Arial, Helvetica, sans-serif;">  //加入sudoers:vim /etc/sudoers ,在root下一行写入 </span><span style="font-family: Arial, Helvetica, sans-serif;">hadoop   ALL=(ALL)   ALL</span>  
[plain] view plaincopy
  1. 4.主机名(所有机器)(root用户)  
  2. hostname  192.168.80.19   //暂时修改主机名  
  3. vim /etc/sysconfig/network  //永久修改  
  4. 5.hosts文件(所有机器)(root用户)  
  5. vim /etc/hosts  //在hosts文件中写入整个集群的主机信息:  
  6. 192.168.60.98 bigdata07.ihep.ac.cn bigdata07  
  7. 192.168.60.97 bigdata06.ihep.ac.cn bigdata06  

3.JDK1.8安装(所有机器)(root用户)

[plain] view plaincopy
  1. 1.查看java状况:rpm -qa |grep java  
  2. 2.查看jdk状况:rpm -qa |grep jdk  
  3. 3.卸载上两步显示的程序:rpm -e --nodeps java-###  
  4. 4.安装jdk:将jdk-8-linux-x64.rpm放入任意目录,执行rpm -ivh jdk-8-linux-x64.rpm  
  5. 5.修改环境变量:vim /etc/profile,加入如下几行:  
  6.     export JAVA_HOME=/usr/java/jdk1.8.0  
  7.     export JRE_HOME=/usr/java/jdk1.8.0/jre  
  8.     export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH  
  9.     export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
  10. 6.生效:source /etc/profile  
  11. 7.验证:java –version、echo $JAVA_HOME  

4.SSH无密码登录(所有机器)(root用户+hadoop用户)

[plain] view plaincopy
  1. 1.修改配置文件:vim /etc/ssh/sshd_config,将以下三行去掉注释  
  2.     RSAAuthentication yes  
  3.     PubkeyAuthentication yes  
  4.     AuthorizedKeysFile      .ssh/authorized_keys  
  5. 2.重启ssh:service sshd restart  
  6. 以下步骤全部在hadoop用户下操作,首先需要保证所有主机能够ping通  
  7. 3.生成密钥:ssh-keygen –t dsa(然后一直按回车,会自动生成.ssh文件夹,内有两个文件)  
  8. 4.生成authorized_keys:cat id_dsa.pub  >>  authorized_keys  
  9. 5.赋权限:chmod 600 authorized_keys  
  10. 6.生成公有的密钥,包括所有主机的信息:  
  11.     6.1.将第一台主机的authorized_keys发送至第二台主机,替换掉之前的authorized_keys:  
  12.         scp authorized_keys hadoop@192.168.60.92:/home/hadoop/.ssh  
  13.     6.2.将第二台主机的id_dsa.pub追加入authorized_keys(追加后的应有两台主机的信息)  
  14.         cat id_dsa.pub  >>  authorized_keys  
  15.     6.3.重复前两步,直到把所有主机的id_dsa.pub追加入authorized_keys  
  16.     6.4.将最后一个authorized_keys分发回给所有主机:  
  17.         scp authorized_keys hadoop@192.168.60.92:/home/hadoop/.ssh  
  18. 7.验证登陆:ssh ip地址或者主机名  

5.Zookeeper3.4.5搭建(部分主机)(hadoop用户)

[plain] view plaincopy
  1. 1.注意事项:  
  2.     1.1.Zookeeper分布的主机数必须是奇数,不用使用全部主机,挑选出部分即可  
  3.     1.2.配置文件分发给所有主机后必须记得修改myid  
  4. 2.配置文件:  
  5.     2.1.zoo.cfg:  
  6.         dataDir=/home/hadoop/hadoop-2.2.0/zookeeper-3.4.5/data      ##Zookeeper存放数据  
  7.         dataLogDir=/home/hadoop/hadoop-2.2.0/zookeeper-3.4.5/logs   ##存放log日志  
  8.         server.1=192.168.60.92:2888:3888    ##所有安装Zookeeper的主机。server.ID,ID写入每台主机的/data/myid中  
  9.         server.2=192.168.60.93:2888:3888  
  10.         server.3=192.168.60.94:2888:3888  
  11. 3.创建/data和/logs两个文件夹  

6.hadoop2.2 HA(所有主机)(hadoop用户)

[plain] view plaincopy
  1. 1.注意:  
  2.         1.1.hadoop2.2 HA设置两个namenode,一个active,一个standby  
  3.     2.配置文件(顺序从上往下)  
  4.         2.1.core-site.xml文件  
  5.             <configuration>  
  6.             <property>        
  7.             <name>fs.defaultFS</name>        
  8.             <value>hdfs://cluster</value>   
  9.             <description>对应hdfs中的集群名称</description>   
  10.             </property>    
  11.                                    
  12.             <property>        
  13.             <name>hadoop.tmp.dir</name>       
  14.             <value>/home/hadoop/hadoop-2.2.0/tmp</value>   
  15.             <description>自己设置tmp,默认位置会被定期清除</description>             
  16.             </property>    
  17.                                      
  18.             <property>        
  19.             <name>ha.zookeeper.quorum</name>        
  20.             <value>192.168.60.92:2181,192.168.60.93:2181,192.168.60.94:2181,</value>       
  21.             </property>  
  22.             <description>这里是ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点</description>  
  23.             </configuration>  
  24.         2.2.hadoop-env.sh文件     //一般的教程中不设置这个文件,但是设置这些文件能让你更能理解hadoop一些原理  
  25.             export JAVA_HOME=/usr/java/jdk1.8.0     
  26.             export HADOOP_PID_DIR=/home/hadoop/hadoop-2.2.0/tmp  
  27.             export HADOOP_SECURE_DN_PID_DIR=/home/hadoop/hadoop-2.2.0/tmp  
  28.         2.3.hdfs-site.xml文件  
  29.             <configuration>  
  30.             <property>  
  31.             <name>dfs.name.dir</name>  
  32.             <value>/hadoopnamenode/name</value>  
  33.             </property>  
  34.               
  35.             <property>  
  36.             <name>dfs.data.dir</name>  
  37.             <value>/data/hadoop/data</value>  
  38.             </property>  
  39.               
  40.             <property>  
  41.             <name>dfs.replication</name>    
  42.             <value>3</value>  
  43.             <description>dfs备份数量</description>    
  44.             </property>    
  45.   
  46.             <property>    
  47.             <name>dfs.permissions.enabled</name>    
  48.             <value>false</value>  
  49.             <description>默认为true,但是还不知道具体功能,设为false</description>  
  50.             </property>    
  51.   
  52.             <property>        
  53.             <name>dfs.nameservices</name>      
  54.             <value>cluster</value>   
  55.             <description>集群的逻辑名称,自己任意取</description>       
  56.             </property>    
  57.   
  58.             <property>    
  59.             <name>dfs.ha.namenodes.cluster</name>    
  60.             <value>nn1,nn2</value>  
  61.             <description>两个namenode的逻辑名称,自己任意取</description>   
  62.             </property>    
  63.   
  64.             <property>    
  65.             <name>dfs.namenode.rpc-address.cluster.nn1</name>    
  66.             <value>192.168.60.98:9000</value>    
  67.             </property>    
  68.                      
  69.             <property>        
  70.             <name>dfs.namenode.http-address.cluster.nn1</name>        
  71.             <value>192.168.60.98:50070</value>        
  72.             </property>        
  73.   
  74.             <property>        
  75.             <name>dfs.namenode.rpc-address.cluster.nn2</name>        
  76.             <value>192.168.60.126:9000</value>        
  77.             </property>    
  78.   
  79.             <property>        
  80.             <name>dfs.namenode.http-address.cluster.nn2</name>        
  81.             <value>192.168.60.126:50070</value>       
  82.             </property>  
  83.             <property>  
  84.             <name>dfs.namenode.servicerpc-address.cluster.nn1</name>    
  85.             <value>192.168.60.98:53310</value>    
  86.             </property>  
  87.   
  88.             <property>    
  89.             <name>dfs.namenode.servicerpc-address.cluster.nn2</name>    
  90.             <value>192.168.60.126:53310</value>    
  91.             </property>  
  92.                 
  93.             <property>      
  94.             <name>dfs.ha.automatic-failover.enabled.cluster</name>      
  95.             <value>true</value>   
  96.             <description>指定cluster是否自动故障恢复,当NameNode出故障时,是否自动切换到另一台NameNode</description>     
  97.             </property>       
  98.                  
  99.             <!--指定JournalNode -->    
  100.             <property>    
  101.             <name>dfs.namenode.shared.edits.dir</name>         
  102.             <value>qjournal://192.168.60.92:8485;192.168.60.93:8485;192.168.60.94:8485;192.168.60.95:8485;192.168.60.96:8485;192.168.60.97:8485;192.168.60.98:8485;192.168.60.125:8485;192.168.60.126:8485;192.168.60.127:8485;192.168.60.128:8485/cluster</value>   
  103.             <description>指定cluster的两个NameNode共享edits文件目录时,使用的JournalNode集群信息</description>    
  104.             </property>    
  105.   
  106.             <property>    
  107.             <name>dfs.client.failover.proxy.provider.cluster</name>         
  108.             <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
  109.             <description>指定cluster1出故障时,哪个实现类负责执行故障切换</description>    
  110.             </property>    
  111.                  
  112.             <property>        
  113.             <name>dfs.journalnode.edits.dir</name>        
  114.             <value>/home/hadoop/hadoop-2.2.0/journal</value>        
  115.             </property>  
  116.                 
  117.             <property>        
  118.             <name>dfs.ha.fencing.methods</name>        
  119.             <value>sshfence</value>        
  120.             </property>    
  121.                     
  122.             <property>        
  123.             <name>dfs.ha.fencing.ssh.private-key-files</name>        
  124.             <value>/home/hadoop/.ssh/id_rsa</value>        
  125.             </property>    
  126.                   
  127.             <property>    
  128.             <name>dfs.ha.fencing.ssh.connect-timeout</name>    
  129.             <value>5000</value>    
  130.             </property>  
  131.                 
  132.             <property>    
  133.             <name>dfs.namenode.handler.count</name>    
  134.             <value>100</value>    
  135.             </property>   
  136.                
  137.             </configuration>  
  138.         2.4.mapred-env.sh文件  
  139.             export JAVA_HOME=/usr/java/jdk1.8.0  
  140.             export HADOOP_MAPRED_PID_DIR=/home/hadoop/hadoop-2.2.0/tmp  
  141.         2.5.mapred-site.xml文件  
  142.             <configuration>  
  143.             <property>    
  144.             <name>mapreduce.framework.name</name>    
  145.             <value>yarn</value>    
  146.             </property>  
  147.   
  148.             <property>  
  149.             <name>mapreduce.job.maps</name>  
  150.             <value>6</value>  
  151.             <description>每个job使用的map tasks个数</description>  
  152.             </property>  
  153.   
  154.             <property>  
  155.             <name>mapreduce.job.reduces</name>  
  156.             <value>6</value>  
  157.             <description>每个job使用的reduce tasks个数</description>  
  158.             </property>  
  159.   
  160.             <property>  
  161.             <name>mapreduce.tasktracker.map.tasks.maximum</name>  
  162.             <value>6</value>  
  163.             <description>一个task tracker能够同时运行的最多map task个数</description>  
  164.             </property>  
  165.   
  166.             <property>  
  167.             <name>mapreduce.tasktracker.reduce.tasks.maximum</name>  
  168.             <value>6</value>  
  169.             <description>一个task tracker能够同时运行的最多reduce task个数</description>  
  170.             </property>  
  171.   
  172.             <property>  
  173.             <name>mapred.child.java.opts</name>  
  174.             <value>-Xmx5000m</value>  
  175.             <descriptio>每个TT子进程所使用的虚拟机内存大小</descriptio>  
  176.             </property>  
  177.   
  178.             <property>  
  179.             <name>mapreduce.tasktracker.http.threads</name>  
  180.             <value>40</value>  
  181.             <description>TT用来跟踪task任务的http server的线程数</description>  
  182.             </property>  
  183.               
  184.             </configuration>  
  185.         2.6.slaves文件  
  186.             写入datanode的ip地址或者主机名即可  
  187.         2.7.yarn-env.sh文件  
  188.             export JAVA_HOME=/usr/java/jdk1.8.0  
  189.         2.8.yarn-site.xml文件  
  190.             <configuration>  
  191.   
  192.             <property>        
  193.             <name>yarn.resourcemanager.hostname</name>        
  194.             <value>192.168.60.98</value>    
  195.             <description>resourcemanager只有一个,设置它的主机位置</description>  
  196.             </property>    
  197.   
  198.             <property>    
  199.             <name>yarn.nodemanager.aux-services</name>    
  200.             <value>mapreduce_shuffle</value>    
  201.             </property>  
  202.                 
  203.             <property>    
  204.             <description>The class to use as the resource scheduler.</description>  
  205.             <name>yarn.resourcemanager.scheduler.class</name>  
  206.             <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>  
  207.             <description>设置hadoop集群能够并行运行多个程序</description>  
  208.             </property>  
  209.   
  210.             </configuration>  

7.Hbase0.98(部分主机)(hadoop用户)

[plain] view plaincopy
  1. 1.注意,Hbase常遇到的几种错误的解决方法:  
  2.         1.1.确保几台主机日期相差不多  
  3.         1.2.替换lib中的jar包  
  4.             hadoop-annotations-2.2.0.jar  
  5.             hadoop-auth-2.2.0.jar  
  6.             hadoop-common-2.2.0.jar  
  7.             hadoop-hdfs-2.2.0.jar  
  8.             hadoop-mapreduce-client-app-2.2.0.jar  
  9.             hadoop-mapreduce-client-common-2.2.0.jar  
  10.             hadoop-mapreduce-client-core-2.2.0.jar  
  11.             hadoop-mapreduce-client-jobclient-2.2.0.jar  
  12.             hadoop-mapreduce-client-shuffle-2.2.0.jar  
  13.             hadoop-yarn-api-2.2.0.jar  
  14.             hadoop-yarn-client-2.2.0.jar  
  15.             hadoop-yarn-common-2.2.0.jar  
  16.             hadoop-yarn-server-common-2.2.0.jar  
  17.             hadoop-yarn-server-nodemanager-2.2.0.jar  
  18.         1.3.复制hadoop配置文件hdfs-site.xml到conf中  
  19.         1.4.删除slf4j-log4j12-1.6.4.jar包  
  20.             rm -rf /home/hadoop/hadoop-2.2.0/hbase-0.98.0-hadoop2/lib/slf4j-log4j12-1.6.4.jar  
  21.         1.5.如果hbase第一次启动失败,以后重新启动前,删除Zookeeper中的hbase目录  
  22.             zkCli.sh  
  23.             rmr hbase  
  24.     2.配置文件  
  25.         2.1.hbase-env.sh文件  
  26.             export JAVA_HOME=/usr/java/jdk1.8.0/  
  27.             export HBASE_MANAGES_ZK=false   ##表示不使用自己的Zookeeper集群  
  28.             export HBASE_PID_DIR=/home/hadoop/hadoop-2.2.0/hbase-0.98/tmp  
  29.         2.2.hbase-site.xml文件  
  30.             <configuration>  
  31.             <property>  
  32.             <name>hbase.rootdir</name>  
  33.             <value>hdfs://cluster/hbase</value>  
  34.             </property>  
  35.   
  36.             <property>  
  37.             <name>hbase.cluster.distributed</name>  
  38.             <value>true</value>  
  39.             </property>  
  40.   
  41.             <property>  
  42.             <name>hbase.zookeeper.quorum</name>  
  43.             <value>192.168.60.92:2181,192.168.60.93:2181,192.168.60.94:2181</value>  
  44.             </property>  
  45.   
  46.             <property>  
  47.             <name>zookeeper.session.timeout</name>  
  48.             <value>60000</value>  
  49.             </property>  
  50.   
  51.             <property>  
  52.             <name>hbase.zookeeper.property.clientPort</name>  
  53.             <value>2181</value>  
  54.             </property>  
  55.   
  56.             <property>  
  57.             <name>hbase.tmp.dir</name>  
  58.             <value>/home/hadoop/hadoop-2.2.0/hbase-0.98/tmp</value>  
  59.             </property>  
  60.               
  61.             <property>  
  62.             <name>hbase.master.maxclockskew</name>  
  63.             <value>200000</value>  
  64.             <description>Time difference of regionserver from master</description>  
  65.             </property>  
  66.               
  67.             </configuration>  
  68.         2.3.regionservers文件  
  69.             写入相应的hbase主机,都是HRegionServer,HMaster是启动Hbase的那个节点。  

三、启动集群

[plain] view plaincopy
  1. 1.分发文件:  
  2.         将一台机器上的hadoop目录发给其余所有主机:  
  3.         scp -r /home/hadoop/hadoop-2.2.0 hadoop@192.168.60.92:/home/hadoop/  
  4.     2.启动Zookeeper集群  
  5.         2.1.修改myid  
  6.         2.2.启动Zookeeper集群(每台Zookeeper机器)  
  7.             zkServer.sh start  
  8.         2.3.查看状态:  
  9.              zkServer.sh status  
  10.         2.4.验证:  
  11.             主节点:zkCli.sh      
  12.                     ls /  
  13.         2.5.格式化集群  
  14.             在主节点:/home/hadoop/hadoop-2.2.0/bin/hdfs zkfc –formatZK  
  15.         2.6.验证  
  16.             ls / ##是否出现了hadoop-ha  
  17.     3.启动hadoop集群  
  18.       
  19.         3.1.启动journalnode(所有机器)  
  20.             每台主机分别执行:hadoop-daemon.sh start journalnode  
  21.         3.2.启动namenode(namennode)  
  22.             3.2.1.格式化namenode  
  23.                 第一个namenode上执行:hdfs namenode -format  
  24.             3.2.2.启动第一个namenode  
  25.                 hadoop-daemon.sh start namenode  
  26.             3.3.3.同步namenode数据:  
  27.                 第二个namenode上执行:hdfs namenode –bootstrapStandby  
  28.             3.3.4.启动第二个namenode  
  29.                 在第二台namenode上:hadoop-daemon.sh start namenode  
  30.         3.3.启动datanode(所有datanode)  
  31.             hadoop-daemons.sh start datanode  
  32.         3.4.启动yarn  
  33.             3.4.1.启动yarn(active namenode)  
  34.                 start-yarn.sh   
  35.             3.4.2.启动ZooKeeperFailoverController(两个namenode)  
  36.                 hadoop-daemon.sh start zkfc  
  37.     4.启动hbase(active namenode)  
  38.         start-hbase.sh  

四、总结

    这是一篇工作总结文档,不是教程,因为我没有实力和资格去写那些,我也仅仅是一个初学者。因此在写的时候我没有截图和加太多的说明,但是基本每步都会有注释和注意事项,这些全部是为我自己写的,等于是对自己工作的一个总结,同时告诉自己曾经学过这些东西。
    这篇文章里面难免会有很多的遗漏和不足,比如说我没有写某个步骤运行出来什么结果才算正确,而且可能一些配置项根据不同的集群也需要更改,而且很多配置我也没有设置,但是作为一个基本的hadoop集群,上面的操作步骤是可以成功实现了,这些基本上是很长一段时间的工作成功,算是一个菜鸟的学习经历吧。
0 0
原创粉丝点击