记存储集群的一次迁移过程(上)

搭建和配置 Hadoop, Zookeeper, Hbase

Created on 2018-08-05 16:16:00

最近负责公司测试环境的迁移,主要包括 Hbase+Mysql 存储集群的迁移,消息队列,缓存 组件的迁移, 而我打算说说存储集群的迁移。因为公司的机器的Ip 和Host 不便在博文展示, 所以我会用:

192.168.2.1: node-master
192.168.2.2: node1
192.168.2.3: node2

来代替公司的机器和域名。

搭建新环境

Hadoop 搭建流程

Hadoop 集群的架构

在配置 Hadoop 的主从节点(master/slave)之前,先来了解一下 Hadoop 集群的组件作用; master 节点负责担任管理分布式文件系统以及进行相应的资源调度的角色:

  • NameNode: 管理分布式文件系统并且感知数据块在集群的存储位置
  • ResourceManager: 管理 YARN 任务,并且负责在 slave 节点调度和处理 slave 节点负责担任存储真实的数据并且提供运算 YARN 任务的能力的角色:
  • DataNode: 负责物理存储真实的数据
  • NodeManager: 管理在该节点 YARN 任务的具体执行。

masterslave 的角色不一定像上面划分得泾渭分明,比如 master 节点也可以是 dataNode,这个就看具体配置了。

配置JDK

Hadoop 集群需要JAVA 环境,而Linux 的发行版本一般都是默认带有JDK 的,只是OpenJDK 而不是 Oracle JDK, 如果需要修改JDK 的版本,可以自行修改,网上已经有很多安装JDK 的教程,我就不一一讲解了。

修改host

因为需要不同的机器之间通信,所以需要先配置好Ip 和域名的映射。修改每台机器的 /etc/hosts 文件,加上以下内容:

192.168.2.1: nodw-master
192.168.2.2: node1
192.168.2.3: node2

新建 hadoop 用户

虽说我可以用我自己的登录名来配置和运行 hadoop, 但是出于安全的考虑,还是在每个节点创建一个 专门用来运行 hadoop 集群的用户比较好。

useradd hadoop
passwd hadoop

SSH 免密码登录

因为在 Hadoop 集群中, node-master 节点会通过SSH连接和其他节点进行通信,所以需要为 Hadoop 集群配置免密码校验的通信。首先以 hadoop 用户身份登录到 node-master 节点, 然后生成 SSH的公私钥:

ssh-keygen -b 4096

然后把公钥复制到其他的节点,如果你想要把 node-master也当作dataNote的话,就需要把公钥也复制到 master节点:

ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node-master
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node1
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node2

谨记:复制的是"公钥",不是"私钥".

安装hadoop

  1. 下载hadoop 安装包,以 hadoop登录node-master,采用 wget命令下载: wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.1.tar.gz

  2. 创建一个hadoop目录,将各个组件都安装在这个目录。

mdkir ~/hadoop
tar -zxvf hadoop-2.6.0-cdh5.7.1.tar.gz -C ~/hadoop

修改配置文件

所有修改的 hadoop配置文件都位于 ~/hadoop/etc/hadoop/ 目录

cd ~/hadoop/etc/hadoop
设置 NameNode 位置

vim core-site.xml: 修改成以下内容:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://node-master:19000</value>
  </property>
  <property>
    <name>fs.trash.interval</name>
    <value>10080</value>
  </property>
  <property>
    <name>fs.trash.checkpoint.interval</name>
    <value>10080</value>
  </property>
</configuration>
设置 HDFS 路径

vim hdfs-site.xml,修改内容为:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/hadoop/data/temp</value>
  </property>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>node-master:50070</value>
  </property>
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>node1:50090</value>
  </property>
  <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/home/hadoop/hadoop/data/hdfs</value>
  </property>
</configuration>
将 YARN 设置成任务调度器(Job Scheduler)
cp mapred-site.xml.template mapred-site.xml

然后修改配置,将 yarn 设置成 MapReduce 操作的默认框架: vim mapred-site.xml:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>node-master:10020</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>node-master:19888</value>
  </property>
</configuration>
配置 YARN

vim yarn-site.xml:

<configuration>
    <property>
            <name>yarn.acl.enable</name>
            <value>0</value>
    </property>

    <property>
            <name>yarn.resourcemanager.hostname</name>
            <value>node-master</value>
    </property>

    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
    </property>
</configuration>
配置 master 节点

因为公司的机器内存较大,兼之机器数不多,所以我就把两台机器都都当作 master: vim masters修改文件为:

node-master
node1
配置 slave 节点

把全部节点都当作数据几点(dataNode): vim slaves:

