1、背景
刚到新公司不久,领导安排了一个组件调研的数据支持工作。
简单说就是从私有云中的数据导出千万级数据量到adb中,为QuickBI调研提供支持。
adb是阿里提供的一个类似mysql的服务,整个任务可以抽象成:从分布式系统向关系型数据库同步数据,可以归类到ETL工作中。
2、问题
- 首次接触阿里云相关的组件,需要熟悉相关组件的使用。
- leader提出了用sqoop进行处理,但是私有云中未安装。
- 同事提出历史方案,通过将数据上传到oss,利用adb中类似hive外部表的特性进行数据传输。
3、实施方案
因为有了大数据相关的经验,阿里云的相关组件,上手还是比较快的。
- 利用sqoop工具
由于是第一次安装sqoop,安装过程中对linux的操作更熟悉了一些,对私有云组件的安装情况有个快速的了解。
在使用sqoop中遇到几个问题:
集群客户端节点无法连接到adb --- 经排查是未将客户端ip添加到adb白名单引起的。处理方案:找运维添加白名单。
由于adb提供的服务地址不是ip地址,所以遇到了数据库url解析异常问题
处理方案:通过 ping 相应的域名获取到ip地址,替换原有url服务地址。
运行修改后的脚本,任务还是不能顺利执行,通过查找任务对应的堆栈信息,得到下面的信息: 超时!?那增加数据库的超时时间和socket超时时间。结果是好的,但并没有解决问题,报错信息发生了变化: 最后分析sqoop的运行机制导致,发现是集群节点不能连接到adb。 在客户端讲任务提交到yarn后,yarn将任务下发到不同节点执行,此时每个节点与adb单独通信,由于没有在adb配置白名单,最终导致网络不通。问题反馈给leader,此方案到此告一段落。
- 利用oss中转(最终方案)
- 由于需要导出的数据采用orc格式存储,导出时需要采用文本格式。
- 由于服务器物理储存限制,每次上传oss的数据不能过大,需要多文件上传。
上述两个问题可以通过在hive中清洗一张临时表解决存储格式问题,mr的计算框架生成多个文件,完美解决多文件上传问题。
方案的主要步骤:
清洗临时表 -> 编写shell脚本,从hdfs获取文件列表,循环执行:拉取、上传、删除操作 -> 在adb中创建oss创建外部映射表,进行数据清洗
此过程中遇到了单条数据异常问题,导致adb select时异常,最终采用两个策略:数据上预处理,对所有字段进行字符替换操作,经业务调研,最终决定替换‘\n’、‘\r’、‘&’三个字符,并使用‘&’作为分割符;上述处理并不能完全解决异常问题,adb支持人员给出两种解释:a、数据中存在空行会引起异常;b、csv解析的时候如果存在"符号需要成对存在。有些不成对存在的会解析错误。可以在外表定义里加上 "ossquote","#" 来规避,同样有"问题。 最终和需求人员沟通,决定删除导致异常的文件。数据量只是少了几十万。 任务完结撒花~
4、总结
- 后期处理异常时,增加原理上的思考;
- 解决方案是一个不断优化迭代的过程;
- 数据工作,方法和耐心是需要保持在线的。
来源:oschina
链接:https://my.oschina.net/u/3730932/blog/3236336