繁体   English   中英

使用Sqoop / Oozie从Hive将数据加载到MySQL表

[英]Loading data to MySQL table from Hive using Sqoop/Oozie

我在使用Sqoop(内Oozie的sqoop命令)加载数据到MySQL表面临着一些严重的问题(尝试不成功的196倍)。 如果在HDFS(这里FOO)只有一个数据的列则没有问题,但如果有超过1个例如2列,数据不会被加载到MySQL。

如果我本身运行Sqoop,那么数据被加载到MySQL,但是当我把里面的Oozie的,数据不会laoded。

workflow.xml有两部分,第一部分将数据从Hive表加载到HDFS,第二部分将数据从HDFS加载到MySQL。

我使用ClouderaVM。

错误信息是:

Caused by: java.lang.NumberFormatException: For input string: "1    a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)

-

hive> CREATE EXTERNAL TABLE IF NOT EXISTS foo (
id int,
city string
 )
ROW FORMAT DELIMITED
 FIELDS TERMINATED BY '\t'
 LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/cloudera/foo';

-

$ vi foo
1   a
4   b

hive> load data local inpath '/home/cloudera/foo' into table foo;

-

mysql> CREATE TABLE `foo` (`id` int(11) DEFAULT NULL, `city` varchar(22) DEFAULT NULL );

-

workflow.xml:

<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.2" name="etl-wf">
    <start to="hive-node"/>

    <action name="hive-node">
    <hive xmlns="uri:oozie:hive-action:0.2">
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
        <job-xml>hive-site.xml</job-xml>
       <script>script.q</script>
    </hive>
    <ok to="sqoop-node"/>
    <error to="fail"/>
 </action>

 <action name="sqoop-node">
    <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <command>export --connect jdbc:mysql://www.abc.net/test --username rio --password r005 --table foo  --export-dir /user/cloudera/test --input-fields-terminated-by '\t' --input-lines-terminated-by '\n'</command>
    </sqoop>
    <ok to="end"/>
    <error to="fail"/>
</action>


<kill name="fail">
    <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>

</workflow-app>

注:此处第1部分工作即数据被laoded在蜂巢测试表,但没有得到来自HDFS加载:/用户/ Cloudera的/测试到MySQL表foo。

-

vi script.q:

CREATE EXTERNAL TABLE IF NOT EXISTS test (
id int,
city string
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION
 '/user/cloudera/test';

INSERT OVERWRITE table test SELECT * FROM foo;

-

标准日志

Note: /tmp/sqoop-mapred/compile/d4f769ef09667984820f21a38ae27bb4/foo.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
java.io.IOException: Can't export data, please check task tracker logs
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:140)
at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
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:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)

Caused by: java.lang.NumberFormatException: For input string: "1    a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)
at java
java.io.IOException: Can't export data, please check task tracker logs
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:140)
at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
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:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)

Caused by: java.lang.NumberFormatException: For input string: "1    a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)
at java
java.io.IOException: Can't export data, please check task tracker logs
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:112)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:39)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:140)
at org.apache.sqoop.mapreduce.AutoProgressMapper.run(AutoProgressMapper.java:64)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
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:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)

Caused by: java.lang.NumberFormatException: For input string: "1    a"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:458)
at java
Intercepting System.exit(1)
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]

-

这可能是记录器中的一个转换器,但仍然值得研究:“ 1 a”中有4个空格。 您是否检查过HDFS文件中的内容? 列是否用\\ t分隔?

原因:java.lang.NumberFormatException:对于输入字符串:“ 1 a”

是这里的探针。 更改您的mysql脚本并使用mysql> CREATE TABLE foo ( id varchar(11) DEFAULT NULL, city varchar(22) DEFAULT NULL );

问题在于数据中的第一列被推断为整数。 这不是您的问题的解决方案。 我刚刚推荐使用这种方法作为测试,以检查数字格式是否是您的问题所在。 请执行此操作,并告诉我们。 我们将尽力为您提供帮助。

PS:很有可能1和a之间的字符不是制表符分隔符。 可能是空格。

使用Oozie时不需要转义参数。 必须删除所有转义序列以及周围的单引号和双引号。 您在oozie工作流程中的sqoop命令应如下所示:

导出--connect jdbc:mysql://www.abc.net/test --username rio --password r005 --table foo --export-dir / user / cloudera / test --input-fields-terminated-by \\ t-输入线以\\ n终止

\\ t和\\ n周围不应有任何单引号。

可能的原因可能是蜂巢表中没有正确插入数据。您可以打印以下命令的结果吗?

hive -e "select id from foo;"

如果上面的查询打印为

1   a
4   b

然后编辑您的输入文件以带有制表符或更改定界符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM