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
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文件存放路径
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地址
5.格式化NameNode
hdfs namenode -format
6.启动hdfs
start-dfs.sh
完全分布式
集群规划
这里,我们使用四台服务器来搭建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
高可用的完全分布式
集群规划
node01 | node02 | node03 | node04 | |
---|---|---|---|---|
NameNode1 | √ | |||
NameNode2 | √ | |||
DataNode | √ | √ | √ | |
Zookeeper | √ | √ | √ | |
ZooKeeper Failover Controller | √ | √ | ||
JournalNode | √ | √ | √ |
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
搭建客户端
1.原因
如果将集群内的某一台机器频繁当作客户端,会导致这个节点上的磁盘IO以及网络IO负载超过其他的节点,久而久之这个节点的磁盘以及网卡性能远远低于其他节点,从而导致数据倾斜问题
2.搭建过程
1.创建一台新的虚拟机服务器,这台服务器必须能够与集群通信
2.将配置好的安装包原封不动的拷贝到新的服务器
scp -r hadoop-2.6.5 192.168.100.128:`pwd`
3.配置环境变量
/etc/profile
4.在客户端正常操作HDFS集群就可以了
因为是客户端,所以不需要修改slaves配置文件