友情链接对网站的影响,wordpress admin init,给个网址你知道的,现在最火的电商平台是什么文章目录[toc] 目录#xff1a;一、利用Sqoop#xff0c;从Oracle到HDFS二、利用Sqoop#xff0c;从Oracle到Hive三、遇到的问题目录#xff1a;
一、利用Sqoop#xff0c;从Oracle到HDFS
第一步#xff1a;把Oracle驱动拷贝到Sqoop安装路径中的lib文件夹下。
第二步[toc] 目录一、利用Sqoop从Oracle到HDFS二、利用Sqoop从Oracle到Hive三、遇到的问题 目录
一、利用Sqoop从Oracle到HDFS
第一步把Oracle驱动拷贝到Sqoop安装路径中的lib文件夹下。
第二步切换账户su hdfs
第三步执行import操作
sqoop import --connect jdbc:oracle:thin:IPAddress:databaseName --username userName --password password --table TABLENAME --target-dir /user/operate -m 1 --where where子句 and 根据需要添加
说明
1、导入的目录若已经存在则要先删除已经存在的目录否则会报路径以存在的错误提示
FileAlreadyExistsException: Output directoryhdfs://master:8020/user/operate already exists删除路径语句hadoop fs –rmr /user/operate
如果多次导入同一个表中的数据数据要以append的形式插入到HDFS目录中。
2、-m 1表示使用几个map任务处理sqoop默认采用4个map任务有几个任务在HDFS中执行结果中就有几个part-m文件;若m值不等于1则导入的表需要有主键否则会报错
Error during import: No primary key could befound for table KW_CARENLIST. Please specify one with --split-by or perform asequential import with -m 1.sqoop是根据–splite-by 字段名进行分区–m设置map的数量sqoop根据不同的splite参数进行切分然后将切分出来的区域分配到不同的map中。Splite-by的参数类型不同则其切分方法不同如int型sqoop会取最大和最小splite-by字段。Sqoop会向关系数据库发送一个命令select max(id)min(id) from table然后会把max、min之间的区间平均分成m份最后m个并行的map会执行任务。–splite-by认是主键如果操作的表没有主键导入时会报错。splite-by对非数字类型的字段支持不好一般用于主键及数字类型的字段对于非数字类型有可能会导致数据量丢失。如abcdeaavfg。在实例测试中要导入的Oracle一张表200多万条数据中没有关键字若以数据表的最后一列NUMBER类型值存在null存在重复值为splite-by对象则最终检验导入的数据只有100多万条。
3、Sqoop默认从数据库导入到HDFS的分隔符是逗号**可用—field –terminated-by 来指定输出文件中的行字段分隔符。**如果导入数据的字段内容中存在分隔符可以另外指定父、字段包围符和转转义字符。
4、空列的值使用null。Sqoop默认导入的数据格式为文本文件。另可导入其他几种文件格式如SequenceFile、Avro格式。文本文件不能保存二进制字段如数据库中类型为VARBINARY的列且在区分null值和null字符串时可能出现问题。Avro和SequenceFile格式的文件能够为导入的数据提供最精确的表示方式同时还允许对数据进行压缩并支持MapReduce并行处理同一文件的不同部分。不过目前版本还不能将Avro或Sequence文件加载到Hive中尽管可以手动地将Avro数据文件加载到Hive中。SequenceFile文件格式的最后一个缺点是它只支持Java语言而Avro数据文件却可以被很多语言支持。
5、Sqoop中的map数设置原则一个表的数据抽取不超过3分钟否则就增加map数。
辅助操作
查看路径下文件hadoop fs -ls /user/operate/
打开指定文件hadoop fs –cat/user/operate/tabe_name
统计文件中行数hadoop fs –cat /路径/文件名 |wc –l
二、利用Sqoop从Oracle到Hive
访问 Hive数据库 第一步进入到hive命令行。 第二步直接导入Hive数据库。
sqoop import --connect jdbc:oracle:thin:IPAddress:1521:databaseName --username userName --password password --table TABLENAME -m 1 --hive-import --hive-database test
相比导入到HDFS中添加了—hive-import 、–hive-database参数。
–hive-import指定导入方式是导入到hive数据库中
–hive-database指定导入的目标数据库test若无此参数则默认导入到Hive的默认数据库default中
上面的导入结果是导入到了test.test_table中Hive自动创建了一张与Oracle导入表一样的表。也可以自己创建表指定自己的表名–hive-table tbName。
注意因Oracle、Hive数据类型的不一致导入的数据会存在精度减低的问题。
也可以使用–option-file传入一个文件使用这种方式可以重用一些配置参数该方法为测试看起来不错做下记录有兴趣的可以baidu一下
sqoop –option-file /user/hive/import.txt –table test.table
其中/user/hive/import.txt文件内容如下
辅助操作 删除数据库DROP DATABASE IF EXISTS test;
删除数据库表DROP TBALE test.test_table;
退出hive命令行exit;
三、遇到的问题
在使用Sqoop从Oracle抽数据到Hive表时有时候会遇到以下报错
Error: java.lang.RuntimeException: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection resetat org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:170)at org.apache.sqoop.mapreduce.db.DBInputFormat.setConf(DBInputFormat.java:161)at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:749)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:422)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1714)at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.RuntimeException: java.sql.SQLRecoverableException: IO Error: Connection resetat org.apache.sqoop.mapreduce.db.DBInputFormat.getConnection(DBInputFormat.java:223)at org.apache.sqoop.mapreduce.db.DBInputFormat.setDbConf(DBInputFormat.java:168)... 10 more解决 此问题一般是由于缺少一个生成快速随机数的工具一般可以通过在JRE中的java.security中修改securerandom.source的值为以下内容并重新登陆shell解决问题。
cd $JAVA_HOME/jre/lib/securityvi java.securitysecurerandom.sourcefile:/dev/../dev/urandom