Hadoop集群搭建

集群与角色

角色在集群中都是用进程来表现的

例如:node1为什么是NameNode节点
答:因为在node1节点上启动了一个NameNode进程

集群模式

伪分布式
	在一台服务器上,启动多个进程,分别表示各个角色
完全分布式
	在多台服务器上,每台服务器启动不同角色的进程,使用多台服务器组成HDFS集群
高可用的完全分布式
	避免完全分布式中NameNode挂掉导致服务不能使用

伪分布式

1.安装jdk

1、解压jdk压缩文件:
	tar -zxvf   jdk压缩文件
2、配置环境变量:
	vim /etc/profile
		export JAVA_HOME=/opt/software/jdk/jdk1.8.0_151
		export PATH=$PATH:$JAVA_HOME/bin
3、重新运行配置文件:
	source /etc/profile
4、查看java版本:
	java -version

centos卸载原装java

2.安装hadoop

1、解压hadoop压缩文件
2、配置环境变量
	vim /etc/profile
		export HADOOP_HOME=/home/hadoop-2.7.5 
		export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
3、重新运行配置文件
	source /etc/profile

这是root下配置环境变量,也可以在用户下配置

3.配置hadoop配置文件

1.配置hdfs-site.xml

<property>
	<name>dfs.replication</name>
     <value>1</value>
</property>
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>node01:50090</value>
</property>
dfs.replication:设置hdfs副本数=值-1

2.配置core-site.xml

<property>
	<name>fs.defaultFS</name>
    <value>hdfs://node01:9000</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/var/abc/hadoop/local</value>
</property>
fs.defaultFS:HDFS默认路径
hadoop.tmp.dir:HDFS文件存放路径

3.修改hadoop-env.sh

export JAVA_HOME=/opt/java/jdk1.8.0_151
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-2.7.5/etc/hadoop
JAVA_HOME:java的安装路径
HADOOP_CONF_DIR:hadoop配置路径
配置完毕后执行:source hadoop-env.sh
目的:使配置生效

4.修改slaves

node01
node01:hostname,需要在/etc/hosts中配置,并且固定ip地址

转发:克隆虚拟机的后ip地址冲突,及解决方法

5.格式化NameNode

hdfs namenode -format

6.启动hdfs

start-dfs.sh

Hadoop集群搭建

完全分布式

集群规划

这里,我们使用四台服务器来搭建HDFS完全分布式

node01 node02 node03 node04
NameNode
SecondaryNameNode
DataNode

1.时间同步

1.安装ntp:
	yum install ntp
2.同步时间:
	ntpdate ntp1.aliyun.com
ntp1.aliyun.com:阿里云校时服务器,可以自己选择其他的

2.免密登陆

1.在所有节点上执行:ssh-****** -t rsa -P '' -f ~/.ssh/id_rsa
2.分发node01的公钥
	ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
	ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
	ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
	ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
修改四台服务器的hostname和hosts,每台服务器中的hosts还需要配置其他服务器的ip和hostname

3.配置jdk

步骤同为分布式、所有节点都需要配置

4.修改配置文件

1.修改hdfs-site.xml

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>
<property>   
	 <name>dfs.namenode.secondary.http-address</name>
     <value>node02:50090</value>
</property>

2.修改core-site.xml

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://node01:9000</value>
</property>
<property>
	<name>hadoop.tmp.dir</name>
	<value>/var/abc/hadoop/cluster</value>
</property>

5.修改slaves

修改为:
	node02
	node03
	node04
一个hostname占一行,开头结尾不允许多空格
slaves中配置的是从节点,可以简单的理解为是DataNode的地址

6.格式化NameNode

hdfs namenode -format
格式化之前需要关闭所有的HDFS相关的进程 该命令在node01上执行
如果不是第一次格式化HDFS,需要注意的问题!
    1.删除NameNode和DataNode生成的文件
    2.如果已经启动,则将NameNode生成的clusterID复制到DataNode的clusterID上 这样可以确保NameNode和DataNode的clusterID一致,避免无法通信

7.启动HDFS

start-dfs.sh

Hadoop集群搭建

高可用的完全分布式

集群规划

node01 node02 node03 node04
NameNode1
NameNode2
DataNode
Zookeeper
ZooKeeper Failover Controller
JournalNode

Hadoop集群搭建

1.免密登陆

1.将node01的公钥分发给node01、node02、node03、node04
2.将node02的公钥分发给node01
	ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

注意:时间同步!

2.配置JDK

同完全分布式

3.修改配置文件

1、修改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>node01:8020</value>
</property>
<property>
	<name>dfs.namenode.rpc-address.mycluster.nn2</name>
	<value>node02:8020</value>
</property>
<property>
	<name>dfs.namenode.http-address.mycluster.nn1</name>
	<value>node01:50070</value>
</property>
<property>
	<name>dfs.namenode.http-address.mycluster.nn2</name>
	<value>node02:50070</value>
</property>
<property>
	<name>dfs.namenode.shared.edits.dir</name>
	<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/var/sxt/hadoop/ha/jn</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>/root/.ssh/id_rsa</value>
</property>
<property>
 	<name>dfs.ha.automatic-failover.enabled</name>
 	<value>true</value>
 </property>
