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这些都可以自己根据需求加配置就完了

posted @ 2019-04-07 21:45  墨迹塔  阅读(378)  评论(0编辑  收藏  举报