背景
前一段时间公司的几台机器要“回收”,其中有一台namenode主机。所以要进行namenode迁移,开始定了两套方案:
- 停集群,拷贝namenode所在机器上的【hadoop文件夹、hdfs数据文件夹、元数据文件夹】
- 利用HA,启动三台namenode等待他们的竟像文件一致后,停止掉回收的那个namenode。
比较:
- 停止集群拷贝的方法可能在停止集群时丢临近的元数据很少量的量,没有深入研究,可能是因为停止集群时有最近的元数据没有写进去(概率几乎为零)或在你(拷贝scp),压缩,解压的时候丢了几行末尾数据
- 利用ha自己同步元数据的方法是相对于1更有效的保护了数据的准确性。
一,复制迁移、 Hdfs (NameNode & DataNode) 迁移
1. 停止服务
迁移前请在原先的主机上停止hdfs和yarn的服务,如果有其他相关服务也需要都停止。
stop-dfs.sh
stop-yarn.sh或
stop-all.sh
如果你没有将hadoop/sbin目录配置到PATH的话,需要切到该目录下执行sh,之后执行的一些shell脚本也同理。
2. 复制hadoop文件夹、hdfs数据文件夹、元数据文件夹
1)首先将hadoop文件夹进行远程复制,主机复制到主机,从机复制到从机
(根据自己的用户是root的就用root,我的是sj)
scp -r hadoop sj@接收方hostname:/data/service/
我的hadoop文件夹放在/data/service/下,所以需要指定对方的sj账户,这儿使用的是整个文件夹复制的方式,推荐还是使用tar打包后再用scp传输,然后解压。
2)复制hdfs数据文件夹和元数据文件夹
两个文件夹的路径都是在hdfs-site.xml中配置过的
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/service_data/jg/hadoop/dfs/name</value>
</property>
dfs.namenode.name.dir配置了元数据的文件夹路径,元数据(fsimage和edits)只在namenode中记录,datanode.name.dir则是保存了所有数据块的文件夹,这儿的复制方式和上述的一样,不要忘了chown。由于我都设置在了hadoop文件夹里,所以在上一步中就连带着复制过去了。
3)修改hdfs和yarn配置
更新slaves文件(在主机上),以及hdfs-site.xml 、core-site.xml、mapred-site.xml、yarn-site.xml等文件中所有的ip设置,如果之前都是用hostname设置的那就不用修改了(hosts里已经设置了对应关系了),建议都换成使用hostname设置。
注意:如果修改了JAVA_HOME,那么hadoop/etc/hadoop下的hadoop-env.sh里的JAVA_HOME也需要修改,这儿必须写完整路径,不知为什么这个脚本跑的时候获取不到系统环境变量。
3. 启动hdfs
到这儿NameNode和DataNode的迁移工作就都完成了,开启下hdfs和yarn服务看下效果
start-dfs.sh
stat-yarn.sh或
start-all.sh
如果出现问题就去hadoop/logs目录下看对应的log信息。
二,利用Ha高可用迁移
2.1利用(一)中的方式把hadoop的数据都迁移,然后更改配置
vim hdfs-site.xml
<property>
<name>dfs.ha.namenodes.doumi-ana-online</name>
<value>nn1,nn2,nn3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.doumi-ana-online.nn1</name>
<value>g1-jg-hadoop-01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.doumi-ana-online.nn2</name>
<value>g1-jg-hadoop-02:8020</value>
</property><property>
<name>dfs.namenode.rpc-address.doumi-ana-online.nn2</name>
<value>g1-jg-hadoop-03:8020</value>
</property><property>
<name>dfs.namenode.http-address.doumi-ana-online.nn1</name>
<value>g1-jg-hadoop-01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.doumi-ana-online.nn2</name>
<value>g1-jg-hadoop-02:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.doumi-ana-online.nn2</name>
<value>g1-jg-hadoop-03:50070</value>
</property>
vim yarn-site.xml
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>nn1,nn2,nn3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.nn1</name>
<value>g1-jg-hadoop-01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.nn2</name>
<value>g1-jg-hadoop-02</value>
</property><property>
<name>yarn.resourcemanager.hostname.nn2</name>
<value>g1-jg-hadoop-03</value>
</property>
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>nn2</value><property>
<name>yarn.resourcemanager.address.nn1</name>
<value>g1-jg-hadoop-01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.nn1</name>
<value>g1-jg-hadoop-01:8130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.nn1</name>
<value>g1-jg-hadoop-01:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.nn1</name>
<value>g1-jg-hadoop-01:8131</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.nn1</name>
<value>g1-jg-hadoop-01:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.nn1</name>
<value>g1-jg-hadoop-01:23142</value>
</property>
<property>
<name>yarn.resourcemanager.address.nn2</name>
<value>g1-jg-hadoop-02:8132</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.nn2</name>
<value>g1-jg-hadoop-02:8130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.nn2</name>
<value>g1-jg-hadoop-02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.nn2</name>
<value>g1-jg-hadoop-02:8131</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.nn2</name>
<value>g1-jg-hadoop-02:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.nn2</name>
<value>g1-jg-hadoop-02:23142</value>
</property>
<property>
<name>yarn.resourcemanager.address.nn3</name>
<value>g1-jg-hadoop-03:8132</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.nn3</name>
<value>g1-jg-hadoop-03:8130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.nn3</name>
<value>g1-jg-hadoop-03:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.nn3</name>
<value>g1-jg-hadoop-03:8131</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.nn3</name>
<value>g1-jg-hadoop-03:8033</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.nn3</name>
<value>g1-jg-hadoop-03:23142</value>
</property>
PS:yarn.resourcemanager.ha.id 这里要注意下这个没台机器都是对应hostname.nn2
journalnode 三台一致就可以了 这个可以不改
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://g1-jg-hadoop-22:8485;g1-jg-hadoop-21:8485;g1-jg-hadoop-17:8485;g1-jg-hadoop-18:8485;g1-jg-hadoop-19:8485;g1-jg-hadoop-20:8485;g1-jg-hadoop-08:8485/
doumi-ana-online</value>
</property>
start-dfs.sh
stat-yarn.sh或
start-all.sh
还有datanode的配置每台都要改
我把一些配置文件上传供参考等审核过了放地址。
这个方法中间可能出现一些小问题,能做线上namenode迁移应该都能解决,如果不是生产环境那就不需要那么谨慎丢点元数据也是可以接受的。