热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用sqoop2实现hdfs与Oracle数据相互导入

上一篇已经完成了sqoop2的安装,本篇文章介绍sqoop2将数据从Oracle导入hdfs已经从hdfs导入Oraclesqoop的使用,主要分为以下几个部分连接服务器

上一篇已经完成了sqoop2的安装,本篇文章介绍sqoop2将数据从Oracle导入hdfs已经从hdfs导入Oracle

sqoop的使用,主要分为以下几个部分

  • 连接服务器
  • 搜索connectors
  • 创建Link
  • 创建Job
  • 执行Job
  • 查看Job运行信息


在使用sqoop2之前,还需要对hadoop的配置文件做以下修改并启动jobhistory服务,否则,job只能运行一次,第二次运行就会报错

1)配置mapred-site.xml:(namenode节点即可)

  mapreduce.jobhistory.address
  192.168.101.11:10020

2)启动jobhistory服务
sbin/mr-jobhistory-daemon.sh start historyserver


1、连接sqoop2服务器

sqoop2是c/s模式,之前安装并启动的是sqoop的服务端,如果想要使用和操作sqoop2,需要通过客户端连接到服务端,然后使用。只要保证服务端正常处于运行状态,客户端可以从任意终端发起。也就是说,客户端可以是一台只解压了sqoop2安装包的机器中启动,无需hadoop和sqoopserver。

启动客户端bin/sqoop2-shell

[hadoop@hadoop01 sqoop-1.99.7-bin-hadoop200]$ bin/sqoop2-shell
Setting conf dir: /home/hadoop/sqoop-1.99.7-bin-hadoop200/bin/../conf
Sqoop home directory: /home/hadoop/sqoop-1.99.7-bin-hadoop200
Sqoop Shell: Type 'help' or '\h' for help.

sqoop:000> \h
For information about Sqoop, visit: http://sqoop.apache.org/

Available commands:
:exit (:x ) Exit the shell
:history (:H ) Display, manage and recall edit-line history
help (\h ) Display this help message
set (\st ) Configure various client options and settings
show (\sh ) Display various objects and configuration options
create (\cr ) Create new object in Sqoop repository
delete (\d ) Delete existing object in Sqoop repository
update (\up ) Update objects in Sqoop repository
clone (\cl ) Create new object based on existing one
start (\sta) Start job
stop (\stp) Stop job
status (\stu) Display status of a job
enable (\en ) Enable object in Sqoop repository
disable (\di ) Disable object in Sqoop repository
grant (\g ) Grant access to roles and assign privileges
revoke (\r ) Revoke access from roles and remove privileges

For help on a specific command type: help command

sqoop:000>

此时只是启动了客户端,还没有连接服务端,如果测试创建link或者job,那么默认会连接localhost。所以,要先设置连接服务器:

sqoop:000> set server --host 192.168.101.12 --port 12000 --webapp sqoop
Server is set successfully
sqoop:000>

2、搜索connector

connector是用于创建link的模板,例如要创建hdfs的link,则使用hdfs-connector,要创建Oracle的link,则使用oracle-jdbc-connector或者generic-jdbc-connector

如果所设置的服务端连接是正常可用的,那么执行show connector 命令后,会显示如下:

sqoop:000> show connector 
+------------------------+---------+------------------------------------------------------------+----------------------+
| Name | Version | Class | Supported Directions |
+------------------------+---------+------------------------------------------------------------+----------------------+
| generic-jdbc-connector | 1.99.7 | org.apache.sqoop.connector.jdbc.GenericJdbcConnector | FROM/TO |
| kite-connector | 1.99.7 | org.apache.sqoop.connector.kite.KiteConnector | FROM/TO |
| oracle-jdbc-connector | 1.99.7 | org.apache.sqoop.connector.jdbc.oracle.OracleJdbcConnector | FROM/TO |
| ftp-connector | 1.99.7 | org.apache.sqoop.connector.ftp.FtpConnector | TO |
| hdfs-connector | 1.99.7 | org.apache.sqoop.connector.hdfs.HdfsConnector | FROM/TO |
| kafka-connector | 1.99.7 | org.apache.sqoop.connector.kafka.KafkaConnector | TO |
| sftp-connector | 1.99.7 | org.apache.sqoop.connector.sftp.SftpConnector | TO |
+------------------------+---------+------------------------------------------------------------+----------------------+


