sqoop import/export使用经验

本文详细介绍了如何使用Sqoop工具实现Oracle与Hive之间的数据迁移,包括数据导入HDFS及导出到Oracle的过程,并提供了具体的命令示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.先创建一个小表(test_01)进行测试(主节点IP:169.254.109.130/oracle服务器IP:169.254.109.100)
1.测试连接oracle;
sqoop list-tables --connect jdbc:oracle:thin:@169.254.109.100/库名 --username XX --password XX
2.创建HDFS目录;
sudo -u hdfs hdfs dfs -mkdir /oracle
3.先将oracle中的数据导入HDFS;
sudo -u hdfs sqoop import --connect jdbc:oracle:thin:@169.254.109.100:1521/库名 --username XX --password XX  \
--table TEST_01 \
--target-dir /oracle/TEST_01 \cd
--fields-terminated-by "\\01" \
--hive-drop-import-delims     \
--null-string '\\N'           \
--null-non-string '\\N'       \
-m 1
4.权限控制;
sudo -u hdfs hdfs dfs -chmod -R 777 /oracle/*
5.登录hive创建外部表映射HDFS中的数据;
beeline -u jdbc:hive2://169.254.109.130:10000 -n hive -p 123456
create external table test_01(id int,name varchar2(20))location "/oracle/test_01";
6.查询是否映射到数据;
select * from test_01;
 
二.从Hive导出表到Oracle
 
1.在Oracle中创建相应的表,注意字段类型要一致;
2.把hive中的数据写入hdfs
insert overwrite directory '/user/senior/hive/exp_hive 'select * from emp ;
 
sqoop  export 
--table demo01   
--connect jdbc:oracle:thin:@192.168.43.246:1521/库名
--username XX --password XX 
--export-dir /oracledb/tmp1/test   
--columns  id,name,date_dt  
--input-fields-terminated-by ',' 
-m 3;
三.参数说明
1.import/export通用
选项         含义说明

--connect <jdbc-uri> 指定JDBC连接字符串
--connection-manager <class-name> 指定要使用的连接管理器类
--driver <class-name> 指定要使用的JDBC驱动类
--hadoop-mapred-home <dir> 指定$HADOOP_MAPRED_HOME路径
--help 打印用法帮助信息
--password-file 设置用于存放认证的密码信息文件的路径
-P 从控制台读取输入的密码
--password <password> 设置认证密码
--username <username> 设置认证用户名
--verbose 打印详细的运行信息
--connection-param-file <filename> 可选,指定存储数据库连接参数的属性文件

2.import

选项     含义说明
--append 将数据追加到HDFS上一个已存在的数据集上
--as-avrodatafile 将数据导入到Avro数据文件
--as-sequencefile 将数据导入到SequenceFile
--as-textfile 将数据导入到普通文本文件(默认)
--boundary-query <statement> 边界查询,用于创建分片(InputSplit)
--columns <col,col,col…> 从表中导出指定的一组列的数据
--delete-target-dir 如果指定目录存在,则先删除掉
--direct 使用直接导入模式(优化导入速度)
--direct-split-size <n> 分割输入stream的字节大小(在直接导入模式下)
--fetch-size <n> 从数据库中批量读取记录数
--inline-lob-limit <n> 设置内联的LOB对象的大小
-m,--num-mappers <n> 使用n个map任务并行导入数据
-e,--query <statement> 导入的查询语句
--split-by <column-name> 指定按照哪个列去分割数据
--table <table-name> 导入的源表表名
--target-dir <dir> 导入HDFS的目标路径
--warehouse-dir <dir> HDFS存放表的根路径
--where <where clause> 指定导出时所使用的查询条件
-z,--compress 启用压缩
--compression-codec <c> 指定Hadoop的codec方式(默认gzip)
--null-string <null-string> 果指定列为字符串类型,使用指定字符串替换值为null的该类列的值
--null-non-string <null-string> 如果指定列为非字符串类型,使用指定字符串替换值为null的该类列的值

 3.export

选项     含义说明
--validate <class-name> 启用数据副本验证功能,仅支持单表拷贝,可以指定验证使用的实现类
--validation-threshold <class-name> 指定验证门限所使用的类
--direct 使用直接导出模式(优化速度)
--export-dir <dir> 导出过程中HDFS源路径
-m,--num-mappers <n> 使用n个map任务并行导出
--table <table-name> 导出的目的表名称
--call <stored-proc-name> 导出数据调用的指定存储过程名
--update-key <col-name> 更新参考的列名称,多个列名使用逗号分隔
--update-mode <mode> 指定更新策略,包括:updateonly(默认)、allowinsert
--input-null-string <null-string> 使用指定字符串,替换字符串类型值为null的列
--input-null-non-string <null-string> 使用指定字符串,替换非字符串类型值为null的列
--staging-table <staging-table-name> 在数据导出到数据库之前,数据临时存放的表名称
--clear-staging-table 清除工作区中临时存放的数据
--batch 使用批量模式导出

 
 
 
 
 
 

转载于:https://www.cnblogs.com/dozn/p/9066387.html

<think>好的,我现在要解决用户在使用Sqoop导入数据到HBase时遇到的错误:“找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty”。首先,我需要回顾用户提供的引用内容,特别是引用[1]、[3],因为它们直接提到了这个问题。 根据引用[1],解决方案的第一步是修改hbase/bin目录下的hbase文件。我需要确认这个文件是否存在,并且具体修改哪些部分。通常,这类错误可能是由于环境变量或类路径配置不正确引起的。比如,HBase的类没有被正确添加到Sqoop的执行环境中。 引用[3]提到了无效的变量名错误,可能与Hadoop或HBase的环境变量设置有关。例如,脚本中可能错误地设置了包含点号的变量名,这在Shell中是不允许的。用户可能在启动脚本时,错误地将类名作为变量名,导致解析失败。 接下来,我需要考虑Sqoop与HBase的兼容性问题。用户可能在使用Sqoop版本和HBase版本之间存在依赖冲突,比如引用了不兼容的Hadoop或HBase客户端库。例如,Sqoop可能依赖于旧版本的HBase客户端,而用户安装的是新版本,导致类或方法找不到。 另外,检查类路径是否正确也是关键。Sqoop需要能够访问HBase的相关JAR包,如hbase-client、hbase-common等。如果这些JAR没有包含在Sqoop的类路径中,就会导致类加载失败。用户可能需要手动将这些JAR添加到Sqoop的lib目录下,或者通过HADOOP_CLASSPATH环境变量指定。 此外,环境变量配置错误也是一个常见原因。例如,HBASE_HOME是否设置正确,是否在Sqoop的执行环境中生效。如果HBASE_HOME未正确指向HBase的安装目录,Sqoop可能无法找到所需的类。 还有,用户可能在执行Sqoop命令时没有正确指定HBase的相关参数,比如--hbase-table等,导致Sqoop尝试调用HBase相关的功能,但相关类不存在于类路径中。 最后,需要检查日志中的其他错误信息,如SLF4J绑定冲突,虽然这可能不是直接原因,但多个日志绑定可能导致不可预见的问题。需要排除这些干扰因素,集中解决类路径和版本兼容性问题。</think>以下分步骤说明解决方案: ### 一、修复HBase环境变量配置 1. 编辑$HBASE_HOME/bin/hbase文件 ```bash sudo vim $HBASE_HOME/bin/hbase ``` 2. 注释或删除包含`GetJavaProperty`的错误行(通常出现在检测JAVA属性的逻辑中)[^1][^3] ### 二、验证HBase类路径 1. 确保HBase的JAR文件存在于Sqoop的类路径中 ```bash # 将HBase的client和common包链接到Sqoop/lib目录 ln -s $HBASE_HOME/lib/hbase-client-*.jar $SQOOP_HOME/lib/ ln -s $HBASE_HOME/lib/hbase-common-*.jar $SQOOP_HOME/lib/ ``` ### 三、修正环境变量设置 1. 在sqoop-env.sh中添加HBase配置 ```bash export HBASE_HOME=/path/to/your/hbase export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HBASE_HOME/lib/* ``` ### 四、版本兼容性检查 1. 确认组件版本匹配关系: - Sqoop 1.4.7 对应 HBase 1.x - Sqoop 1.99.x 对应 HBase 2.x 2. 出现`NoSuchMethodError`时需统一HBase/Hadoop版本[^2] ### 五、完整sqoop命令示例 ```bash sqoop import \ --connect jdbc:mysql://localhost/mydb \ --table users \ --hbase-table user_data \ --column-family info \ --hbase-row-key id \ --username root \ --password 123456 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值