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
集群只有在过半的情况下才能够提供服务,所以在启动集群过半之前集群都是不可用的状态,角色也没有进行划分,只有启动过半机器之后才会划分leader
、floower
角色
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
节点,那么需要将其也进行免密登录配置,同时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
节点的环境变量
3、进行格式化和启动
在做格式化之前需要将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
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
如上高可用就完了,在namenode
或ZKFC
进程挂了,另外一台机器就会自动切成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
中的资源调度相关的角色进程
,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
高可用就做完了
五、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官方配置列表中的,参数有三个,分别是
ZOOKEEPER
、NONE
、FILESYSTEM
,作用分别是,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:8080
或http://worker1:8080
查看他们的状态,尝试kill 一个active的master进程,看是否能自动切换!
配置到此结束,还有些自定义配置,比如pid这些都可以自己根据需求加配置就完了