否则,会提示拒绝连接 
 

sqoop:000> show connector 
Exception has occurred during processing command
Exception: java.net.ConnectException Message: 拒绝连接 (Connection refused)


 
 

3、创建link

顾名思义,就是创建到各个源或目标存储的连接。可创建的link类型,在上一个步骤show connector中已经列出

1)创建hdfs link

sqoop:000> create link --connector hdfs-connector
Creating link for connector with name hdfs-connector
Please fill following values to create new link object
Name: hdfs-link ##link的名称,可以随意起

HDFS cluster

URI: hdfs://192.168.101.11:9000 ##hdfs地址,在hadoop配置文件core-site.xml中查看
Conf directory: /home/hadoop/hadoop-2.6.5/etc/hadoop ##hadoop配置文件目录
Additional configs::
There are currently 0 values in the map:
entry# ##直接回车即可
New link was successfully created with validation status OK and name hdfs-link
sqoop:000> show link
+-----------+----------------+---------+
| Name | Connector Name | Enabled |
+-----------+----------------+---------+
| hdfs-link | hdfs-connector | true |
+-----------+----------------+---------+




2)创建Oracle link

sqoop:000> create link --connector generic-jdbc-connector
Creating link for connector with name generic-jdbc-connector
Please fill following values to create new link object
Name: oracle-link ##link的名称,可以随意起

Database connection

Driver class: oracle.jdbc.driver.OracleDriver ##Oracle jdbc驱动
Connection String: jdbc:oracle:thin:@192.168.101.9:1521:orcl ##Oracle连接字符串
Username: scott ##Oracle用户名
Password: ***** #密码
Fetch Size: #以下直接回车,默认即可
Connection Properties:
There are currently 0 values in the map:
entry#

SQL Dialect

Identifier enclose: ##sql定界符,为避免错误,需要打一个空格
New link was successfully created with validation status OK and name oracle-link

sqoop:000> show link

+-------------+------------------------+---------+

| Name | Connector Name | Enabled |

+-------------+------------------------+---------+

| oracle-link | generic-jdbc-connector | true |

| hdfs-link | hdfs-connector | true |

+-------------+------------------------+---------+


 
 3、创建从oracle向hdfs导入数据的job 
 

sqoop:000> create job -f oracle-link -t hdfs-link
Creating job for links with from name oracle-link and to name hdfs-link
Please fill following values to create new job object
Name: oracle2hdfs #job名称

Database source

Schema name: scott #oracle的schema,即用户名
Table name: emp #需要导入的表名
SQL statement: ##SQL,默认导入整张表
Column names:
There are currently 0 values in the list:
element#
Partition column: empno ##指定一个列名即可,一般可以用主键,或者时间列,以便mapper任务的切分
Partition column nullable:
Boundary query:

Incremental read

Check column:
Last value:

Target configuration

Override null value:
Null value:
File format:
0 : TEXT_FILE
1 : SEQUENCE_FILE
2 : PARQUET_FILE
Choose: 0 #选择导入hdfs的一种格式,选择txt即可
Compression codec:
0 : NONE
1 : DEFAULT
2 : DEFLATE
3 : GZIP
4 : BZIP2
5 : LZO
6 : LZ4
7 : SNAPPY
8 : CUSTOM
Choose: 0 #默认无压缩
Custom codec:
Output directory: /data ##导入到hdfs的目录,注意,全量导入时,该目录需要为空
Append mode: ##追加模式,默认为全量

Throttling resources

Extractors:
Loaders:

Classpath configuration

Extra mapper jars:
There are currently 0 values in the list:
element#
New job was successfully created with validation status OK and name oracle2hdfs
sqoop:000>

4、创建从hdfs向oracle导入的job

sqoop:000> create job -f hdfs-link -t oracle-link
Creating job for links with from name hdfs-link and to name oracle-link
Please fill following values to create new job object
Name: hdfs2oracle

Input configuration

Input directory: /data ##hdfs 的导入目录
Override null value:
Null value:

Incremental import

Incremental type:
0 : NONE
1 : NEW_FILES
Choose: 0 #默认选0即可,应该是配合上一个参数,Incremental import,设置增量导入模式
Last imported date:

Database target

