hadoop-2.7
jdk-1.8
node
jdk安装 配置在环境变量配置/etc/profile
web
$vim /etc/profile #add JAVA_HOME export JAVA_HOME....
配置免密登陆:apache
在作免密登陆的时候须要集群中的全部节点之间互相之间进行免密,同时还须要自身和自身进行免密登陆(master)节点bootstrap
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
解压hadoop 压缩包
vim
$ tar -zxvf hadoop-xx-xx-xx.tar.gz
配置hadoop
环境变量centos
$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_HOMEbash
$ export JAVA_HOME=/....
进行hadoop
相关配置网络
hostname配置,主机名配置,根据节点名称进行配置hostname
每一台机器都须要进行相关配置架构
集群中有多少个节点就配置多少个主机名,这样能够经过主机名进行机器之间的访问app
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
的模式
节点名称 | 节点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
节点名称 | 节点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集群
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
集群只有在过半的状况下才可以提供服务,因此在启动集群过半以前集群都是不可用的状态,角色也没有进行划分,只有启动过半机器以后才会划分leader
、floower
角色
根据上面给出的集群规划化进行配置
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
节点,那么须要将其也进行免密登陆配置,同时master
和worker1
两个namenode
节点之间也须要进行免密配置,这里由于须要两个节点之间ZKFC进程可以互相访问
ZKFC
进程是个能够在非NameNode
节点部署的,可是由于网络的问题,不这样作,会形成网络延迟,因此ZKFC节点
和NameNode
就部署在同一个节点上
下面进行免密配置:
主要配置的是,其余节点和worker1节点
,worker1
自身免密,master
和worker1
节点之间的免密
$ 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
节点的环境变量
在作格式化以前须要将journalnode
进程启动起来
journalnode
配置分别是在master
、worker1
、worker2
节点上
$ hadoop-daemon.sh start journalnode #master worker1 worker2节点上执行,启动journalnod进程
namenode节点
格式化
namenode节点有两个,
master
、worker1
,先在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
既然是高可用,那么也就是说咱们集群中的任意一台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
如上高可用就完了,在namenode
或ZKFC
进程挂了,另一台机器就会自动切成active
继续提供服务
如上就解决了namenode
单点故障集群下线的问题
集群规划以下所示:
节点名称 | 节点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
中的资源调度相关的角色进程
,jobTracker
和taskTracker
,由于这两个进程会有资源过载
和单点故障
问题,因此若是须要使用hadoop MapReduce分布式计算框架
须要使用到yarn
做为资源调度
和任务分发
的总作!固然spark
也能够在yarn
之上进行计算
etc/hadoop/yarn-site.xml
配置
添加以下内容,以下内容中使用到的信息,zookeeper
和ResourceManager
角色的地址根据本身的配置进行修改
<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
,主要是有两角色进程ResourceManager
、NodeManager
NodeManager:该角色主要是在数据节点,经过slaves中的配置进行启动,主要用来支持计算向数据迁移
ResourceManager:该角色能够在集群中的任意几点,主要用来进行资源调度和任务分发
如上配置完成以后进行启动yarn
$ start-yarn.sh
上面的启动脚本只能启动nodemanager
,这个脚本问题,那么须要本身去ResourceManager节点
手动启动
分别到worker2
、worker3
节点执行下面命令
$ yarn-daemon.sh start resourcemanager
关闭也是如此
$ stop-yarn.sh $ yarn-daemon.sh stop resourcemanager
如上操做完成以后能够经过http://worker2:8088
和http://worker3:8088
访问yarn
集群,也可尝试让一台的ResourceManager进程
挂掉,天然另一台就会自动切换成active
模式
如上的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官方配置列表中的,参数有三个,分别是
ZOOKEEPER
、NONE
、FILESYSTEM
,做用分别是,一、进行高可用配置,自动切换集群的master active 和 standby
,二、不作任何事情,三、在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:8080
或http://worker1:8080
查看他们的状态,尝试kill 一个active的master进程,看是否能自动切换!
配置到此结束,还有些自定义配置,好比pid这些均可以本身根据需求加配置就完了