HADOOP集群搭建实战(HA高可靠性模式)

一、环境安装

3台服务器的搭建,为了好描述我把服务器的地址分成hadoop1、hadoop2、hadoop3,
实际生产环境可以用域名来代替。
注意:配置里面尽量用域名,不要用IP,因为我曾经用IP配置出现了主机服务器联系不上从者服务器
集群规划:

主机名 hdfs主服务器,即namenode hdfs备用主服务器,也是namenode hdfs从服务器,即datanode zookeeper服务器 yarn主服务器,即resourcemanager yarn备用主服务器,resourcemanager yarn从服务器,即nodemanager hbase主服务器,即hmaster hbase备用服务器,也是hmaster hbase从服务器,即hslave
hadoop1
hadoop2
hadoop3

1、前提工作

1.1准备好服务器

如果是线上也就是有万网DNS域名解析的服务器的话忽略以下操作。
本地的话,自己修改本机的DNS域名解析文件,在各个linux服务器下的/etc/host文件中

vim /etc/host

追加
IP+域名
例如图1.1(a)


图1.1(a)

1.2相关安装包下载

jdk1.7
linux 准备3台服务器hadoop1、hadoop2、hadoop3
hadoop-2.7.3(http://apache.fayea.com/hadoop/common/)
zookeeper-3.4.5(http://apache.fayea.com/zookeeper/)
hbase-1.2.6(http://apache.fayea.com/hbase/)

1.3SSH免密码登录

由于hadoop各组件分布式集群,需要主机通过SSH协议启动从者服务器,设置免密码登录,减少工作量

1.3.1配置hadoop1到hadoop1、hadoop2、hadoop3的免密码登陆

#在hadoop1上生产一对钥匙

ssh-keygen -t rsa

输入上面的指令,然后一直按enter就行了
#将公钥拷贝到其他节点,包括自己

ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

1.3.2配置hadoop2到hadoop1、hadoop2、hadoop3的免密码登陆

#在hadoop2上生产一对钥匙

ssh-keygen -t rsa

#将公钥拷贝到其他节点

ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

2.安装配置zookeeper集群(在hadoop1服务器上)

2.1解压zookeeper安装包

假设在linux的/root下,那么zookeeper根目录是/root/zookeeper-3.4.5

2.2修改配置

2.2.1修改zoo.cfg配置文件

cd /root/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg

修改:

dataDir=/root/zookeeper-3.4.5/tmp

添加:

dataLogDir=/root/zookeeper-3.4.5/log
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888

2888是zookeeper相互通信的端口,3888是zookeeper与其他应用通信的端口,
2181是zookeeper客户端通信的端口
保存退出

2.2.2为该服务器上的zookeeper指定id

在zookeeper根目录创建一个tmp文件夹

mkdir /root/zookeeper-3.4.5/tmp

再创建一个空文件

touch /root/zookeeper-3.4.5/tmp/myid

最后向该文件写入ID

echo 1 > /root/zookeeper-3.4.5/tmp/myid

也就是为该服务器的zookeeper指定了id是1(其他服务器的id不能一样)

2.2.3将配置好的zookeeper拷贝到其他节点

scp -r /root/zookeeper-3.4.5/ hadoop2:/root/
scp -r /root/zookeeper-3.4.5/ hadoop3:/root/

注意:修改hadoop2、hadoop3对应/root/zookeeper-3.4.5/tmp/myid内容

hadoop2:

echo 2 > /root/zookeeper-3.4.5/tmp/myid

hadoop3:

echo 3 > /root/zookeeper-3.4.5/tmp/myid

启动zookeeper,看看部署成功没。
分别启动hadoop1、hadoop2、hadoop3服务器的zookeeper

/root/zookeeper-3.4.5/bin/zkServer.sh start

使用jps指令可以看到图2.2.3(a)

图2.2.3(a)

启动完毕,等待片刻,分别在hadoop1、hadoop2、hadoop3服务器执行命令

/root/zookeeper-3.4.5/bin/zkServer.sh status

查看zookeeper状态图2.2.3(b)与图2.2.3(c)

图2.2.3(b)
图2.2.3(c)

会出现其中一台是leader,也就是zookeeper的主服务器,而其他服务器都是follower则是从服务
器,就说明zookeeper分布式协调服务器启动成功了,就可以进行下一步,部署hadoop集群了。

3.安装Hadoop集群

我这里是用root权限,hadoop的目录路径为:
/root/hadoop

3.1配置HDFS

hadoop2.x所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下

3.1.1将hadoop添加到环境变量中

vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55 #这是我的java路径,修改成你的java根目录路径就行了
export HADOOP_HOME=/root/hadoop      #同样改成自己的hadoop根目录路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /root/hadoop/etc/hadoop

3.1.2修改hadoop-env.sh

vim hadoop-env.sh

找到:

export JAVA_HOME=XXX

改为:

export JAVA_HOME=/usr/java/jdk1.7.0_55

3.1.3修改core-site.xml

<configuration>
    <!-- 指定hdfs的nameservice为ns1 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns1</value>
    </property>
    <!-- 指定hadoop临时目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop/tmp</value>
    </property>
                    
    <!-- 指定zookeeper地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
</configuration>

3.1.4修改hdfs-site.xml

3.1.4修改hdfs-site.xml
<configuration>
  <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
  <property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
  </property>
  <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
  <property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
  </property>
  <!-- nn1的RPC通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>hadoop1:9000</value>
  </property>
  <!-- nn1的http通信地址 -->
  <property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>hadoop1:50070</value>
  </property>
  <!-- nn2的RPC通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>hadoop2:9000</value>
  </property>
  <!-- nn2的http通信地址 -->
  <property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>hadoop2:50070</value>
  </property>
  <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns1</value>
  </property>
  <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/root/hadoop/journaldata</value>
  </property>
  <!-- 开启NameNode失败自动切换 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <!-- 配置失败自动切换实现方式 -->
  <property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
        sshfence
        shell(/bin/true)
    </value>
  </property>
  <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/hadoop/.ssh/id_rsa</value>
  </property>
  <!-- 配置sshfence隔离机制超时时间 -->
  <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>
</configuration>

3.1.5修改mapred-site.xml

<configuration>
    <!-- 指定mr框架为yarn方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>    

3.1.6修改yarn-site.xml

<configuration>
    <!-- 开启RM高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>
    <!-- 指定RM的名字 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <!-- 分别指定RM的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop3</value>
    </property>
    <!-- 指定zk集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

3.1.6修改slaves

(slaves是指定子节点的位置,因为要在hadoop1上启动HDFS、在hadoop2启动yarn,所以hadoop1上的slaves文件指定的是datanode的位置,hadoop2上的slaves文件指定的是nodemanager的位置)

vim slaves

在文件中追加以下内容

hadoop1
hadoop2
hadoop3

3.1.7拷贝配置好的hadoop到其他服务器

scp -r /root/hadoop/ hadoop2:/root/
scp -r /root/hadoop/ hadoop3:/root/

3.2启动hadoop集群

3.2.1启动journalnode

/root/hadoop/sbin/hadoop-daemon.sh start journalnode

#运行jps命令检验,hadoop1、hadoop2、hadoop3上多了JournalNode进程
这一步是为了可以格式化namenode

3.2.2格式化hdfs

#在hadoop1上执行命令:

hdfs namenode -format

#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/root/hadoop/tmp,然后将/root/hadoop/tmp拷贝到hadoop2的/root/hadoop/下。

scp -r /root/hadoop/tmp/ hadoop2:/root/hadoop/

#也可以这样,建议hdfs namenode -bootstrapStandby

3.2.3格式化ZKFC(在hadoop1上执行即可)

hdfs zkfc -formatZK

3.2.4启动HDFS(在hadoop1上执行)

/root/hadoop/sbin/start-dfs.sh

3.2.5启动YARN

(#####注意#####:是在hadoop2上执行start-yarn.sh,如何可以的话把namenode和resourcemanager分开,不要放同一个服务器中,因为他们都要占用大量资源,他们分开了就要分别在不同的机器上启动)
在hadoop2上执行

/root/hadoop/sbin/start-yarn.sh

然后在hadoop3上执行

/root/hadoop/sbin/yarn-daemon.sh start resourcemanager

3.2.6查看是否成功

使用jps查看相关进程(图3.2.6(a,b,c))
hadoop1:


图3.2.6(a)

hadoop2:

图3.2.6(b)

hadoop3:

图3.2.6(c)

访问http://hadoop1:50070
看到active,说明这是活跃的namenode主服务器

图3.2.6(d)

访问http://hadoop2:50070
看到这个是standby,说明它是备胎,hadoop1的namenode挂掉,hadoop2就会顶上

图3.2.6(e)

如果看到图3.2.6(f)

图3.2.6(f)

说明hdfs集群成功

4.HBASE集群,集成到HADOOP中

这一步在hadoop1上执行

4.1修改HBASE配置

配置hbase集群,要修改3个文件(首先zk集群已经安装好了)

4.1.1把hadoop配置文件复制过来

我的hbase路径是/root/hbase/
注意:要把hadoop的hdfs-site.xml和core-site.xml 拷贝到/root/hbase/conf下

4.1.2修改hbase-env.sh

找到

export JAVA_HOME=/usr/java/jdk1.7.0_55 #改成你的jdk根目录
export HBASE_CLASSPATH=/root/hadoop/etc/hadoop #改成你的hadoop目录下的etc/hadoop目录
export HBASE_LOG_DIR=/root/hbase/logs #设置hbase的日志所在目录
export HBASE_MANAGES_ZK=false #因为默认会使用hbase自带的zookeeper,需要告诉hbase使用外部的zookeeper,也就是第一步配置好的zookeeper

4.1.3修改hbase-site.xml

该配置文件是hbase核心配置文件

vim hbase-site.xml
<configuration>
        <!-- 指定hbase在HDFS上存储的路径 -->
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://ns1/hbase</value>
        </property>
        <!-- 指定hbase是分布式的 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
    <!-- 指定zk的地址,多个用“,”分割 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
        </property>
</configuration>

4.1.3修改regionservers

该文件决定了hbase的从节点

vim regionservers

追加以下内容

hadoop1
hadoop2
hadoop3

4.1.4拷贝hbase到其他节点

scp -r /root/hbase/ hadoop2:/root/
scp -r /root/hbase/ hadoop3:/root/

将配置好的HBase拷贝到每一个节点并同步时间(hbase每个节点的时间不要大于30秒)。

4.2启动hbase

注意zookeeper和hadoop必须启动着,因为hbase依赖zookeeper进行集群,而我们的配置文件是使用外部的zookeeper,另外hbase是以hdfs作为分布式文件系统
启动hbase,在主节点上运行:

/root/hbase/bin/start-hbase.sh

4.2.1为保证集群的可靠性,要启动多个HMaster(在hadoop2上执行)

/root/hbase/bin/hbase-daemon.sh start master

4.2.1通过浏览器访问hbase管理页面

hadoop1:16010

图4.2.1

说明hbase启动成功,就可以使用hbase shell来当成数据库使用

注意:

搭建hadoop相关集群,需要把防火墙给关闭了。因为有大量通讯端口,和mapreduce会产生一些随机端口,所以hadoop的搭建需要关闭防火墙,关闭防火墙就出现安全性问题,所以hadoop适合在内网中使用!
非要启动防火墙的话,需要开放其中大量的端口防火墙白名单

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容