Oceanbase obloader 导入失败Invalid char ‘\E’ ‘\N’

最近一客户在使用obloader工具,做一个表的恢复时,遇到了下面的错误:

$obloader -h xx -P xx -u xxxx - p 'xxxx' -c XXX  -t   XX - D  xx  --csv --table xxxx -f xxxxx.csv --external-data

[ERROR] Invalid char between encapsulated token and delimiter. Token Content: ,\E,0,79,\E,\E,. Line[1,18]

[WARN] Ignore parse first record. File : xxxxx..csv . Error : Invalid char between encapsulated token and delimiter. Token Content: ,\E0,79,\E,\E,. Line[1,18]

原因

导出时没有指定分割符,默认使用了“,” 分割,obdumper导出对于空值和空字符串的用\N和\E 默认预留的关键字, 导入时会因为关键字冲突,提示失败。导入时需要手动指定关键字

解决方法

--empty-string=Empty-String  --null-string=Null-String

如果字段中的值有分割符或换行符同样会出现数据错乱,对于–line-separator 和–column-separator 需要指定一个特殊字符,值中有引号时,还需要指定一个默认的列定界符–column-delimiter.

和oracle 的sqlldr工具差不多,逻辑数据导入时难免有错误数据,在Oceanbase obloader时也有一些预制的错误日志,只要没有配置忽略选项。通过 OBLOADER 导入数据,并指定 --strict 选项跳过错误并继续进程,--strict 选项可与 --max-discards 或者 --max-errors 选项搭配使用,表示当重复数据量或者错误数在指定范围内,会跳过错误继续进程。

如有以下错误数据时

错误类型说明
数据类型不匹配例如:将 VARCHAR 类型数据插入到 INT 类型的列中。
非法的 NULL 值设置了非空约束。
数据类型溢出字符串超长或者整型超长。
预处理数据失败使用控制文件,预处理函数调用失败。
列数不匹配文件列数与数据库列数不匹配。
主键或者唯一键重复表中的主键或者唯一键出现重复。

用户可以在 {ob-loader-dumper}/logs/ob-loader-dumper.bad 文件中查看数据类型不匹配/非法的 NULL 值/数据类型溢出/预处理数据失败/列数不匹配错误;在 {ob-loader-dumper}/logs/ob-loader-dumper.discard 文件中查看主键或者唯一键重复错误。

这个案例因为数据格式的错乱,在数据恢复紧急任务时浪费了大量的时间,建议如果表数据中格式较复杂时或有lob时,在oceanbase做表级导出时生成二进制格式文件,如Apache ORC,Apache Parquet文件。

obdumper和obloader V4支持标准的 CSV、Insert SQL、ORC、Parquet 等格式的数据文件。

我们某个客户大量的表导出使用的parquet格式。

ORC与Parquet对比

Apache Parquet 是一种列式存储格式,专为高效处理大规模数据而设计。它最初由 Twitter 和 Cloudera 开发,现在是 Apache 软件基金会的顶级项目。Apache ORC(Optimized Row Columnar)是一种高效的列式存储格式,由 Google Dremel 格式启发而来的列存格式,专为 Hadoop 生态系统中的大数据处理而设计。

1、orc不支持嵌套结构(但可通过复杂数据类型如map<k,v>间接实现),parquet支持嵌套结构
2、orc与hive的兼容性强,作为hive的常用存储格式
3、ORC支持 ZLIB、Snappy、LZO 等压缩算法,提供了轻量级的压缩元数据存储,压缩效果通常优于 Parquet。
4、orc导入数据和数据查询的的速度比parquet快

5, 生态兼容

  • ORC:主要与 Apache Hive 紧密集成,适用于 Hadoop 和 Hive 生态。
  • Parquet:广泛支持于 Apache Hadoop、Apache Spark、Apache Drill、Apache Impala、Apache Flink 等大数据工具和框架。
ORCParquet说明
Footer+MetadataFileMetadata描述每一个 Stripe/RowGroup 的元信息和统计信息。
StripeRow GroupStripe 有一个 StripeFooter,而 Row Group 没有。
Row GroupPage都是最小的读取单位。

我们对于同一个14G(7000W记录)大小的表,在oceanbase中使用obdumper和obloader对比不同的参数:

版本格式/参数导出文件大小导出耗时导入耗时
4.2.4–orc743M7.956 min1.763 min
4.2.4–par842M4.285 min2.333 min
4.2.4–csv17G5.948 min3.178 min
4.2.4–sql51G11.21 min2.740 min
Note: 因为逻辑导出、导入工具均使用java编写,生产中使用时导出orc文件占用内存较大,会出现OOW现象,所以推荐Par格式。当然在不同的版本更能会速度有所不同,比如v4.2.3低于4.2.4数倍,而4.2.5会改进导出性能。

从 OceanBase 数据库 V4.3.5 版本开始,外表在原有的支持 CSV 格式文件的基础上,还支持读取 orc 和 parquet 格式文件,同时支持了通过Select Into导出Parquet和ORC格式文件的功能。

Leave a Comment