property-name 注释
dfs.nameservices HDFS 命名服务的逻辑名称,可用户自己定义。该名称将被基 于 HDFS 的系统使用,比如 Hbase 等
dfs.ha.namenodes.mycluster 某个命名服务下包含的 NameNode 列表,可为每个 NameNode 指定一个自定义的 ID 名称,比如命名服务 nn 下有两个 NameNode,分别命名为 nn1 和 nn2
dfs.namenode.rpc-address.mycluster.nn1 为每个 NameNode 设置 RPC 地址
dfs.namenode.http-address.mycluster.nn1 为每个 NameNode 设置对外的 HTTP 地址
dfs.namenode.shared.edits.dir 设置一组 journalNode 的 URI 地址,active NameNode 将 edit log 写入这些JournalNode,而 standby NameNode 读取这些 edit log,并作用在内存中的目录树中
dfs.journalnode.edits.dir journalNode存放文件地址
dfs.client.failover.proxy.provider.mycluster 设置客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的 active NameNode。该类可由用户自己实现,默认实现为 ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods sshfence 通过 ssh 登录到前一个 active NameNode 并将其杀死。为了让该机制成功执行
dfs.ha.fencing.ssh.private-key-files 为隔离机制配置免密码 ssh 登陆
dfs.ha.automatic-failover.enabled 自动切换ZooKeeper Failover Controller

隔离机制

  主备架构解决单点故障问题时,必须要认真解决的是脑裂问题,即出现两个 master 同时对外提供服务,导致系统处于不一致状态,可能导致数据丢失等潜在问题

  在 HDFS HA 中,JournalNode 只允许一个 NameNode 写数据,不会出现两个 active NameNode 的问题, 但是,当主备切换时,之前的 active NameNode 可能仍在处理客户端的 RPC 请求,为此, 需要增加隔离机制(fencing)将之前的 active NameNode 杀死。

  HDFS 允许用户配置多个隔离机制,当发生主备切换时,将顺次执行这些隔离机制,直 到一个返回成功。Hadoop 2.0 内部打包了两种类型的隔离机制,分别是 shell 和 sshfence

2、修改core-site.xml

<property>
   <name>fs.defaultFS</name>
   <value>hdfs://mycluster</value>
</property>
<property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
</property>
fs.defaultFS:设置缺省的目录前缀
ha.zookeeper.quorum:JournalNode 所在节点上的一个目录,用于存放 editlog 和其他状态信息

4.修改slaves

修改为:
	node02
	node03
	node04

5.分发hadoop文件

scp -r hadoop-2.7.5 node02:`pwd`
scp -r hadoop-2.7.5 node03:`pwd`
scp -r hadoop-2.7.5 node04:`pwd`
每台机器都需要分发,·pwd·是表示与当前机器相同位置

6.安装Zookeeper

1.压安装包
2.修改配置
	1)将conf下的zoo_sample.cfg改名为zoo.cfg
		 mv zoo_sample.cfg zoo.cfg
	2)修改dataDir文件存放目录
		dataDir=/var/hadoop_dir/zookeeper
	3)指定zookeeper集群中各个机器的信息
		server.1=node02:2888:3888
		server.2=node03:2888:3888
		server.3=node04:2888:3888
3.创建myid
	1)在dataDir目录下创建
	2)内容更改为server点后面的数字
4.分发zookeeper
5.修改其他机器上的myid
node01上不需要安装

7.启动Zookeeper

在zookeeper/bin目录下执行
	./zkServer.sh start
在node02、node03、node04上执行
jps查看当前jvm进程,会有QuorumPeerMain进程,表示启动成功
在zookeeper/bin目录下执行./zkServer.sh status查看ZooKeeper集群之间是否正常通讯(出现Mode:leader/follwer即成功通讯)
出错原因:
    1.防火墙未关闭
    2.myid未创建或内容不正确
    3.集群无法连接:集群中的机器上/etc/hosts信息不完整或有错误

8.启动 JournalNode

hadoop-daemon.sh start journalnode
在node01、node02、node03上运行上述指令
jps查看当前jvm进程,会有JournalNode进程,表示启动成功

9.格式化NameNode

1.随机选择一台NameNode执行
	hdfs namenode -format
	hadoop-daemon.sh start namenode
2.在另一台NameNode执行
	hdfs namenode -bootstrapStandby
我自己选择node01作为当前运行的NameNode(即:执行第一步),node02作为备用的NameNode(执行第二步)
如果之前有过格式化,需要将之前格式化生成的文件全部删除,防止ID号不一致

10.启动ZKFC

1、格式化

hdfs zkfc -formatZK

12.启动ZKFC

hadoop-daemon.sh start zkfc
在node01、node02上执行
jps查看当前jvm进程,出现DFSZKFailoverController即成功启动

10.关闭所有节点上的进程

stop-dfs.sh

11.启动HDFS

start-dfs.sh

Hadoop集群搭建

搭建客户端

1.原因

如果将集群内的某一台机器频繁当作客户端,会导致这个节点上的磁盘IO以及网络IO负载超过其他的节点,久而久之这个节点的磁盘以及网卡性能远远低于其他节点,从而导致数据倾斜问题

2.搭建过程

1.创建一台新的虚拟机服务器,这台服务器必须能够与集群通信
2.将配置好的安装包原封不动的拷贝到新的服务器
	scp -r hadoop-2.6.5 192.168.100.128:`pwd`
3.配置环境变量
	/etc/profile
4.在客户端正常操作HDFS集群就可以了
因为是客户端,所以不需要修改slaves配置文件