暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第四范式 OpenMLDB数据导入

原创 小小亮 2021-09-02
430

DataImport

数据导入工具位于/java/openmldb-import。预计支持两种导入方式,insert和bulk load。insert模式,适用于所有场景的数据导入,目前还在优化中;bulk load模式只适合在空表并且导入期间没有读写的场景,有更高的导入效率,可以投入使用,但目前只支持本地多csv文件的导入。

Bulk Load

针对大规模的数据导入,我们支持bulk load的导入方式,可以快速进行导入操作。但请注意,导入前,表数据必须为空,导入期间不可以有任何对该表的读写。

Bulk Load流程

bulk load可以抽象为两个组件的协同工作,一个是importer端,即import工具自身;一个是loader端,即openmldb的tablet server。

通常的插入流程是importer只需将数据发送到loader端(仅限主副本),loader端解析并插入(包括“定位到segment”和“插入segment的两级跳表内“),然后写binlog(用于从副本的数据同步)。bulk load本质是将数据插入的过程提前,由importer端组织好数据结构(生成所有segment),然后直接发送给loader,让loader可以在线性时间内重建出所有segment,完成整个数据导入流程。

我们将数据本身命名为data region(binlog暂定属于data region),将多个segment结构命名为index region。importer在扫描源数据时就会分批发送data region的part。当所有数据都被处理完毕时,就可以发送index region(由于loader端的rpc大小限制,同样可能分批发送)。最后一个index region part发送完成后,整个导入流程就成功了。

Bulk Load使用

工具jar包生成:openmldb-import目录中可以使用mvn打包出opemmldb-import.jar。

使用方法:

> java -jar openmldb-import.jar --help
Usage: Data Importer [-fhV] [--create_ddl=<createDDL>] --db=<dbName>
                     [--importer_mode=<mode>]
                     [--rpc_size_limit=<rpcDataSizeLimit>] --table=<tableName>
                     -z=<zkCluster> --zk_root_path=<zkRootPath> --files=<files>
                     [,<files>...] [--files=<files>[,<files>...]]...
insert/bulk load data(csv) to openmldb
      --create_ddl=<createDDL>
                            if force_recreate_table is true, provide the create
                              table sql
*     --db=<dbName>         openmldb database
  -f, --force_recreate_table
                            if true, we will drop the table first
*     --files=<files>[,<files>...]
                            sources files, local or hdfs path
  -h, --help                Show this help message and exit.
      --importer_mode=<mode>
                            mode: Insert, BulkLoad. Case insensitive.
      --rpc_read_timeout=<rpcReadTimeout>
                            rpc read timeout(ms)
      --rpc_size_limit=<rpcDataSizeLimit>
                            should >= 33554432
      --rpc_write_timeout=<rpcWriteTimeout>
                            rpc write timeout(ms)
*     --table=<tableName>   openmldb table
  -V, --version             Print version information and exit.
* -z, --zk_cluster=<zkCluster>
                            zookeeper cluster address of openmldb
*     --zk_root_path=<zkRootPath>
                            zookeeper root path of openmldb
复制

–help可以展示出所有的配置项,星号表示必填项。

导入必须配置openmldb地址,库名表名,以及导入源文件。目前源文件只支持csv格式的本地文件,并且csv文件必须有header,文件的列名和表的列名必须一致,顺序可以不一样。

库名表名可以是不存在的,importer可以帮助创建。但请注意,如果导入到已存在的表,需要表内数据为空,否则将会极大影响导入效率。

配置调整

由于目前import只是单机模式,大数据导入可能较大地消耗资源,一些操作会变得很耗时。

如果导入中出现oom,请调大-Xmx。如果出现rpc send失败,调大rpc_write_timeout。如果rpc回复timeout,也适当调大rpc_read_timeout。

错误处理

只要importer端没有打印输出bulk load succeed,importer中途退出或者打印输出failed,都可以视为导入失败。

由于导入失败的状态可能很复杂,所以正确的错误处理方式是drop导入失败的表,重建表再进行导入

删表重建的操作,可以通过配置-f,并–create_ddl提供建表语句,让importer帮忙完成这部分前置工作,然后接着进行新的导入。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论