一、soop抽取数据前的准备
建议配置sqoop命令可以新建一个记事本,把需要的都整合进入,后期在进行归整,得到一份永久使用的实操文档
1. pg数据库表准备好,网络地址及端口号 (jdbc:postgresql://localhost:9999)
2. 服务器上安装配置好 jdk 和 hadoop
3. hdfs 的写入权限
4. pg驱动 jar 包准备(抽取oracle的数据也是需要同样的步骤,需要的是oracle的驱动jar)
(链接:https://pan.baidu.com/s/1Zga4iDcKTUYzzAsO7vMqfg 提取码:xxzz )
jar 包放在sqoop 安装目录下的 lib 文件下
二、进行配置sqoop命令
(模拟的命令的模板,后面是一些命令的解释,包括导入hive的一些命令,就只实现了HDFS后期应该会实现导入到hive,有什么自己遇到的问题也会记录,分享)
带 sql 的命令
sqoop import \
--connect jdbc:postgresql://localhost:9999/数据库名\
--username 用户名\
--password 密码 \
--query 'sql查询语句' \
--split-by id \
--delete-target-dir \
--target-dir hdfs上传路径\
-m 1
不需要sql的命令
sqoop import \
--connect jdbc:postgresql://localhost:9999/数据库名\
--table 表名\
--username 用户名\
--password 密码\
--target-dir 上传hdfs路径\
--delete-target-dir \
--num-mappers 1 \ (和 -m 一样)
--fields-terminated-by ,
sqoop import
--connect "jdbc:postgresql://localhost:9999/数据库名" 指定要连接的 Pg数据库的URL
--username "postgres" 指定连接数据库所需的用户名
--password "123456" 指定连接数据库所需的密码
--table "table_name" 指定要
--fields-terminated-by '\t' 指定字段之间的分隔符为制表符
--lines-terminated-by '\n' 指定行终止符为换行符
--hive-drop-import-delims 在导入数据到Hive之前删除字段和行的分隔符
--incremental lastmodified 指定增量导入模式为根据最后修改的时间来增量导入数据
--merge-key id 指定用于合并数据的键列。
--check-column update_time 指定用于检查最后修改时间的列
--last-value :指定上一次导入的最后修改时间
--m 1:指定要使用的并发MapReduce任务数
-- --schema "schema_name" 指定要导入数据的PostgreSQL模式
--null-string '\N' 指定空字符串在导入过程中的表示方式
--null-non-string '\N' 指定非字符串类型的空值在导入过程中的表示方式
注意:--table 和 --query是不能同时使用 会给相应的提示
三、总结的一些问题
1. 前期没配置好可能会出现,hdfs写入失败,缺少驱动jar导致的无法正常运行命令
2. 就是关于pg字段类型的问题,因为某张表里有JSON格式,导致报错NullPotionterException
解决办法:通过query select 查询进行解决
--query 'SELECT 字段名::text FROM 表名 '
可能会报错,sql需要添加 where 条件后跟$CONDITIONS,来实现并行运行mr的功能,
3. 指定 -m 的个数 当指定了-m参数且大于1时,需要同时指定--split-by参数来确保数据能够均匀地分配给不同的map任务进行处理 (会有相应的提示)
总结:遇到的问题感觉挺多的,能想到的就这些了,因为一点点去做,实现了现在自己去回想的,后面打算实现增量全量导入的脚本配置,也许这篇文章没帮到你,但是面对棘手的问题你要相信自己一定可以的,等问题解决了技术上就是提升,加油!共勉!