centos7 搭建hadoop集群 zookeeper Hbase集群

集群规划:
    主机名        IP                安装的软件
    master        192.168.1.201            jdk、hadoop、zookeeper
    slave1        192.168.1.202            jdk、hadoop、zookeeper
    slave2        192.168.1.203            jdk、hadoop、zookeeper

虚拟机安装技巧快速法: 先装master镜像,先操作后面先在master上安装jdk(建议非openjdk)“这一节中的教程,安装ntp同步时间,接着按下面常用命令分别修改master主机名,ip地址和绑定hostname与ip,ip和主机名均按上面集群规划修改, 然后将master镜像克隆两个,分别为slave1、slave2,当然可以更多,接着按下面常用命令分别修改克隆的主机名,ip地址,再开启所有虚拟机并在master节点配置ssh免密登录到slave节点,接着按后面教程搭建hadoop集群 zookeeper Hbase集群

注意版本兼容问题

本博客:

jdk1.7
zookeeper3.4.14
hbase 1.5.0
hadoop 2.8.5

 

下面为版本兼容列表: 

jdk与hbase兼容问题

在这里插入图片描述

安集群常用命令

 

root@master

即当前用户@主机名(hostname)

在master镜像中最好创建一个用户叫hadoop,解压什么的所有操作都用hadoop来操作

修改主机名

vim /etc/hostname

立即生效: hostname 主机名

修改ip地址

vim /etc/sysconfig/network-scripts/ifcfg-eth0

重启服务:

service network restart

绑定hostname与ip

vim /etc/hosts

 

ntp同步时间

sudo yum install ntp.x86_64

systemctl start ntpd

ntpdate time1.aliyun.com

date

#重启命令
systemctl restart ntpd

配置ssh免密登录

1.客户端生成公私钥

本地客户端生成公私钥:(一路回车默认即可)

ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

cd ~/.ssh
  •  
ls
  •  

下创建两个密钥:

  1. id_rsa (私钥)
  2. id_rsa.pub (公钥)

2 免密登录集群其他服务器salve2 slave1

还有 ssh-copy-id master@master

测试成功

 

同理分别在slave1 slave2上执行同样的免密操作

先在master上安装jdk(建议非openjdk)

先下载jdk for linux,本文后缀为.zip其实是一样的,下载链接:https://download.csdn.net/download/Justdoforever/12527560

tar.gz后缀格式JDK安装方式

安装jdk-7u79-linux-x64.tar.gz。

在/usr目录下新建java文件夹,命令行:

 

 

[root@localhost Desktop]# mkdir /usr/java

 

进入JDK压缩包所在目录,将压缩包复制到java文件夹中。复制文件用cp xxx命令,复制文件夹用cp -r xxx,命令行:

 

 

[root@localhost Desktop]# cp jdk-7u79-linux-x64.gz /usr/java

 

然后返回到根目录,再进入java目录,命令行:

 

 

[root@localhost Desktop]# cd /

[root@localhost Desktop]# cd /usr/java

 

压缩包解压,命令行:

 

 

[root@localhost Desktop]# tar xvf jdk-7u79-linux-x64.gz

或者 [root@localhost Desktop]# unzip  jdk-7u79-linux-x64.zip

删除压缩包,输入yes确认删除。命令行:

 

[root@localhost java]# rm jdk-7u79-linux-x64.gz

rm: remove regular file `jdk-7u79-linux-x64.gz'? yes

 

设置对所有用户有效方式:修改/etc/profile文件设置系统变量,设置jdk环境变量,该方式对所有用户有效。

使用VI编辑,输入命令,回车确认。命令行:

 

[root@localhost Desktop]# vi /etc/profile

 

打开之后在文件末尾添加下面配置。通过鼠标滑轮滚动到文件末尾,上下左右方向键控制光标输入位置。

 

export JAVA_HOME=/usr/java/jdk1.7.0_79

export PATH=$JAVA_HOME/bin:$PATH

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

配置好后,按Esc退出,按Shift加英文冒号shift + :  然后输入wq,按Enter回车键确认。取消编辑按Ctrl+z。

使profile配置生效。命令行:

[root@localhost Desktop]# source /etc/profile

 

安装步骤:
    1.安装配置zooekeeper集群(在master上操作)3.4.14版本链接https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.4.14/  用什么版本下面替换一下就好了
        1.1解压
            tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
        1.2修改配置
            cd /usr/local/zookeeper-3.4.6/conf/
            cp zoo_sample.cfg zoo.cfg
            vim zoo.cfg
 

server.id=host:port1:port2
其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。
host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
dataDir
其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。



            修改:dataDir=/usr/local/zookeeper-3.4.6/tmp
            在最后添加:
            server.1=master:2888:3888
            server.2=slave1:2888:3888
            server.3=slave2:2888:3888
            保存退出
            然后创建一个tmp文件夹
            mkdir /usr/local/zookeeper-3.4.6/tmp
            再创建一个空文件
            touch /usr/local/zookeeper-3.4.6/tmp/myid
            最后向该文件写入ID
            echo 1 > /usr/local/zookeeper-3.4.6/tmp/myid
        1.3将配置好的zookeeper拷贝到其他节点(首先分别在slave1、slave2创建相应目录:mkdir /usr/local)
            scp -r /usr/local/zookeeper-3.4.6/ slave1:/usr/local/
            scp -r /usr/local/zookeeper-3.4.6/ slave2:/usr/local/
            
            注意:修改slave1、slave2对应/usr/local/zookeeper-3.4.6/tmp/myid内容
            slave1:
                echo 2 > /usr/local/zookeeper-3.4.6/tmp/myid
            slave2:
                echo 3 > /usr/local/zookeeper-3.4.6/tmp/myid
    
    2.安装配置hadoop集群(在master上操作)下载链接为zip,解压命令换为unzip,具体命令百度,可能要安装该命令:https://download.csdn.net/download/Justdoforever/12487962
        2.1解压
            tar -zxvf hadoop-2.4.0.tar.gz -C /usr/local/
        2.2配置HDFS(hadoop2.0以上所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
            #将hadoop添加到环境变量中
            vim /etc/profile
            export JAVA_HOME=/usr/java/jdk1.7.0_55
            export HADOOP_HOME=/usr/local/hadoop-2.4.0
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin


            #使变量生效

            source /etc/profile


            #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
            cd /usr/local/hadoop-2.4.0/etc/hadoop
            
            2.2.1修改hadoo-env.sh
                export JAVA_HOME=/usr/java/jdk1.7.0_55
                
            2.2.2修改core-site.xml
                <configuration>
                    <!-- 指定hdfs的nameservice为master -->
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://master:9000</value>
                    </property>

                   <property>
                      <name>dfs.nameservices</name>
                     <value>master</value>
                   </property>
                  <!--zookeeper配置-->

                  <property>

                           <name>ha.zookeeper.quorum</name>

                           <value>master:2181,slave1:2181,slave2:2181</value>

                    </property>

                    <!-- 指定缓存大小 -->
                    <property>
                                <name>io.file.buffer.size</name>
                                <value>131072</value>
                        </property>
                    <!-- 指定hadoop临时目录 -->
                    <property>
                        <name>hadoop.tmp.dir</name>
                        <value>/usr/local/hadoop-2.8.5/tmp</value>
                    </property>
                </configuration>
                

hadoop中有3个核心组件:

分布式文件系统:HDFS —— 实现将文件分布式存储在很多的服务器上

分布式运算编程框架:MAPREDUCE —— 实现在很多机器上分布式并行运算

分布式资源调度平台:YARN —— 帮用户调度大量的mapreduce程序,并合理分配运算资源


            2.2.3修改hdfs-site.xml
                <configuration>
                    <!--指定hdfs的nameservice为master,需要和core-site.xml中的保持一致 -->
                    <property>
                        <name>dfs.nameservices</name>
                        <value>master</value>
                    </property>
                    <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
                    <property>
                        <name>dfs.ha.namenodes.master</name>
                        <value>nn1,nn2</value>
                    </property>
                    <!-- nn1的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.master.nn1</name>
                        <value>192.168.1.201:9000</value>
                    </property>
                    <!-- nn1的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.master.nn1</name>
                        <value>192.168.1.201:50070</value>
                    </property>
                    <!-- nn2的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.master.nn2</name>
                        <value>192.168.1.202:9000</value>
                    </property>
                    <!-- nn2的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.master.nn2</name>
                        <value>192.168.1.202:50070</value>
                    </property>
                    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                    <property>
                        <name>dfs.namenode.shared.edits.dir</name>
                        <value>qjournal://192.168.1.201:8485;192.168.1.202:8485;192.168.1.203:8485/master</value>
                    </property>
                    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                    <property>
                        <name>dfs.journalnode.edits.dir</name>
                        <value>/usr/local/hadoop-2.8.5/journal</value>
                    </property>
                    <!-- 开启NameNode失败自动切换 -->
                    <property>
                        <name>dfs.ha.automatic-failover.enabled</name>
                        <value>true</value>
                    </property>
                    <!-- 配置失败自动切换实现方式 -->
                    <property>
                        <name>dfs.client.failover.proxy.provider.master</name>
                        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                    </property>
                    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
                    <property>
                        <name>dfs.ha.fencing.methods</name>
                        <value>
                            sshfence
                            shell(/bin/true)
                        </value>
                    </property>
                    <!-- 使用sshfence隔离机制时需要ssh免登陆 注意一下标红的路径名,为master登录用户的名字,不是hostname-->
                    <property>
                        <name>dfs.ha.fencing.ssh.private-key-files</name>
                        <value>/home/hadoop/.ssh/id_rsa</value>
                    </property>
                    <!-- 配置sshfence隔离机制超时时间 -->
                    <property>
                        <name>dfs.ha.fencing.ssh.connect-timeout</name>
                        <value>30000</value>
                    </property>
                </configuration>
            
            2.2.4修改mapred-site.xml
                <configuration>
                    <!-- 指定mr框架为yarn方式 -->
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>    
            

Yarn 框架相对于老的 MapReduce 框架什么优势呢?我们可以看到:

1. 这个设计大大减小了 JobTracker(也就是现在的 ResourceManager)的资源消耗,并且让监测每一个 Job 子任务 (tasks) 状态的程序分布式化了,更安全、更优美。

2. 在新的 Yarn 中,ApplicationMaster 是一个可变更的部分,用户可以对不同的编程模型写自己的 AppMst,让更多类型的编程模型能够跑在 Hadoop 集群中,可以参考 hadoop Yarn 官方配置模板中的 mapred-site.xml 配置。


3. 对于资源的表示以内存为单位 ( 在目前版本的 Yarn 中,没有考虑 cpu 的占用 ),比之前以剩余 slot 数目更合理。

4. 老的框架中,JobTracker 一个很大的负担就是监控 job 下的 tasks 的运行状况,现在,这个部分就扔给 ApplicationMaster 做了,而 ResourceManager 中有一个模块叫做 ApplicationsMasters( 注意不是 ApplicationMaster),它是监测 ApplicationMaster 的运行状况,如果出问题,会将其在其他机器上重启。


5. Container 是 Yarn 为了将来作资源隔离而提出的一个框架。这一点应该借鉴了 Mesos 的工作,目前是一个框架,仅仅提供 java 虚拟机内存的隔离 ,hadoop 团队的设计思路应该后续能支持更多的资源调度和控制 , 既然资源表示成内存量,那就没有了之前的 map slot/reduce slot 分开造成集群资源闲置的尴尬情况。


            2.2.5修改yarn-site.xml
                <configuration>
                    <!-- 指定resourcemanager地址 -->
                    <property>
                        <name>yarn.resourcemanager.hostname</name>
                        <value>master</value>
                    </property>
                    <!-- 指定nodemanager启动时加载server的方式为shuffle server -->
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value>
                    </property>
                </configuration>
            
                
            2.2.6修改slaves(slaves是指定子节点的位置,因为要在itcast01上启动HDFS、在itcast03启动yarn,所以itcast01上的slaves文件指定的是datanode的位置,itcast03上的slaves文件指定的是nodemanager的位置)
                slave1
                slave2
              
        
        2.4将配置好的hadoop拷贝到其他节点
            scp -r /usr/local/hadoop-2.4.0/ slave1:/usr/local/
            scp -r /usr/local/hadoop-2.4.0/ slave2:/usr/local/

       拷贝完要配置环境,slave1 slave2        

           #将hadoop添加到环境变量中
            vim /etc/profile
            export JAVA_HOME=/usr/java/jdk1.7.0_55
            export HADOOP_HOME=/usr/local/hadoop-2.4.0
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin


            #使变量生效

            source /etc/profile

        ###注意:严格按照下面的步骤
        2.5启动zookeeper集群(分别在master、slave1、slave2上启动zk)
            cd /usr/local/zookeeper-3.4.5/bin/
            ./zkServer.sh start
            #查看状态:一个leader,两个follower
            ./zkServer.sh status
            
        2.6启动journalnode(分别在在master、slave1、slave2上执行)
            cd /usr/local/hadoop-2.4.0
            sbin/hadoop-daemon.sh start journalnode
            #运行jps命令检验,master、slave1、slave2上多了JournalNode进程


     

1〉上面在Active Namenode与StandBy Namenode之间的绿色区域就是JournalNode,当然数量不一定只有1个,作用相当于NFS共享文件系统.Active Namenode往里写editlog数据,StandBy再从里面读取数据进行同步.


2〉 NameNode之间共享数据(NFS 、Quorum Journal Node(用得多))


3〉两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。


4〉 Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作

 

   
        2.7格式化HDFS
            #在master上执行命令: hdfs namenode -format
            #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop-2.4.0/tmp,然后将/usr/local/hadoop-2.4.0/tmp拷贝到slave1的/usr/local/hadoop-2.4.0/下。
            scp -r tmp/ slave1:/usr/local/hadoop-2.4.0/
        
        2.8格式化ZK(在master上执行即可)
            hdfs zkfc -formatZK
        
        2.9启动HDFS(在master上执行)
            sbin/start-dfs.sh

        2.10启动YARN(在master上操作)
            sbin/start-yarn.sh

        
    到此,hadoop-2.8.5配置完毕,可以统计浏览器访问:
        http://192.168.1.201:50070
        NameNode 'itcast01:9000' (active)
        http://192.168.1.202:50070
        NameNode 'itcast02:9000' (standby)

至此搞定hadoop~恭喜你也完成了。

最开始hbase用的1.1.5后面查资料,发现不兼容,后选1.5.0

wget http://archive.apache.org/dist/hbase/1.5.0/hbase-1.5.0-bin.tar.gz

一定记得同步三台机器时间 

1.上传hbase安装包

2.解压

3.配置hbase集群,要修改3个文件(首先zk集群已经安装好了)
    注意:要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
    
    3.1修改hbase-env.sh
    export JAVA_HOME=/usr/java/jdk1.7.0_80
    //告诉hbase使用外部的zk 
    export HBASE_MANAGES_ZK=false
    
    3.1修改hbase-site.xml
        vim hbase-site.xml

    <configuration>
        <!-- 指定hbase在HDFS上存储的路径 -->
               <property>
                       <name>hbase.rootdir</name>
                    <value>hdfs://192.168.1.201:9000/hbase</value>
            </property>
        <!-- 指定hbase是分布式的 -->
            <property>
                    <name>hbase.cluster.distributed</name>
                    <value>true</value>
            </property>
        <!-- 指定zk的地址,多个用“,”分割 -->
            <property>
                    <name>hbase.zookeeper.quorum</name>
                    <value>master:2181,slave1:2181,slave2:2181</value>
            </property>
    </configuration>
    
    vim regionservers
    master
    slave1
    slave2
    
    3.2拷贝hbase到其他节点
        scp -r /usr/local/hbase-0.96.2-hadoop2/ slave1:/usr/local/
        scp -r /usr/local/hbase-0.96.2-hadoop2/ slave2:/usr/local/

4.将配置好的HBase拷贝到每一个节点并同步时间。

5.启动所有的hbase
    分别启动zk
        ./zkServer.sh start
    启动hbase集群
        start-dfs.sh
    启动hbase,在主节点上运行:
        start-hbase.sh
6.通过浏览器访问hbase管理页面
    192.168.1.201:16010
7.为保证集群的可靠性,要启动多个HMaster
    hbase-daemon.sh start master
    

 

自此大功告成,花费了我5天时间, 太难了,以后装软件之间一定要考虑版本兼容性问题。共勉!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章