`
guoyunsky
  • 浏览: 854442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
3d3a22a0-f00f-3227-8d03-d2bbe672af75
Heritrix源码分析
浏览量:206255
Group-logo
SQL的MapReduce...
浏览量:0
社区版块
存档分类
最新评论

Sqoop源码分析(一) Eclipse调试Sqoop各种异常解决

 
阅读更多

本博客属原创文章,转载请务必注明出处:http://guoyunsky.iteye.com/blog/1187778

1. ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory /tmp/datas/sqoop already exists at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:132)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:872)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:833)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:833)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:476)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:506)
    at com.cloudera.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:107)
    at com.cloudera.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:166)
    at com.cloudera.sqoop.manager.SqlManager.importTable(SqlManager.java:386)
    at com.cloudera.sqoop.manager.MySQLManager.importTable(MySQLManager.java:125)
    at com.cloudera.sqoop.tool.ImportTool.importTable(ImportTool.java:350)
    at com.cloudera.sqoop.tool.ImportTool.run(ImportTool.java:423)
    at com.cloudera.sqoop.Sqoop.run(Sqoop.java:144)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
    at com.cloudera.sqoop.Sqoop.runSqoop(Sqoop.java:180)
    at com.cloudera.sqoop.Sqoop.runTool(Sqoop.java:218)
    at com.cloudera.sqoop.Sqoop.main(Sqoop.java:228)

 

     这是我在通过Sqoop从关系型数据库导数据到Hadoop中所触发,导入的目标文件target-dir就是/tmp/datas/sqoop,网上也有解决方案,就是说要在HDFS文件系统中通过hadoop dfs -rmr /tmp/datas/sqoop干掉/tmp/datas/sqoop即可。但发现不是这么回事.但前提是确实能删除,因为我这里是在Eclipse中运行,如果能删除就没必要往下面看了.但如果发现报一下错误,或许可以帮到你:

      rmr: cannot remove /tmp/datas/sqoop: No such file or directory.

      HDFS中没有这个文件?于是用以下命令查看下:hadoop fs -ls /tmp/datas,还真的是空荡荡的.怎么回事?而程序里面却报Output directory /tmp/datas/sqoop already exists.这不是矛盾吗?直接告诉我Sqoop跑的Hadoop跟hadoop fs等跑的Hadoop完全不是同一个.这个在源码中得到体现得到的FileiSystem是LocalFileSystem,同时在你的机器上也会发现已经存在/tmp/datas/sqoop这个文件,Hadoop这里用的是你本地的文件系统.因为通过Shell命令启动时,Hadoop会去读取$HADOOP_HOME/conf下的配置文件,而通过Eclipse时则是采用默认的,这里解决方法也很简单,只要将$HADOOP_HOME/conf写入classpath即可.方法是,右击sqoop源码->Properties->Java Build Path->Add External Class Folder,将你Sqoop所运行的Hadoop的conf加入即可.

 

=====================================华丽的分隔===============================

 

 

2. java.lang.RuntimeException: java.lang.ClassNotFoundException:      com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)
    at org.apache.hadoop.mapreduce.JobContext.getOutputFormatClass(JobContext.java:248)
    at org.apache.hadoop.mapred.Task.initialize(Task.java:486)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:240)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1115)
    at org.apache.hadoop.mapred.Child.main(Child.java:234)

 

        这是我在通过Sqoop从关系型数据库导数据到Hadoop中所触发,刚碰到这个异常时很奇怪,因为我明明是在Eclipse上跑Sqoop源码,怎么会报找不到sqoop自己的类的异常.后来调试Sqoop源码后才知道这是一个Hadoop常识,大概原理如下:

       Sqoop生成一个Job通过MapReduce进行并行导入.而Job所依赖的资源,如jar,配置文件,输入输出等则会复制到HDFS上使得每个运行task的节点都可以使用,从而执行任务.而通过Eclipse运行时,并不会将这些打包成jar,也就是com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat没有打包到jar中,而使得运行任务的节点没有得到这些资源,所以Hadoop触发了这个异常。虽然我自己运行的也是伪分布式,但原理一样.解决的办法很简单,只要将sqoop源码打包成一个Jar放到你的$HADOOP_HOME/lib下即可

 

   3.通过Eclipse运行Sqoop源码跟通过Sqoop脚本($SQOOP_HOME/bin/sqoop)产生的结果不一致

      今天碰到一个很诡异的情况,从apache上下载了Sqoop1.4,然后通过脚本运行Sqoop,发现跟通过Eclipse运行Sqoop源码结果不一致,因为之前我对Sqoop有些改动,我添加了某些功能,但官方的Sqoop并不支持.一开始还以为官方采纳了我们这边,但源码里瞅下并不如此.Eclipse源码跑下来也发现官方Sqoop并没有收纳.但运行Sqoop脚本却发现已经收纳了.真是匪夷所思,一开始认为可能是源码原因,于是重新编译了官方Sqoop1.4,但发现还是如此.于是去看sqoop脚本才发现原因:原来Sqoop是通过Hadoop执行,我这边Hadoop执行的Sqoop在其lib下,而这个lib下的Sqoop正是我之前打包好的Sqoop,所以实际上运行的一直是我之前的Sqoop,而不是新下载的Sqoop1.4.于是干掉了$HADOOP_HOME/lib下的sqoop包,重新换成新下载的Sqoop1.4,于是就正常了.现在贴上sqoop脚本下的源码:

         source ${bin}/configure-sqoop "${bin}"

         exec ${HADOOP_HOME}/bin/hadoop com.cloudera.sqoop.Sqoop "$@"

 

 更多技术文章、感悟、分享、勾搭,请用微信扫描:

 

分享到:
评论
1 楼 lotrv 2015-04-07  
  [b][b]                [/b][/b]

相关推荐

    eclipse-sqoop.

    总之,通过Eclipse的远程调试功能,我们可以深入理解Sqoop的内部工作原理,排查和修复各种问题。确保正确配置Maven插件,并在Eclipse中设置好远程调试,是有效解决问题的关键步骤。在实际操作中,结合日志分析、代码...

    sqoop重编译版本,解决了联合主键的同步问题

    本资源是把sqoop的源码按照官方推荐的issue解决方案重新编译后的版本。sqoop-1.4.7.bin__hadoop-2.6.0-2020.0508.tar.gz是已完成编译的tar包。sqoop编译.zip是编译所需要改的配置以及步骤。 各位请二选其一吧。这个...

    sqoop1.99.7源码

    sqoop2(1.99.7版本)源代码,可以直接按需求修改一些内容,例如,默认分隔符等

    Sqoop安装与使用

    Sqoop 安装与使用 ...Sqoop 工具是一个非常有用的数据迁移工具,可以帮助用户将传统型数据库中的数据迁移到 Hadoop 中,并进行数据分析和处理。但是,Sqoop 工具的安装和配置需要一定的技术基础和经验。

    sqoop-1.4.7.zip

    Sqoop是Apache Hadoop生态中的一个工具,用于在关系型数据库和Hadoop之间高效地导入导出数据。在这个场景中,我们遇到了一个关于Sqoop运行时的问题,即"找不到或无法加载主类 org.apache.sqoop.sqoop"。这个问题通常...

    sqoop.zip解决报空指针的问题所需要的jar

    Sqoop是Apache Hadoop生态中的一个工具,用于在关系型数据库和Hadoop之间高效地导入导出数据。在CDH(Cloudera Distribution Including Apache Hadoop)6.2.1版本中,Sqoop可能会遇到一些运行时错误,比如空指针异常...

    sqoop-1.4.7.tar.gz.zip

    在这个特定的文件“sqoop-1.4.7.tar.gz.zip”中,我们看到的是 Sqoop 1.4.7 版本的源码或二进制包。这个版本的 Sqoop 是一个较早的稳定版本,它提供了对早期 Hadoop 生态系统的支持。 首先,我们需要了解 Sqoop 的...

    java连接sqoop源码-quick-sqoop:ApacheSqoopETL工具的快速参考

    java连接sqoop源码Apache Sqoop 目录 #Getting Started下载并安装 Sqoop 注意:选择合适的版本,不要使用 sqoop2 因为它不是正式的 GA 并且可能永远不会 $ wget ...

    sqoop-1.4.5

    - 连接器(Connector): Sqoop提供了一系列连接器,用于与各种类型的数据库进行通信,每个连接器负责特定数据库的连接和数据迁移。 - MapReduce作业:实际的数据迁移工作由Hadoop的MapReduce框架执行,每个Mapper...

    解决sqoop2导入hdfs单引号问题

    使用sqoop2从mysql导入hadoop时,导入的数据带单引号。是由于sqoop2的一个bug导致,该包上传到sqoop_home/server/lib替换原来的jar包后,重启sqoop server,即可解决。

    sqoop-cdh安装包

    在CDH(Cloudera Distribution Including Apache Hadoop)环境下安装和使用Sqoop,可以方便地将结构化数据从传统的数据库系统迁移到Hadoop的分布式文件系统HDFS,或者将分析结果写回数据库。下面我们将详细讲解sqoop...

    Hadoop-Sqoop配置

    Hadoop-Sqoop配置 Sqoop 是一种数据迁移工具,主要用于在...Sqoop 是一种功能强大且灵活的数据迁移工具,可以满足各种数据迁移和集成的需求。但是,Sqoop 也存在一些局限性,例如依赖于 JDBC 驱动包和 Hadoop 环境。

    java连接sqoop源码-sqoop-v2:sqoop支持多数据源导出

    Java连接Sqoop源码分析——探索Sqoop V2对多数据源导出的支持 Sqoop是Apache Hadoop生态系统中的一个重要工具,它允许用户在Hadoop和传统关系型数据库管理系统(RDBMS)之间进行大规模数据迁移。随着大数据处理的...

    Sqoop集群搭建.

    Sqoop是一款开源的数据转换工具,由 Apache 软件基金会开发,主要用于在 Hadoop 集群和结构化数据存储之间移动数据。Sqoop 集群搭建是指在 Hadoop 集群环境中安装和配置 Sqoop,以实现数据的高效转换。 一、Sqoop ...

    实战Sqoop数据导入及大数据用户行为案例分析

    实战Sqoop数据导入及大数据用户行为案例分析(全套视频+代码+工具+课件讲义) 内容包括: 01_CDH版本框架的介绍 02_CDH版本框架的环境部署 03_Sqoop的介绍及其实现原理 04_Sqoop的安装部署及连接测试 05_Sqoop将...

    解决sqoop2 数据分隔符为 ',' 以及 string类型数据存在单引号('数据')问题(通过改变源码编译解决 ---可以从源头彻底解决)

    说明: 版本为:sqoop2-1.99.5-cdh5.10.2 解决数据分隔符 以及 string类型数据存在单引号问题(解决方式 通过更改源码SqoopIDFUtils 里面的分隔符来解决此问题 ) ​ 只需要将以下包进行替换 connector-sdk-1.99.5-...

    sqoop-javabean-sqoop脚本分隔符失效问题

    在问题解决过程中,利用 Sqoop 提供的调试工具和日志信息是非常有帮助的。对于“F_TM_TRADEMARK.java”这个文件,它可能是一个由Sqoop生成的Java Bean类,用于表示数据库表`F_TM_TRADEMARK`的数据结构,这也可能是...

    java连接sqoop源码-sqoop-example:sqoop-示例

    java连接sqoop源码Sqoop-服务 Sqoop scala 驱动程序,带有 mysql 元存储、光滑的数据库和喷雾。 Sqoop 是一个很好的工具,用于在 HDFS 中导入和导出数据。 大多数 sqoop 作业都是通过脚本编写的,这对于临时作业来说...

    sqoop的原理及概念

    Sqoop 的原理及概念 Sqoop 是一个开源的工具,用于在关系型数据库(RDBMS)和 Hadoop 之间进行高效的大数据交流。...3. 大数据分析:Sqoop 能够将关系型数据库的数据导入到 Hadoop 中,以便进行大数据分析。

Global site tag (gtag.js) - Google Analytics