概要描述
本文档主要介绍如何通过sqoop工具将第三方数据写入argodb表。
版本要求:
ArgoDB版本>=6, Patch版本>=20250225
详细介绍
一. 配置与准备
1. 准备TDH-Client
通过manager页面下载最新的TDH-Client
2. 准备工具包
从 Patch 页面配套工具中下载对应版本的工具包
解压后,将 argodb_client/argodb-sink-client/ 和 argodb_client/argodb-sqoop/ 下的所有 jar 包复制到 TDH-Client/sqoop/lib/ 目录中。
如果你的 JDBC 数据源需要额外的驱动 jar 包(比如这里的oracle驱动包 ojdbc6.jar),也把它们放到 TDH-Client/sqoop/lib 目录中。
3. 准备配置文件
cd TDH-Client/sqoop/
mkdir conf
touch conf/sqoop-site.xml
编辑sqoop-site.xml文件:
sqoop.tool.plugins
ExtendArgodbPlugin
编辑 TDH-Client/conf/yarn1/mapred-site.xml 文件(路径里的 yarn1,根据实际情况修改),找到 mapreduce.map.speculative 配置项,将值改为 false。如果没有该配置项,手动添加并设置值为 false。否则后续任务可能会出现事务泄漏或数据重复的问题。
二. 使用示例
1. oracle向argodb导数
假设在 Oracle 中存在表 emp,表结构如下:
DROP TABLE EMP;
CREATE TABLE EMP(
EMPNO int,
ENAME varchar2(255),
JOB varchar2(255),
MGR INT,
HIREDATE DATE,
SAL INT,
COMM INT,
DEPTNO INT
);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
在 Quark 中创建对应需要导入的表,DDL 如下:
DROP TABLE IF EXISTS EMP_HOLO;
CREATE TABLE EMP_HOLO(
EMPNO int,
ENAME string,
JOB string,
MGR INT,
HIREDATE DATE,
SAL INT,
COMM INT,
DEPTNO INT
)CLUSTERED BY (empno) INTO 3 BUCKETS
STORED AS HOLODESK;
调用 sqoop 命令把数据从 Oracle 导入到 ArgoDB:
sqoop argodbSqoopTool \
--connect "jdbc:oracle:thin:@172.18.131.175:1521/helowin" \
--username lkw \
--password 123456 \
--table emp \
--columns "empno,ename,job,mgr,hiredate,sal,comm,deptno" \
--split-by empno \
--target-dir placeholder-dir \
--delete-target-dir \
--m 3 \
--dblink-url "jdbc:hive2://kv1:10000/default" \
--dblink-user hive \
--dblink-password 123456 \
--holotable default.emp_holo \
--tmp-dir "/tmp"
检查Argodb目标表导数成功:
sqoop 命令参数说明
所有 Sqoop 原生参数用法可查阅 开源文档 1.4.x 版本
| 参数 | 说明 | 类型 |
|---|---|---|
| argodbSqoopTool | Sqoop ArgoDB 插件名称 | ArgoDB 插件自定义参数 |
| –connect | 数据源连接方式 | Sqoop 原生参数 |
| –username | 数据源连接用户 | Sqoop 原生参数 |
| –password | 数据源连接密码 | Sqoop 原生参数 |
| –table | 要导入的源表名 | Sqoop 原生参数 |
| –columns | 要导入的列 | Sqoop 原生参数 |
| –split-by | MapReduce 任务根据哪一列切分 | Sqoop 原生参数 |
| –target-dir | 原生 Sqoop 导入是写数据到 HDFS,所以需要写入目录。ArgoDB 导入实际不会写数据到 HDFS,但是该参数必须填写 | Sqoop 原生参数 |
| –delete-target-dir | 如果 –target-dir 已存在,会先做删除操作 | Sqoop 原生参数 |
| –m | Sqoop MapReduce 任务数 | Sqoop 原生参数 |
| –dblink-url | Quark 连接方式 | ArgoDB 插件自定义参数 |
| –dblink-user | Quark 连接用户 | ArgoDB 插件自定义参数 |
| –dblink-password | Quark 连接密码 | ArgoDB 插件自定义参数 |
| –holotable | 要导入的 ArgoDB 表名 | ArgoDB 插件自定义参数 |
| –tmp-dir | ArgoDB 导入临时文件存放目录,必须是 Yarn POD 内可访问的路径 | ArgoDB 插件自定义参数 |
注意事项
1、导入必须使用指定列的方式:使用 --table + --columns 参数,或使用 --query 参数(Sqoop 原生参数,可查阅开源文档 1.4.x 版本)。列名的数量、顺序,要和目标表一致,否则会报错、数据错乱。
2、Sqoop 导入 ArgoDB,不保证原子性,需要用户自行处理错误情况(如:部分任务失败,那么成功的任务会把数据写入 ArgoDB,需要用户能自己进行错误恢复,否则不要使用 Sqoop 导入功能)
3、对于分区表,不支持动态创建分区,需要提前创建好