Schema name: scott #oracle用户
Table name: emp2 #oracle表名,需要提前创建好表结构
Column names:
There are currently 0 values in the list:
element#
Staging table:
Clear stage table:

Throttling resources

Extractors:
Loaders:

Classpath configuration

Extra mapper jars:
There are currently 0 values in the list:
element#
New job was successfully created with validation status OK and name hdfs2oracle
sqoop:000>
sqoop:000> show job
+----+-------------+--------------------------------------+--------------------------------------+---------+
| Id | Name | From Connector | To Connector | Enabled |
+----+-------------+--------------------------------------+--------------------------------------+---------+
| 8 | oracle2hdfs | oracle-link (generic-jdbc-connector) | hdfs-link (hdfs-connector) | true |
| 9 | hdfs2oracle | hdfs-link (hdfs-connector) | oracle-link (generic-jdbc-connector) | true |
+----+-------------+--------------------------------------+--------------------------------------+---------+
sqoop:000>

5、运行作业

start job -name oracle2hdfs

sqoop:000> start job -name oracle2hdfs
Submission details
Job Name: oracle2hdfs
Server URL: http://192.168.101.12:12000/sqoop/
Created by: hadoop
Creation date: 2017-10-17 17:24:23 CST
Lastly updated by: hadoop
External ID: job_1508227894698_0001
http://hadoop01:8088/proxy/application_1508227894698_0001/
2017-10-17 17:24:23 CST: BOOTING - Progress is not available
sqoop:000>


sqoop:000> start job -name hdfs2oracle
Submission details
Job Name: hdfs2oracle
Server URL: http://192.168.101.12:12000/sqoop/
Created by: hadoop
Creation date: 2017-10-17 17:25:38 CST
Lastly updated by: hadoop
External ID: job_1508227894698_0002
http://hadoop01:8088/proxy/application_1508227894698_0002/
2017-10-17 17:25:38 CST: BOOTING - Progress is not available



6、查看作业运行情况

由于sqoop2的job提交后,是运行在hadoop集群上的mapreduce任务,所以可以通过hadoop的web管理界面来查看,地址为:http://namenode:8088/cluster,对应的id就是External ID.

如下图所示:


7、验证结果

hdfs

[hadoop@hadoop02 bin]$ ./hadoop fs -ls /data/
Found 13 items
-rw-r--r-- 2 hadoop supergroup 172 2017-10-17 17:40 /data/129d2e07-1a0f-44ec-bbcd-299985b6972d.txt
-rw-r--r-- 2 hadoop supergroup 119 2017-10-17 17:40 /data/1fffd203-a20f-4925-a328-8fe05994b80a.txt
-rw-r--r-- 2 hadoop supergroup 119 2017-10-17 17:36 /data/2b8c5cd1-9ec2-4ae7-8683-a4587def6b74.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:40 /data/31b026a3-697c-4b11-a49d-4c02adfaf847.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:35 /data/3f6b78a3-a4ee-43ea-b4f3-fb46ae1a4ce0.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:37 /data/7ed1cc68-a1c7-4c98-ac25-c2d9d2ce1a54.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:33 /data/8ca051dd-6d80-4663-b062-931683d01026.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:40 /data/95cedc62-7355-4408-8361-cbf875645e94.txt
-rw-r--r-- 2 hadoop supergroup 54 2017-10-17 17:37 /data/9e59a5b9-90d3-4b04-aa59-d20302e4ee2b.txt
-rw-r--r-- 2 hadoop supergroup 0 2017-10-17 17:34 /data/b3229660-0409-4d33-9b2f-df9cdb2549ec.txt
-rw-r--r-- 2 hadoop supergroup 166 2017-10-17 17:40 /data/b59fa170-7c5e-4b1e-8ca3-083bb09a9544.txt
-rw-r--r-- 2 hadoop supergroup 57 2017-10-17 17:40 /data/cf92a71a-8528-4842-8a88-c4b4ea4b96e2.txt
-rw-r--r-- 2 hadoop supergroup 114 2017-10-17 17:36 /data/dda07b7d-01a8-420d-964b-d2a5bee35168.txt
[hadoop@hadoop02 bin]$ ./hadoop fs -cat /data/dda07b7d-01a8-420d-964b-d2a5bee35168.txt
7782,'CLARK','MANAGER',7839,'1981-06-09',2450.00,NULL,10
7788,'SCOTT','ANALYST',7566,'1987-04-19',3000.00,NULL,20
[hadoop@hadoop02 bin]$


