• hadoop安装教程


    hadoop安装集合教程

    一、伪分布式系统搭建

    hadoop-2.7
    jdk-1.8

    jdk安装 配置在环境变量配置/etc/profile

    $vim /etc/profile
    #add JAVA_HOME
    export JAVA_HOME....
    

    配置免密登录:

    在做免密登录的时候需要集群中的所有节点之间互相之间进行免密,同时还需要自身和自身进行免密登录(master)节点

     $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
     $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
     $ chmod 0600 ~/.ssh/authorized_keys
    

    解压hadoop 压缩包

    $ tar -zxvf hadoop-xx-xx-xx.tar.gz
    

    配置hadoop环境变量

    $vim /etc/profile
    #add hadoop bin sbin
    
    export HADOOP_HOME=xxxx
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    

    配置etc/hadoop/hadoop-env.sh 文件中的 JAVA_HOME

     $ export JAVA_HOME=/....
    

    进行hadoop相关配置

    hostname配置,主机名配置,根据节点名称进行配置hostname每一台机器都需要进行相关配置

    集群中有多少个节点就配置多少个主机名,这样可以通过主机名进行机器之间的访问

    master 192.168.56.100 
    

    修改主机名vim /etc/sysconfig/network

    master
    

    重启网络服务

    $ systemctl restart network
    

    检查是否是maste

    $ hostname
    

    如上就是主机名称修改,针对centos7其他节点也需要进行相应的修改

    配置hadoop/etc/core.site.xml

    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/hadoop-2.7.7/tmp</value>
        </property>
    </configuration>
    

    配置hadoop/etc/hdfs.site.xml

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>master:50090</value>
        </property>
    </configuration>
    

    上面的配置完成之后需要进行关闭防火墙操作才能访问到http://192.168.56.100:50070

    关闭防火墙命令

    $ systemctl stop firewalld.service  #root
    $ systemctl disable firewalld.service #root
    

    格式化并启动单节点伪分布式

    $ hadoop namenode -format
    $ start-hdfs.sh
    

    上面进行的是单节点的伪分布式的部署,下面通过修改master节点中的数据内容进行完全分布式的搭建,这里还不是HA的模式,并且也只是单个namenode的模式

    二、完全分布式-单namenode

    节点名称 节点ip 节点功能
    master 192.168.56.100 namenode 节点
    worker1 192.168.56.101 datanode 节点
    worker2 192.168.56.102 datanode 和 secondarynamenode 节点
    worker3 192.168.56.103 datanode 节点

    集群规划如上:

    集群中需要配置后面的worker1 worker2 worker3节点的主机名和ip映射关系,配置方式如伪分布式中修改主主机名相同,同时需要在个节点中增加主机名和ip映射

    /etc/hosts文件中添加如下内容:

    192.168.56.100 master
    192.168.56.101 worker1
    192.168.56.102 worker2
    192.168.56.103 worker3
    

    如第一步,配置完成伪分布式的单节点之后,只需要在此基础之上修改我们的配置文件,然后将我们的master节点上的内容复制到后面的其他节点就可以实现完全分布式

    下面来进行修改配置

    etc/hadoop/core.site.xml

    在该文件中指定好我们的namenode节点,这里依然放在master节点,不做任何修改,临时目录也不再进行修改

    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/hadoop-2.7.7/tmp</value>
        </property>
    </configuration>
    

    etc/hadoop/hdfs.site.xml

    修改副本数为2,并且将secondarynamenode节点放在了worker2节点启动

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>worker2:50090</value>
        </property>
    </configuration>
    

    slaves文件
    修改slaves文件如下,下面就是datanode节点

    worker1
    worker2
    worker3
    

    修改完成之后需要进行免密登录相关配置,在集群中,需要通过某一台机器进行脚本化管理,所以这台机器需要能够免密登录其他机器,一般在master节点上进行设置,后面的心跳机制也需要用到

    需要将master节点的公钥发送到其他节点,并进行配置

    master节点 .ssh

     master
     $ scp id_rsa.pub hadoop@worker3:`pwd`/master.pub
     worker3
     $ cat master.pub >> authorized_keys
     $chmod 600 authorized_keys
    

    如上是例子,其他的节点也需要进行配置,同时master自身也需要给自身配置免密登录

    如上配置完成之后,需要将master中的hadoop安装包发送到其他节点

    $ scp -r ~/hadoop-2.7.7 hadoop@worker1:`pwd`
    

    如上,需要copy到集群中的其他节点,省略了其他copy内容

    配置jdk和上面相同,不进行示例了

    关闭相关节点防火墙配置

    关闭集群中所有节点防火墙

    $systemctl stop firewalld.service
    

    后面就可以在master中格式化并且启动了,但是如果上面伪分布式中存在我们配置的临时目录tmp的话,需要进行删除,格式化的时候让他重新创建,这样避免和之前你启动的时候遗留的内容冲突

    $ hadoop namenode -format
    $ start.dfs.sh
    

    三、QJM-HA模式高可用

    节点名称 节点ip NN-1 NN-2 DN ZK ZKFC JNN
    master 192.168.56.100 * * *
    worker1 192.168.56.101 * * * * *
    worker2 192.168.56.102 * * *
    worker3 192.168.56.103 * *

    如上就是高可用下的集群规划

    使用高可用模式中需要用到zookeeper集群

    1、安装zookeeper集群

    这里使用的是zookeeper-3.4.13版本的zookeeper

    配置ZK的环境变量

    需要安装的节点都需要进行环境变量的设置

    export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.13
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH:$ZOOKEEPER_HOME/bin 
    

    配置zookeeper-3.4.13/conf/zoo.cfg配置文件

    将如下配置换成自己指定的目录,防止系统将临时目录进行删除

    dataDir=/tmp/zookeeper
    

    修改为

    dataDir=/home/hadoop/zookeeper-3.4.13/tmp/zookeeper
    

    修改完成之后需要创建这个目录

    $ mkdir -p /home/hadoop/zookeeper-3.4.13/tmp/zookeeper
    

    增加zk节点信息

    这里,server后面的数字表示的是在选举的时候的参考值,谁的数字大谁就能被选举为leader节点,在选举的时候还有一个持久化id该id表示的是持久化的数据越多id值越大,那个节点的元数据越多就越容易当选,当这个id相同的时候,那么我们配置的这个数字就能帮助集群更快的进行选举成功

    server.1=worker1:2888:3888
    server.2=worker2:2888:3888
    server.3=worker3:2888:3888
    

    客户端同行端口号:2181
    主从模式:2888
    选举端口号:3888

    上面讲临时目录替换成自己创建的目录,需要将上面配置选举的server.1数字分别写入到每个节点上的自己创建的临时目录下面的myid文件中

    在做这步操作之前将配置好的zookeeper安装包发送到各个节点上

    $ scp -r zookeeper-3.4.13 hadoop@worker1:`pwd`
    $ scp -r zookeeper-3.4.13 hadoop@worker2:`pwd`
    $ scp -r zookeeper-3.4.13 hadoop@worker3:`pwd`
    

    分别写入数字到文件/home/hadoop/zookeeper-3.4.13/tmp/zookeeper/myid

    $ echo 1 > tmp/zookeeper/myid  #worker1
    $ echo 2 > tmp/zookeeper/myid  #worker2
    $ echo 3 > tmp/zookeeper/myid  #worker3
    

    如上都配置完成之后就可以启动zookeeper集群了

    $ zkServer.sh start		#启动
    $ zkServer.sh status	#状态
    $ zkServer.sh stop		#关闭
    

    zookeeper集群只有在过半的情况下才能够提供服务,所以在启动集群过半之前集群都是不可用的状态,角色也没有进行划分,只有启动过半机器之后才会划分leaderfloower角色

    2、配置hadoop集群高可用相关配置

    根据上面给出的集群规划化进行配置

    etc/hadoop/hdfs-site.xml增加如下配置

    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>master:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>worker1:8020</value>
    </property>
    
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>master:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>worker1:50070</value>
    </property>
    
    <!--配置jnode节点-->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://master:8485;worker1:8485;worker2:8485/mycluster</value>
    </property>
    
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
    
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value>
    </property>
    
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    
    
     <property>
       <name>dfs.ha.automatic-failover.enabled</name>
       <value>true</value>
     </property>
    
    <!--这里不需要进行配置-->
    <!--<property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence([[username][:port]])</value>
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.connect-timeout</name>
      <value>30000</value>
    </property>
    -->
    

    以上为新增加内容,同时需要将secondaryNamenode的配置项进行删除

    删除如下内容

    <property>
       <name>dfs.namenode.secondary.http-address</name>
       <value>worker2:50090</value>
    </property>
    

    因为在HA模式下是不需要使用到该进程角色

    etc/hadoop/core-site.xml配置

    增加修改如下配置

    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>
    <!--下面是journalnode 存放Namenode元数据信息目录,需要自己指定-->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/home/hadoop/tmp/journalnode/data</value>
    </property>
    
     <property>
       <name>ha.zookeeper.quorum</name>
       <value>worker1:2181,worker2:2181,worker3:2181</value>
     </property>
    

    配置文件完成了

    下面进行配置的是免密登录,上面在伪分布式中,master节点作为namenode启动节点,已经做了相关的免密登录,但是现在是主从的形式,增加了一个新的namenode节点,那么需要将其也进行免密登录配置,同时masterworker1两个namenode节点之间也需要进行免密配置,这里因为需要两个节点之间ZKFC进程能够互相访问

    ZKFC进程是个可以在非NameNode节点部署的,但是因为网络的问题,不这样做,会造成网络延迟,所以ZKFC节点NameNode就部署在同一个节点上

    下面进行免密配置:

    主要配置的是,其他节点和worker1节点worker1自身免密,masterworker1节点之间的免密

    $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #worker1节点生成秘钥和公钥
    

    分别将公钥copy到其他需要进行免密登录的节点

    $ scp ~/.ssh/id_rsa.pub master:~/.ssh/worker1.pub #worker1
    $ cat worker1.pub >> authorized_keys #master
    

    如上分别进行操作,实现免密登录

    配置完成之后需要做好验证,看是否能够进行免密登录

    修改完成之后,将master节点修改的hdfs-site.xml、core-site.xml文件copy到其他节点并进行替换

    $ scp hdfs-site.xml core-site.xml worker1:`pwd`  #etc/hadoop目录下执行
    $ scp hdfs-site.xml core-site.xml worker2:`pwd`  #etc/hadoop目录下执行
    $ scp hdfs-site.xml core-site.xml worker3:`pwd`  #etc/hadoop目录下执行
    

    如上都配置完成之后需要将之前的hadoop/tmp目录删除,或者在配置文件中重新指定新的目录也行,主要是避免新的集群和之前的集群冲突

    以上呢也都配置完成了,后面呢需要将hadoop环境环境变量配置给其他节点,尤其是namenode、journalnode的节点需要设置,其他节点不设置也行

    因为在伪分布式集群中我们只设置了master节点的环境变量

    3、进行格式化和启动

    在做格式化之前需要将journalnode进程启动起来

    journalnode配置分别是在masterworker1worker2节点上

    $ hadoop-daemon.sh start journalnode #master worker1 worker2节点上执行,启动journalnod进程
    

    namenode节点格式化

    namenode节点有两个,masterworker1,先在master节点上格式化,并且启动namenode,然后再倒worker1节点进行格式化并且启动,格式化的时候只需要在一台namenode机器上进行格式化一次,其他节点进行同步操作就行

    master节点操作

    $ hadoop namenode -fromat			#master节点
    $ hadoop-daemon.sh start namenode
    

    worker1节点操作

    $ hdfs namenode -h			#查看同步命令
    $ hfds namenode -bootstrapStandby #进行同步
    

    ZKFC格式化

    随便找一个namenode节点进行格式化操作,因为ZKFC进程是依赖zookeeper集群的,格式化会在zookeeper中创建一个目录树,提供给ZKFC进行锁争抢,以控制主从节点切换

    $ hdfs zkfc -formatZK
    

    上面格式化完成之后,可以到zookeeper集群中查看,查看到多出了hadoop-ha的目录,查看命令如下

    $ zkCli.sh #进入zookeeper终端
    $ ls /		#终端输入
    

    如上都正确配置之后,那么可以启动集群其他进程

    $ start-dfs.sh
    

    4、问题

    既然是高可用,那么也就是说我们集群中的任意一台namenode挂掉,另外一台的namenode都会从standby切换成active,在测试过程中,发现没有切换成功,在zkfc日志中出现错误,缺少命令

    错误如下

     WARN org.apache.hadoop.ha.SshFenceByTcpPort: PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh: bash: fuser: 未找到命令
    

    安装如下程序包

    $ sudo yum install -y psmisc
    

    如上高可用就完了,在namenodeZKFC进程挂了,另外一台机器就会自动切成active继续提供服务

    如上就解决了namenode单点故障集群下线的问题

    四、yarn-HA 集群搭建

    集群规划如下所示:

    节点名称 节点ip NN-1 NN-2 DN ZK ZKFC JNN RSM NM
    master 192.168.56.100 * * *
    worker1 192.168.56.101 * * * * * *
    worker2 192.168.56.102 * * * * *
    worker3 192.168.56.103 * * * *

    在之前的环境中,hdfs高可用已经能够进行工作了,这个时候直接上其他的计算平台也是可以的,比如spark以为他自己有资源调度的相关实现,但是在hadoop2.x版本之后移除了hadoop1.x中的资源调度相关的角色进程jobTrackertaskTracker,因为这两个进程会有资源过载单点故障问题,所以如果需要使用hadoop MapReduce分布式计算框架需要使用到yarn作为资源调度任务分发的总做!当然spark也可以在yarn之上进行计算

    etc/hadoop/yarn-site.xml配置

    添加如下内容,如下内容中使用到的信息,zookeeperResourceManager角色的地址根据自己的配置进行修改

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <property>
      <name>yarn.resourcemanager.ha.enabled</name>
      <value>true</value>
    </property>
    <property>
      <name>yarn.resourcemanager.cluster-id</name>
      <value>cluster1</value>
    </property>
    <property>
      <name>yarn.resourcemanager.ha.rm-ids</name>
      <value>rm1,rm2</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm1</name>
      <value>worker2</value>
    </property>
    <property>
      <name>yarn.resourcemanager.hostname.rm2</name>
      <value>worker3</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm1</name>
      <value>worker2:8088</value>
    </property>
    <property>
      <name>yarn.resourcemanager.webapp.address.rm2</name>
      <value>worker3:8088</value>
    </property>
    <property>
      <name>yarn.resourcemanager.zk-address</name>
      <value>worker1:2181,worker2:2181,worker3:2181</value>
    </property>
    

    etc/hadoop/mapred-site.xml配置

    添加如下内容

    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </property>
    

    上面在master节点上设置完成之后,将如上的配置分发到其他节点进行替换

    $ scp yarn-site.xml mapred-site.xml worker1:`pwd`
    $ scp yarn-site.xml mapred-site.xml worker2:`pwd`
    $ scp yarn-site.xml mapred-site.xml worker3:`pwd` 
    

    上面如果集群是启动的也可以不进行关闭,下面启动yarn集群

    yarn,主要是有两角色进程ResourceManagerNodeManager

    NodeManager:该角色主要是在数据节点,通过slaves中的配置进行启动,主要用来支持计算向数据迁移
    ResourceManager:该角色可以在集群中的任意几点,主要用来进行资源调度和任务分发

    如上配置完成之后进行启动yarn

    $ start-yarn.sh
    

    上面的启动脚本只能启动nodemanager,这个脚本问题,那么需要自己去ResourceManager节点手动启动

    分别到worker2worker3节点执行下面命令

    $ yarn-daemon.sh start resourcemanager
    

    关闭也是如此

    $ stop-yarn.sh
    $ yarn-daemon.sh stop resourcemanager
    

    如上操作完成之后可以通过http://worker2:8088http://worker3:8088访问yarn集群,也可尝试让一台的ResourceManager进程挂掉,自然另外一台就会自动切换成active模式

    如上的yarn高可用就做完了

    五、spark on yarn HA(spark基于yarn高可用搭建)

    集群规划如下:

    节点名称 节点ip NN-1 NN-2 DN ZK ZKFC JNN RSM NM Master Worker
    master 192.168.56.100 * * * *
    worker1 192.168.56.101 * * * * * * * *
    worker2 192.168.56.102 * * * * * *
    worker3 192.168.56.103 * * * * *

    上面新增加了两个角色进程,这两个进程都是spark的进程,当然在搭建高可用的架构中都会是用到zookeeper,只需要搭建一套就可以了,一套就能给我们提供服务

    Master:spark主节点,主要用来和计算节点进行沟通管理,建立心跳,监控集群情况等功能
    Worker:主要用来提供计算,接收资源分配,接收计算任务等功能

    spark内部有自己实现的资源调度框架,但是为了将来更好的和其他框架进行扩展,就是用yarn来做资源调度了

    使用到的包,这里使用最新版本的,spark2.4,scala使用的也是最新的发行版scala-2.12.7

    scala的环境变量是可以不进行配置的,如果自己没有使用到的话,搭建过程中也不会使用到,我只是顺手将其进行配置

    spark/conf/slaves文件配置

    增加如下配置

    worker1
    worker2
    worker3
    

    上面配置需要注意,我们spark是计算平台,所以进行计算的时候需要将其配置在hadoop datanode所在的节点,计算和数据在一起,这样节省计算的时候数据传输的网络开销,上面配置的就是worker角色进程

    spark/conf/spark-env.sh文件配置
    这个文件中可以配置很多环境变量,spark支持很多的不同的资源调度框架,不同的资源调度框架有不同的配置,这里使用的是yarn

    export JAVA_HOME=/home/hadoop/jdk1.8.0_181
    export SCALA_HOME=/home/hadoop/scala-2.12.7
    export HADOOP_CONF_DIR=/home/hadoop/hadoop-2.7.7/etc/hadoop
    export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
    export SPARK_MASTER_PORT=7077
    #正真做高可用的配置只有下面两行
    export SPARK_MASTER_HOST=worker1
    export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=worker1:2181,worker2:2181,worker3:2181 -Dspark.deploy.zookeeper.dir=/spark"
    

    SPARK_MASTER_HOST:这个配置需要注意,这个配置只需要在你规划的master角色进程的节点进行配置,配置成你所在节点的主机名或者ip都行,其他节点不需要进行配置,当然,如果是图方便,在一台上修改了,copy到其他节点,那么只需要将master角色进程所在的那些节点修改就可以了,其他节点不修改也行!如上面规划,我的master角色进程是在,master节点worker节点所以只需要修改这两个节点,其他的节点就这个配置而言,无所谓!

    SPARK_DAEMON_JAVA_OPTS

    spark.deploy.recoveryMode:该配置是spark官方配置列表中的,参数有三个,分别是ZOOKEEPERNONEFILESYSTEM,作用分别是,1、进行高可用配置,自动切换集群的master active 和 standby,2、不做任何事情,3、在master角色进程下线的时候有任务再跑,任务状态会被记录,当重启的时候会自动恢复,当然存在延时,会造成数据丢失,一般生产级别都用高可用了
    spark.deploy.zookeeper.url:指定zk集群的通信地址,上面所有做高可用的配置都会配置到这个内容
    spark.deploy.zookeeper.dir:下面这个就是在zookeeper中创建一个目录树,用来保存master角色进程的锁文件,和一些集群信息

    我是在master节点进行修改的配置,所以下面将这些配置进行分发

    $ scp spark-2.4 worker1:`pwd`
    $ scp spark-2.4 worker2:`pwd`
    $ scp spark-2.4 worker3:`pwd`
    

    记住要修改master角色进程中的SPARK_MASTER_HOST配置

    配置完成之后,就可以进行启动了

    $ ./sbin/start-master.sh	#分别在master worker1节点启动master进程
    $ ./sbin/start-slaves.sh	#启动worker进程
    

    启动完成之后,可以访问http://master:8080http://worker1:8080

    查看他们的状态,尝试kill 一个active的master进程,看是否能自动切换!

    配置到此结束,还有些自定义配置,比如pid这些都可以自己根据需求加配置就完了

  • 相关阅读:
    JAVA 设计模式 组合模式
    JAVA 设计模式 模板方法模式
    SpringBoot 数据篇之使用JDBC
    [Spring]01_环境配置
    [spring]03_装配Bean
    [Spring]04_最小化Spring XML配置
    [Quartz笔记]玩转定时调度
    [Spring]支持注解的Spring调度器
    asp.net core 系列 13 日志
    asp.net core 系列 12 选项 TOptions
  • 原文地址:https://www.cnblogs.com/mojita/p/10667282.html
Copyright © 2020-2023  润新知