Impexp 工具借助多线程、pipeline 并行执行等方式实现高效写入,满足用户大规模数据写入需求
图 5.2.1:通过工具批量导入
5.2.2.1. 部署工具
-
将 HDFS 配置文件拷贝到 repoconf 目录下:
cd TDH-Client/impexp mkdir repoconf cp -r /etc/hdfs1/conf/* repoconf/
-
手动修改 repoconf 下 hdfs 服务配置文件中的 core-site.xml 文件:
将 hadoop.security.group.mapping.ldap.bind.password.file 这个属性注释掉,不然后续任务会报错
-
配置文件 impexp/conf/argodb-impexp.properties
表 5.2.1:连接配置 配置项 解释 示例 argodb.repository.conf.dir
HDFS配置文件路径
/etc/hdfs1/conf
argodb.repository.kerberos.enabled
是否开启 kerberos
true
argodb.server.hostname
quark serv er 地址
<host_ip>
argodb.server.port
quark server 端口
<port>
argodb.server.ldap.username
若开启 LDAP,则需要填写用户名
<user_name>
argodb.server.ldap.password
若开启 LDAP,则需要填写密码
<password>
argodb.export.compress.enable
导出时是否开启压缩
true
argodb.export.fileds.delimiter
导出到文件时的字段分隔符
|
argodb.export.pipeline.enable
是否开启pipeline模式
true
argodb.export.thread.pool.size
导出时文件下载线程数
16
表 5.2.1:导入配置 配置项 解释 示例 argodb.import.repository.targetdir
表文件要上传到的 HDFS 路径
/tmp/hive/impexp/import
argodb.import.local.sourcedir
表文件在本机的路径
/root/test/import
argodb.import.thread.pool.size
导入时的文件上传线程数
2
argodb.import.buffersize
1048576
argodb.import.ext.table.delimiter
不指定外表时,自动生成外表的列分割符
|
argodb.import.list.file
用于将多个本地文件写入多张表
argodb.import.pipeline.enable
导入时是否开启pipeline模式
true
argodb.import.file.split.size
导入text文件时克切分的文件大小(字节)
67108864
argodb.import.compress.enable
导入时是否开启文件压缩
true
5.2.2.2. 使用工具
多线程导入的基本原理与单线程导入一致,但是导入性能更高,并且提供脚本方便对多表进行数据写入。
图 1. 导入流程示意
-
大部分情况下,用户准备数据文件、预创建 Holodesk 表后,可以通过导入脚本实现将本地文件上的所有数据自动写入 Holodesk
-
导入脚本的主要执行流程包括:1)将本地文件上传到 HDFS 2)使用默认配置自动创建外表,并将数据 Load 进外表 3)将外表数据全部写入 Holodesk
-
为了满足不同的数据写入需求,用户可以使用自己创建的外表。例如使用不同的分隔符等
-
为了满足不同的数据写入需求,用户可以使用自己编写的 DML.sql。例如只导入外表中的部分字段
5.2.2.2.1. 批量写入单表
使用工具前,确保环境变量已初始化 |
-
准备数据源
导入数据文件的默认地址为argodb.import.local.sourcedir。因此建议将数据文件统一存放
下文以 user.txt 文件导入为例,"15","zhangsan" 是一条数据示例
-
预创建 Holodesk 表
Create holodesk_user(id int,name string) stored as holodesk;
DDL 参考:定义表
-
【可选】手动创建外表
默认使用 argodb-impexp.properties 中的配置项创建外表。
当需要使用不同分隔符时,可以事先创建 TEXT 外表
Create external table text_user(id int ,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; )
DDL 参考: 创建外表
-
【可选】手动定义 DML
默认使用 argodb-impexp.properties 中的配置项将外表数据全部导入 holodesk
当只需要导入部分列时,可以通过创建一个 sql 文件来手动定义 DML.sql
例如当只需要导入 id 字段时,则可以创建一个 sql 文件。vi user.sql insert into table holodesk_user select id from text_user;
-
使用导入脚本 argodb_import_export.py
python argodb_import_export.py import [<exterTableName>] <destTableName> <srcPath> [-f <DML.sql>] [- <property_name> <property_value>]
-
直接导入所有字段
python argodb_import_export.py import demodata.holodesk_user user.txt
-
自定义分隔符,并只导入 id 字段
python argodb_import_export.py import text_user demodata.holodesk_user user.txt -f user.sql
-
<exterTableName>:当需要使用不同分隔符时,可以指定在【第三步】中创建的外表
-
<destTableName>:用于指定本地文件写入的目标表,即在【第二步】中预创建的 Holodesk 表,格式为
库名.表名
,例如demodata.holodesk_user
。 -
<srcPath>:用于指定本地文件路径
-
可选项 [-f <DML.sql>]:当只需要导入部分列时,可以指定在【第四步】中创建的 DML _sql文件
-
可选项 [- <property_name> <property_value>]:用于自定义导入配置,而非配置文件中的默认配置。例如如果使用 -argodb.import.ext.table.delimiter , 那么本次导入时使用,作为分隔符创建外表,而非默认值|
-
5.2.2.2.2. 并行执行批量写入不同表
将多个"批量写入单表"的需求封装到一个文件中,可以用来以并行的方式将多个数据文件,批量写入多张表。
-
创建一个 list 文件 (空白字符分割各列)
[<external_table1>] <destTableName1> <source_data_path1> [<external_table2>] <destTableName2> <source_data_path2> [<external_table3>] <destTableName3> <source_data_path3>
例如:创建一个文件 bank.list:
holodesk_user user.txt holodesk_card card.txt
-
<destTableName>:用于指定本地文件写入的目标表,即在【第二步】中预创建的 Holodesk 表
-
<source_data_path>:用于指定本地文件路径
-
可选项 [<external_table>]:当需要使用不同分隔符时,可以指定在手动创建的外表
-
-
执行脚本,以并行的方式执行 list 中的写入配置
python argodb_import_export.py import -Dargodb.import.list.file=import.list python argodb_import_export.py import -Dargodb.import.list.file=bank.list