记一次私有云向阿里adb导数

◇◆丶佛笑我妖孽 提交于 2020-04-16 12:31:44

【推荐阅读】微服务还能火多久?>>>

1、背景

刚到新公司不久,领导安排了一个组件调研的数据支持工作。
简单说就是从私有云中的数据导出千万级数据量到adb中,为QuickBI调研提供支持。

adb是阿里提供的一个类似mysql的服务,整个任务可以抽象成:从分布式系统向关系型数据库同步数据,可以归类到ETL工作中。

2、问题

  • 首次接触阿里云相关的组件,需要熟悉相关组件的使用。
  • leader提出了用sqoop进行处理,但是私有云中未安装。
  • 同事提出历史方案,通过将数据上传到oss,利用adb中类似hive外部表的特性进行数据传输。

3、实施方案

因为有了大数据相关的经验,阿里云的相关组件,上手还是比较快的。

  1. 利用sqoop工具

由于是第一次安装sqoop,安装过程中对linux的操作更熟悉了一些,对私有云组件的安装情况有个快速的了解。
在使用sqoop中遇到几个问题: 集群客户端节点无法连接到adb --- 经排查是未将客户端ip添加到adb白名单引起的。处理方案:找运维添加白名单。
由于adb提供的服务地址不是ip地址,所以遇到了数据库url解析异常问题 处理方案:通过 ping 相应的域名获取到ip地址,替换原有url服务地址。

运行修改后的脚本,任务还是不能顺利执行,通过查找任务对应的堆栈信息,得到下面的信息: 超时!?那增加数据库的超时时间和socket超时时间。结果是好的,但并没有解决问题,报错信息发生了变化: 最后分析sqoop的运行机制导致,发现是集群节点不能连接到adb。 在客户端讲任务提交到yarn后,yarn将任务下发到不同节点执行,此时每个节点与adb单独通信,由于没有在adb配置白名单,最终导致网络不通。问题反馈给leader,此方案到此告一段落。

  1. 利用oss中转(最终方案)
  • 由于需要导出的数据采用orc格式存储,导出时需要采用文本格式。
  • 由于服务器物理储存限制,每次上传oss的数据不能过大,需要多文件上传。 上述两个问题可以通过在hive中清洗一张临时表解决存储格式问题,mr的计算框架生成多个文件,完美解决多文件上传问题。 方案的主要步骤: 清洗临时表 -> 编写shell脚本,从hdfs获取文件列表,循环执行:拉取、上传、删除操作 -> 在adb中创建oss创建外部映射表,进行数据清洗
    此过程中遇到了单条数据异常问题,导致adb select时异常,最终采用两个策略:数据上预处理,对所有字段进行字符替换操作,经业务调研,最终决定替换‘\n’、‘\r’、‘&’三个字符,并使用‘&’作为分割符;上述处理并不能完全解决异常问题,adb支持人员给出两种解释:a、数据中存在空行会引起异常;b、csv解析的时候如果存在"符号需要成对存在。有些不成对存在的会解析错误。可以在外表定义里加上 "ossquote","#" 来规避,同样有"问题。 最终和需求人员沟通,决定删除导致异常的文件。数据量只是少了几十万。 任务完结撒花~

4、总结

  • 后期处理异常时,增加原理上的思考;
  • 解决方案是一个不断优化迭代的过程;
  • 数据工作,方法和耐心是需要保持在线的。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!