node-master
node1
node2
修改 Hadoop 环境变量配置

这个配置是否修改就视情况而定了。 vim hadoop-env.sh:

#因为ssh的端口不是默认的22,需要重新指定
export HADOOP_SSH_OPTS="-p 9922"
#如果报错java_home找不到,可在这里重新指定
#export JAVA_HOME=/usr/java/jdk1.8.0_161/
在其它的节点安装并且解压,不要修改配置文件
将配置文件同步到slave主机
 scp -r -P 9922 /home/hadoop/hadoop/hadoop-2.6.0-cdh5.7.1/etc/hadoop/  node1:/home/hadoop/hadoop/hadoop-2.6.0-cdh5.7.1/etc
 scp -r -P 9922 /home/hadoop/hadoop/hadoop-2.6.0-cdh5.7.1/etc/hadoop/  node2:/home/hadoop/hadoop/hadoop-2.6.0-cdh5.7.1/etc
修改环境变量(所有节点都要配置)

编辑 .bash_profilevim ~/.bash_profile 加入:

export JAVA_HOME=/usr/java/jdk1.8.0_161/
export JRE_HOME=/usr/java/jdk1.8.0_161/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export HADOOP_HOME=/home/hadoop/hadoop/hadoop-2.6.0-cdh5.7.1
export HBASE_HOME=/home/hadoop/hadoop/hbase-1.2.0-cdh5.7.1
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HADOOP_HOME/bin
export PATH

然后加载 ~/.bash_profile: source ~/.bash_profile

格式化 HDFS

就像其它的文件系统那样,在使用之前需要格式化,HDFS 这个分布式文件系统也不例外。在 node-master,运行:

hdfs namenode -format

那么,到目前为止, Hadoop 就已经安装和配置好了。

运行和监控 HDFS

启动HDFS

node-master/home/hadoop/hadoop/sbin/ 目录运行下面的命令以启动 HDFS:

./start-dfs.sh

然后就会启动 NameNodeSecondaryNameNode, 然后继续启动 DataNode.

验证HDFS

可以在各个节点通过 jps 检查HDFS 的运行状态。比如在 node-master 运行 jps:

12243 NameNode
2677 ResourceManager
19593 Jps
15036 DataNode

node1:

30464 DataNode
13094 Jps
28589 SecondaryNameNode
停止HDFS

node-master/home/hadoop/hadoop/sbin/ 目录运行下面的命令以停止HDFS:

./stop-dfs.sh
监控HDFS

如果你在启动 HDFS 之后,想要获取关于 HDFS 的详细信息,你可以使用 hdfs dfsadmin -report 命令, 例如在 node-master 运行 hdfs dfsadmin -resport, 输出如下:

