跨版本迁移旧集群到新集群

跨版本迁移旧集群到新集群(hadoop2.2移到hadoop2.8),遇到无数问题,历时三周,终于圆满结束,总结如下:

一. 搭建新集群

新集群用了5台实体机,分别安装zookeeper、hadoop、hbase等。机器的ip尾号分别是16、17、18、19、20,所以下面的文字,用这几个数字代表这几台机器。参考帖子如下,建议下面两个链接的帖子都看完,再开始动手搭建自己的集群环境:

下载安装包,配置集群机器互相免密登录,zookeeper、hadoop、hbase启动前的配置,此帖子不错:https://blog.csdn.net/qazwsxpcm/article/details/78937820 

查看启动顺序配置,此帖子不错:https://blog.csdn.net/u011414200/article/details/50437356#%E4%B8%89-%E5%BC%80%E5%90%AF%E4%B8%8E%E5%85%B3%E9%97%AD%E9%9B%86%E7%BE%A4%E9%A1%BA%E5%BA%8F

过程中遇到各种问题,所以把集群停止启动多次,总结 用到的命令如下:

(1)清场工作(如果初次安装,则不用这些命令)

step1:16-20所有机器,执行 ps -ef|grep java , 查看所有java进程,就可以看到所有集群相关的进程,比如zookeeper、hadoop、hbase之类的进程,执行 kill -9 xxx xxx   杀掉这些进程,这里的xxx是进程号。如果是按照以下步骤(2)中的启动方式启动的,那么在16这个master机器上,执行以下三条命令,能快速杀掉一批集群进程,提高杀进程的效率:

/data/hadoop/app/hbase-1.2.6/bin/stop-hbase.sh
/data/hadoop/app/hadoop-2.8.2/sbin/stop-yarn.sh
/data/hadoop/app/hadoop-2.8.2/sbin/stop-dfs.sh

step2:16-20所有机器  cd /data/hadoop/app/hadoop-2.8.2/hdfs
                 rm -rf *
(2)启动工作

step1: 16-20所有机器上,启动zookeeper,也就是5个机器上都执行:/data/hadoop/app/zookeeper-3.4.10/bin/zkServer.sh start

step2: 16-20所有机器上,启动journalnode,也就是5个机器上都执行: /data/hadoop/app/hadoop-2.8.2/sbin/hadoop-daemon.sh start journalnode

step3: 16机器上(因为想选16机器为namenode的master机器),执行 /data/hadoop/app/hadoop-2.8.2/bin/hdfs namenode -format

step4: 16机器上,继续执行 /data/hadoop/app/hadoop-2.8.2/bin/hdfs zkfc -formatZK

step5:16机器上,执行 /data/hadoop/app/hadoop-2.8.2/sbin/start-dfs.sh,这条命令执行的时候,你必须 已经参考上面的参考链接里的内容,把hadoop里的core-site.xml、 hdfs-site.xml、yarn-site.xml、 slaves 等文件,以及hbase/conf 下面的backup-masters文件(没有的话需要自己touch一下新建)、regionservers、hbase-site.xml等文件 都配置好了,

step6:想把17机器当成16机器的备机,17机器上执行:

                        /data/hadoop/app/hadoop-2.8.2/bin/hdfs namenode -bootstrapStandby
                        /data/hadoop/app/hadoop-2.8.2/sbin/hadoop-daemon.sh start namenode   

                        
step7:16机器上,检查安装工作。执行下面两个命令, 一个命令的结果应该是active,另外一个命令的应该是standby,否则两个namenode应该安装的有问题。

            /data/hadoop/app/hadoop-2.8.2/bin/hdfs haadmin -getServiceState nn1
            /data/hadoop/app/hadoop-2.8.2/bin/hdfs haadmin -getServiceState nn2
        
step8: 16机器上,执行/data/hadoop/app/hadoop-2.8.2/sbin/start-yarn.sh ,也就是所有机器上启动了nodeManager,而且16机器上还启动了resourcemanager

step9: 17机器上,执行/data/hadoop/app/hadoop-2.8.2/sbin/yarn-daemon.sh start resourcemanager                           

step10: 16-17机器上,分别执行/data/hadoop/app/hadoop-2.8.2/sbin/mr-jobhistory-daemon.sh   start historyserver ,这样就可以查看日志了,比如distcp命令的执行是否成功等,浏览器输入http://10.xx.xx.16:19888/jobhistory ,即可查看
step11: 16机器上,执行/data/hadoop/app/hbase-1.2.6/bin/start-hbase.sh  启动了所有的hmaster和hregionserver