oracle




后记:

途中遇到不少报错,记录如下:



--报错1
[hadoop@hadoop01 sqoop-1.99.7-bin-hadoop200]$ ./bin/sqoop.sh server start
Setting conf dir: ./bin/../conf
Sqoop home directory: /home/hadoop/sqoop-1.99.7-bin-hadoop200
Starting the Sqoop2 server...
1    [main] INFO  org.apache.sqoop.core.SqoopServer  - Initializing Sqoop server.
20   [main] INFO  org.apache.sqoop.core.PropertiesConfigurationProvider  - Starting config file poller thread
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
        at org.apache.sqoop.security.authentication.SimpleAuthenticationHandler.secureLogin(SimpleAuthenticationHandler.java:36)
        at org.apache.sqoop.security.AuthenticationManager.initialize(AuthenticationManager.java:98)
        at org.apache.sqoop.core.SqoopServer.initialize(SqoopServer.java:57)
        at org.apache.sqoop.server.SqoopJettyServer.(SqoopJettyServer.java:67)
        at org.apache.sqoop.server.SqoopJettyServer.main(SqoopJettyServer.java:177)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 5 more
原因:sqoop没有正确的找的hadoop的jar包,因为在安装hadoop时,配置了HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_MAPRED_HOME、HADOOP_YARN_HOME四个环境变量
解决方法:
修改bin/sqoop.sh
将以下四行注释
HADOOP_COMMON_HOME=${HADOOP_COMMON_HOME:-${HADOOP_HOME}/share/hadoop/common}
HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-${HADOOP_HOME}/share/hadoop/hdfs}
HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-${HADOOP_HOME}/share/hadoop/mapreduce}
HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-${HADOOP_HOME}/share/hadoop/yarn}


新增以下四行,也可以把${HADOOP_HOME}换成绝对路径
HADOOP_COMMON_HOME=${HADOOP_HOME}/share/hadoop/common
HADOOP_HDFS_HOME=${HADOOP_HOME}/share/hadoop/hdfs
HADOOP_MAPRED_HOME=${HADOOP_HOME}/share/hadoop/mapreduce
HADOOP_YARN_HOME=${HADOOP_HOME}/share/hadoop/yarn




 ----报错2
 GENERIC_JDBC_CONNECTOR_0025:No primary key - Please specify partition column.
 原因:在创建关系型数据库到hdfs的job时Partition column: 参数没有指定
 解决方法:指定一个列名即可,一般可以用主键,或者时间列,以便mapper任务的切分
 PS:由于sqoop会以此列作为mapper的划分,如果此列数据分布存在倾斜,会导致某几个mapper负载过重,而其他mapper无数据可跑的问题,所以尽量选择数据均匀分布的类作为Partition column
 
  --报错3
 GENERIC_HDFS_CONNECTOR_0007:Invalid input/output directory - Unexpected exception
 GENERIC_HDFS_CONNECTOR_0007:Invalid input/output directory - Output directory is not empty
原因:hdfs输出目录必须为空,从关系型数据库将数据到入到hdfs中时,所指定的hdfs目录必须为空
解决方法:新建一个hdfs目录,或者将旧目录清空即可
 
 


--报错4
Exception: org.apache.sqoop.common.SqoopException Message: DRIVER_0002:Given job is already running - Job with name hdfs2orcl_3
原因:
没有启动hadoop的jobhistory服务
解决方法:
配置mapred-site.xml:(namenode节点即可)

  mapreduce.jobhistory.address
  192.168.101.11:10020

启动jobhistory服务
sbin/mr-jobhistory-daemon.sh start historyserver


创建generic-jdbc-connector link 时:


--报错5
Exception: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0016:Can't fetch schema -
Identifier enclose:指定SQL中标识符的定界符,有的SQL标示符是一个引号,这个属性默认值就是双引号,例如oracle数据库,你在输入表名和schema的时候,用的是小写的emp和scoot,那么sql就会转化成 SELECT * FROM "scott"."emp" ,从而导致报错












推荐阅读
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 本文介绍了如何查看PHP网站及其源码的方法,包括环境搭建、本地测试、源码查看和在线查找等步骤。 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
author-avatar
mks8896386
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有