数据迁移心得

  

   前几天出差,去客户现场帮忙迁移数据,经过几天的奋战,终于将迁移数据自动化起来,并且可以日跑批操作,这里小编就跟大家分享下,这其中踩过的坑(也可能是实战经验不丰富导致)。
   首先,荣小编我抱怨一下,不是自己熟悉的开发环境真的有些难过,给一台电脑,咱不说没有IDE,就连java都没有安装,连接数据库的工具也没有,唯一值得庆幸的是有xshell,但是完全不符合个人快捷键的喜好,没办法,想要开发高效,自己动手配置吧。单单是配置这些开发环境就整整牺牲了小编一上午的时间,还好后期开发有明显的提速。中午吃个饭,下午进入正题。
   下午拿到迁移任务,发现一个库中有很多表,其中表有大有小,当时我沉默了几秒钟,感觉这个星期是交代在这里了。这里小编在那几秒钟的沉默中也把这个迁移流程想了一下,首先数据是存在关系型数据库中的,然后我们要通过sqoop将数据上传到HDFS中,然后用蜂巢的外表去映射这些数据,最终建立有索引的内表来存储一份完整的数据。内表一般都是分区,分桶,且有索引的兽人表,查询速度明显比外表快很多。那么接下来小编就将这其中的步骤,一点点的分析下。

  

前期准备:

  

   拿到一个库的数据时,我们首先分析下这里有哪些表比较大,哪些表比较小,将大表和小表分开,使用不同的迁移方法,一般都是客户提供每张表的数据条数,如果没有的话,只能<强> selecct count(*)从表;将这些表的数据查出来,不仅便于区分大小表,而且对后期数据核对有较大的帮助。

  

1。从关系型数据库将数据迁移到HDFS中

  

   这里迁移数据小编是用的sqoop,虽然sqoop比较慢,但是学习成本相对较低,而且便于批量的生成语句,对开发要求没那么高。首先先测试一个sqoop是否可以成功的迁移数据,然后编写脚本批量的生成sqoop语句,最后调用这些语句,后台并行的迁移数据。这里小编先说说使用sqoop的几个小窍门:

  
      <李>如果集群的资源比较充分,一般新集群是没有什么生产任务的,我们的sqoop语句中可以加入:   
     <代码> - m这个参数可以设置为祝辞1,表示并行多个地图去抽取数据。
      ——将其当然- m参数设置大于后,要同时设置这个参数,表示以表中的哪一个字段去分地图并行。 
      

    这里选取,分割了尽量使用表中比较分散的字段,保证每一个地图任务抽取的数据量都大致相同。

      <李>   

    如果表的数据量比较大,比如超过亿条,我们这里就需要将这个表分成多个sqoop去抽取:

      

    ——查询:指定地方后的条件,抽取部分数据
       这样的好处是:如果只有一个sqoop任务,抽取了90%的数据后,发现sqoop任务挂了,那么本次抽取失败,不仅耗时,而且数据没有抽取到。分多个sqoop任务,不仅可并行,而且每个任务的数据量也不大,如果有任务挂了,只需要抽象抽取那个地方条件下的数据即,并且对于找错也有极大的帮助。
       分区字段的选取也同样重要,这里一般都是使用日期作为那里的后的条件,保证每个sqoop任务分的的数据量相差无几。

      
        <李> sqoop抽取数据的目录规划   
       <代码> #小表目录规划/tmp/库名/表名
        #大表的目录规划/tmp/库名/表名/分区名 
        
      李   <李>   

    查询语句:在sqoop命令中,我们编写查询语句去抽取数据时,切记不要:

      

    ——×
    select *表;
    -√
    选择字段1,字段2 ....从表;
    不然可能会导致sqoop抽取速度变慢,甚至可能导致没有抽取到数据。
       当我们注意了以上的内容后,就可以编写脚本批量的生成每张表的sqoop语句了,根据库名。表名,获取关系型数据库中表的元数据,最后将sqoop组装起来。最后在编写任务脚本,定时执行这些sqoop语句。
    <>强实际数据分享:
       这里小编测试过,数据量比较大时,多sqoop和单sqoop的耗时:
    以600克数据为例:
       ——多sqoop并行抽取数据耗时:3 ~ 4小时。
       ——单sqoop抽取数据耗时:12个小时以上。
       ——单sqoop,,(- m 1)抽取5千万条数据,大概是27分钟。

      李   
  

2。建立外表映射

  

   说白了就是将抽取到的数据,在蜂巢中通过外表的方式映射出来,其实这里没什么难的,主要是看客户如果要求,可能是外表单独一个库,或者外表的名称统一是:表名_ext。但是切记,不要手动的去编写建表语句,如果表有百张以上,心态容易炸,这里可以使用关系型数据库的元数据,生成蜂巢的建表语句的,这里我们与MySQL为例:

数据迁移心得