Configured Capacity: 1201169780736 (1.09 TB)
Present Capacity: 1129442681745 (1.03 TB)
DFS Remaining: 1129442358161 (1.03 TB)
DFS Used: 323584 (316 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (3):

Name: 192.168.2.3:50010 (node2)
Hostname: node2
Decommission Status : Normal
Configured Capacity: 400389926912 (372.89 GB)
DFS Used: 102400 (100 KB)
Non DFS Used: 24759164513 (23.06 GB)
DFS Remaining: 375630659999 (349.83 GB)
DFS Used%: 0.00%
DFS Remaining%: 93.82%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 11
Last contact: Mon Mar 05 14:05:38 CST 2018


Name: 192.168.2.2:50010 (node1)
Hostname: node1
Decommission Status : Normal
Configured Capacity: 400389926912 (372.89 GB)
DFS Used: 77824 (76 KB)
Non DFS Used: 23483977479 (21.87 GB)
DFS Remaining: 376905871609 (351.02 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.13%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 7
Last contact: Mon Mar 05 14:05:38 CST 2018


Name: 192.168.2.1:50010 (node-master)
Hostname: node-master
Decommission Status : Normal
Configured Capacity: 400389926912 (372.89 GB)
DFS Used: 143360 (140 KB)
Non DFS Used: 23483956999 (21.87 GB)
DFS Remaining: 376905826553 (351.02 GB)
DFS Used%: 0.00%
DFS Remaining%: 94.13%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 7
Last contact: Mon Mar 05 14:05:39 CST 2018

或者可以使用更加友好的 Web 管理界面,在浏览器输入: http://node-master-ip:50070, 然后你就可以看到如下的监控界面:

使用 HDFS

既然 HDFS 可以跑起来了,现在就需要添加一点数据以测试 HDFS 了。 在HDFS 的根目录下新建一个 test 目录:

hdfs dfs -mkdir /test

然后在本地创建一个 helloworld 文件,内容如下:

Bye world!

接着把 helloworld 文件放置到HDFS的 /test 目录下:

 hdfs dfs -put helloworld /test

最后查看文件是否存在:

hdfs dfs -ls /test

小结

至此,如果一切顺利的话, 那么Hadoop 集群就运行起来了。因为我是需要用Hbase 作存储 集群,暂不需用Yarn 作计算,所以我就没有介绍启动 Yarn 的 流程了。

ZooKeeper 搭建流程

因为需要用 ZooKeeper 来管理集群,所以也需要安装 ZooKeeper. 而 ZooKeeper 的安装和 配置也是用 hadoop 用户进行操作的。

安装zookeeper (每个节点同样的操作)

  1. 下载zookeeper安装包,登录主机,采用wget命令下载: wget http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.7.1.tar.gz

  2. 解压安装到hadoop目录,将各个组件都安装在这个目录。

tar -zxvf zookeeper-3.4.5-cdh5.7.1.tar.gz -C ~/hadoop

配置 ZooKeeper

修改zoo.cfg (所有机器一样的配置): vim /home/hadoop/hadoop/zookeeper-3.4.5-cdh5.7.1/conf/zoo.cfg, 配置文件内容如下:

# The number of milliseconds of each tick
tickTime=2000
maxSessionTimeout=300000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/hadoop/hadoop/zookeeper-3.4.5-cdh5.7.1/data
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=node-master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888
创建myid文件 (不同主机不同数字)
cd {data_dir} # 按照上面的配置,就应该是/home/hadoop/hadoop/zookeeper-3.4.5-cdh5.7.1/data
vim myid

myid的数字要与zoo.cfg配置的一一对应。即要对应:

server.1=node-master:2888:3888
server.2=node1:2888:3888
server.3=node2:2888:3888

也就是 node-mastermyid1, node1myid2,依次类推。需要注意的 是,数字前后都不能有空格!

启动 ZooKeeper

node-master/home/hadoop/hadoop/zookeeper-3.4.5-cdh5.7.1 目录,运行以 下命令:

sh bin/zkServer.sh start

其它相应的命令如下:

  • 启动ZK服务: sh bin/zkServer.sh start
  • 查看ZK服务状态: sh bin/zkServer.sh status
  • 停止ZK服务: sh bin/zkServer.sh stop
  • 重启ZK服务: sh bin/zkServer.sh restart
验证 ZooKeeper

可以通过调用 jps 或者 bin/zkCli.sh 来验证 Zookeeper 的运行情况:

./zkCli.sh -server 192.168.2.1:2181

HBase 搭建流程

安装Hbase

  1. 下载hbase 安装包,登录主机,采用wget命令下载: wget http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.7.1.tar.gz 2、解压安装到hadoop目录(3台主机同样操作)
tar -zxvf hbase-1.2.0-cdh5.7.1.tar.gz -C ~/hadoop

修改hbase的配置文件(所有主机一样的配置)

修改 hbase-1.2.0-cdh5.7.1/conf 目录下的文件:

  1. 修改 hbase-site.xml 内容如下:
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://node-master:19000/hbase-${user.name}</value>
  </property>
  <property>
    <name>hbase.master</name>
    <value>node-master</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.tmp.dir</name>
    <value>/home/hadoop/hadoop/data/hbase-${user.name}</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>node-master, node1, node2</value>
  </property>
</configuration>
  1. 修改 hbase-env.sh:
export JAVA_HOME=/usr/java/jdk1.8.0_161/ (无法识别系统的环境变量,在这里直接指定)
export HBASE_MANAGES_ZK=false  (关闭自带的zookeeper)
export HBASE_SSH_OPTS="-p 9922" (端口号不是默认的22,要改为9922)
  1. 修改 regionservers(指定regionservers的主机地址):
node-master
node1
node2

启动 Hbase

node-master/home/hadoop/hadoop/hbase-1.2.0-cdh5.7.1/bin 目录下运行:

start-hbase.sh

监控 Hbase

可以在浏览器查看 HBase 集群的信息:

  • HMaster web 管理信息:http://192.168.2.1:60010/master-status
  • HregionServer 管理信息:http://192.168.2.1:60030/ http://192.168.2.2:60030/ http://192.168.2.3:60030/

结语

整个 Hbase 集群应该搭建完了,关于Mysql 搭建的文章就太多了,我也不赘言了。至此, 所有存储的组件就已经安装完毕并已启用,但是都是没有数据的,接下来我们需要做的是如 何将旧的测试环境的数据迁移到新的测试环境。考虑到这篇内容已经很长了,剩下的内容我就另外 写一篇博文了。

参考