(3)检查工作:
step1: 16-20所有机器上,输入 jps 命令,查看启动了的进程,是否齐全。

step2: 16-20所有机器上,输入 hadoop checknative -a 命令,检查hadoop是否安装好,如果命令执行的结果,是所有配置都是空,那么就有问题。先 执行 cp /hadoop的目录/hadoop-2.8.2/lib/native/* /hadoop的目录/hadoop-2.8.2/lib/, 然后再在  /etc/profile 文件里面添加一句 打印日志的配置:

export HADOOP_ROOT_LOGGER=DEBUG,console  ,修改完profile文件后,保存,然后再次执行hadoop checknative -a 命令,发现提示信息 这个版本的hadoop 需要这个glibc 2.14版本及以上,那么开始安装glibc 2.14,不过安装方式得注意,不能安装glibc的tar.gz 这个包,要安装rpm包,否则会导致linux机器内核挂掉,机器崩溃,或者reboot了,glibc又回滚到之前的旧版本了。glibc 2.14 的rpm安装步骤,参考:https://blog.csdn.net/lxlmycsdnfree/article/details/80695593

大概7个需要安装的相关文件:

跨版本迁移旧集群到新集群_第1张图片

安装完glibc 2.14,然后再次执行hadoop checknative -a 命令,会发现返回的值都是不为空的。查看自己安装的glibc 新版本成功没有,命令是:strings /lib64/libc.so.6 | grep GLIBC

二. 迁移hbase数据

(1)选择迁移方法

旧集群的hbase里,就一个表,数据量大概四百多G, 迁移如果用 export/import的话,太慢,光export这个命令,就能执行40个小时。所以选用了distcp这个命令。

(2)执行命令前的一些配置工作:

A.   把旧集群机器上的 etc/hosts文件中的配置,复制粘贴,追加到 新机器的16-20机器上的etc/hosts文件中。也就是新集群机器上的hosts文件中,既有新集群机器的 hostname和ip的配置,又有旧集群的机器 hostname和ip的配置。如果不做这个步骤,distcp过程中会报错。

B. 16机器上的hadoop下的hdfs-site.xml文件中,还添加了以下配置,也是因为跨版本迁移的编码方式不一样,而添加的。

 
      dfs.checksum.type
      CRC32
  

C. 最好把旧集群的hbase停掉,这样 distcp拷贝过程会很顺利,否则会报错。如果旧集群hbase实在不想停,那多执行几遍distcp命令,直到100%的数据都拷贝过来为止,没测过正确性,目测好像所有数据都拷过来了。

(3)执行命令:

16机器上,执行命令如下:hadoop distcp -update -skipcrccheck hftp://10.10.2x.xxx:50070/hbase/data/default/history_table hdfs://xx.xx.xx.16:9000/hbase/data/default/history_table

(4)命令详解:

其中的 -update -skipcrccheck 这个参数是必须的, 因为旧的集群,hadoop版本是2.2,新的hadoop版本是2.8,二者版本差异太大,编码方式不一样。旧集群的 前缀用了 hftp://  ,新集群的前缀用了 hftp://,也是因为跨版本集群的迁移。端口50070和9000,是分别在旧集群 和新集群的机器的 hadoop路径下的 hdfs-site.xml文件中查到的。

例如:

 
    dfs.namenode.rpc-address.ns1.nn1
    hadoop1:9000
 

(5)distcp常见错误:

首先,命令的参数之间不能有多余的空格,比如两三个空格。

其次,如果报running beyond physical memory limits 之类的错误,那就是需要修改Hadoop下的mapred-site.xml文件,里面添加内容有:

 
    yarn.app.mapreduce.am.staging-dir
    /user
  
  
    yarn.app.mapreduce.am.resource.mb
    8192
  
  
    yarn.app.mapreduce.am.resource.cpu-vcores
    1
  
  
    mapreduce.job.ubertask.enable
    false
  
  
    yarn.app.mapreduce.am.command-opts
    -Djava.net.preferIPv4Stack=true -Xmx4294967296
  
  
    mapreduce.map.java.opts
    -Djava.net.preferIPv4Stack=true -Xmx5368709120
  
  
    mapreduce.reduce.java.opts
    -Djava.net.preferIPv4Stack=true -Xmx6442450944
  
  
    mapreduce.map.memory.mb
    6144
  
  
    mapreduce.map.cpu.vcores
    1
  
  
    mapreduce.reduce.memory.mb
    8192
  
  
    mapreduce.reduce.cpu.vcores
    1
  
  

保存后,如果distcp还报一样的错误,那就修改hadoop路径下的share文件夹里的hadoop-distcp-2.x.x.jar 这个jar包,用命令jar -xvf hadoop-distcp-2.x.x.jar 解压,把里面的xml文件里的内存配置删除掉,类似如下:


        mapred.job.map.memory.mb
        1024
   

   
        mapred.job.reduce.memory.mb
        1024
   

保存此xml文件,然后用 jar -cvf hadoop-distcp-2.x.x.jar *  再次打包,并替换掉之前的hadoop-distcp-2.x.x.jar 包,并保证集群每台机器都用这个新的jar包。改这个jar包,是因为这个jar包里对内存的配置,可能会覆盖掉之前mapred-site.xml文件对内存的配置

三. 分配hbase数据
粗略看一眼数据量,比如浏览器访问 新集群机器 xx.xx.xx.16:50070 , 查看datanode下面大概的数据量,符合总数400多G。

16机器上,执行 hbase shell 命令,打开hbase命令窗口,执行 list , 发现并没有 表,因为distcp命令,把hbase数据,拷贝到datanode了,但是并没有和hbase挂钩。所以需要 退出hbase shell 窗口,需要依次执行

hbase hbck -fixMeta (重新生成meta表数据,才能在hbase shell命令窗口看到 迁移过来的表),

hbase hbck -fixAssignments (分配到各个集群机器上)
hbase hbck -repairHoles (修复漏洞,这个命令必须有,不然会出现 canal之类的都配置好后,hbase插入的数据的时间戳,慢两小时,报错信息如下:Requested row out of range for doMiniBatchMutation on HRegion ,用命令hbase hbck -details :

   可以看出 hbase是否需要repair hole,不管有无hole,修复一下没坏处)

hbase shell命令窗口,可能用到的命令:

list   查看该空间下所有的表

scan '表名'    返回该表的所有数据

describe '表名'  返回表的结构描述

scan '表名',{FILTER=>"PrefixFilter('100990-154147')"}    查看 rowkey 为“100990-154147”开头的所有数据,其中-后面的这个数据一般为时间戳,单位为毫秒

get '表名','101244-1538396364000'   获取表中rowkey为101244-1538396364000的数据行

put '表名','100990-1541475190000','cf:q','54961736'  往表中插入一条数据:参数依次是表名,rowkey,列名,值,值得注意的是,时间戳是自动加的。

四. 迁移 canal

将老集群上的1.0.16 ,用scp -r命令 拷贝到 新集群的其中一个机器上,我选择了20机器。然后把canal-1.0.16/conf/example下的instance.properties文件中的canal.instance.mysql.slaveId值改了一下,比如之前旧集群的是1236,我这里改成1237 。因为canal相当于mysql的一个slave,测试的时候,想着 旧集群的canal和新集群的canal同时使用着,所以这里的slaveId改了一下。

依次启动 canal 和 hbase_netty.jar  canal_netty.jar ,这两个jar,相当于canal客户端,canal_netty.jar 的代码,配置了20这个机器的root和机器密码,可以参考canal官方的canal client代码。hbase_netty.jar 里,配置了集群的信息,需要把新集群的core-site.xml、 hdfs-site.xml、hbase-site.xml 三个文件,拷贝到这个hbase_netty.jar的 项目里,替换掉就的xml文件即可。

打包jar包的时候,注意两点:

1.  eclipse中对这两个jar包打包前,需要配置一下 run configuration,在run configuration里面的application里面指定一下main方法的位置。

2. eclipse打包这两个jar包, export 的时候,选择 成 Runnable JAR file, 否则上传到linux执行不起来。

跨版本迁移旧集群到新集群_第2张图片

跨版本迁移旧集群到新集群_第3张图片

五. 升级 旧项目的jdk、tomcat等

将旧项目的jdk1.6 tomcat6,升级成 jdk1.8 tomcat9,需要修改对应的jar包,从集群的hbase的lib目录下,拷贝了所有jar包,替换掉旧项目的jar包,并且旧项目的前端文件 tld文件,之前在 目录WEB-INF/tags下,由于新版本的tomcat 规则变了,查看tomcat9的apache-tomcat-9.0.12\webapps\examples\WEB-INF 路径下的每个文件,发现tld文件,应该放到WEB-INF/jsp2 路径下,所以项目的前端代码中,新建jsp2路径,将tld文件,移到它下面。

 

 

 

你可能感兴趣的:(HBase)