我在执行 oozie sqoop 操作时遇到问题。在日志中我可以看到 sqoop 能够将数据导入到临时目录,然后 sqoop 创建 hive 脚本来导入数据。

将临时数据导入配置单元时失败。

在日志中我没有收到任何异常。

下面是我正在使用的 sqoop 操作。

<workflow-app name="testSqoopLoadWorkflow" xmlns="uri:oozie:workflow:0.4">
<credentials>
    <credential name='hive_credentials' type='hcat'>
        <property>
            <name>hcat.metastore.uri</name>
            <value>${HIVE_THRIFT_URL}</value>
        </property>
        <property>
            <name>hcat.metastore.principal</name>
            <value>${KERBEROS_PRINCIPAL}</value>
        </property>
    </credential>
</credentials>
<start to="loadSqoopDataAction"/>
<action name="loadSqoopDataAction" cred="hive_credentials">
    <sqoop xmlns="uri:oozie:sqoop-action:0.2">
        <job-tracker>${jobTracker}</job-tracker>
        <name-node>${nameNode}</name-node>
             <job-xml>/tmp/hive-oozie-site.xml</job-xml>
        <configuration>
            <property>
                <name>oozie.hive.defaults</name>
                <value>/tmp/hive-oozie-site.xml</value>
            </property>
                  </configuration>
        <command>job --meta-connect ${SQOOP_METASTORE_URL} --exec TEST_SQOOP_LOAD_JOB</command>
    </sqoop>
    <ok to="end"/>
    <error to="kill"/>
</action>

下面是我用来导入数据的 sqoop 作业。

sqoop job --meta-connect ${SQOOP_METASTORE_URL} --create TEST_SQOOP_LOAD_JOB -- import --connect '${JDBC_URL}' --table testTable -m 1 --append --check-column pkId --incremental append --hive-import --hive-table testHiveTable;

在 mapred 日志中我收到以下异常。

72285 [main] INFO  org.apache.sqoop.hive.HiveImport  - Loading uploaded data into Hive
Intercepting System.exit(1)

<<< Invocation of Main class completed <<<

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]

Oozie Launcher failed, finishing Hadoop job gracefully


Oozie Launcher ends

请建议。

有帮助吗?

解决方案

这似乎是一个典型的 Sqoop 导入到 Hive 工作。因此,Sqoop 似乎已成功将数据导入 HDFS,但无法将该数据加载到 Hive 中。

以下是正在发生的事情的一些背景......Oozie 启动一个单独的作业(它将在 hadoop 集群中的任何节点上执行)来运行 Sqoop 命令。Sqoop 命令启动一个单独的作业将数据加载到 HDFS 中。然后,在 Sqoop 作业结束时,sqoop 运行 Hive 脚本以将该数据加载到 Hive 中。

由于理论上它是从 Hadoop 集群中的任何节点运行的,因此 hive CLI 需要在每个节点上可用并与同一个元存储进行通信。Hive Metastore 将需要在远程模式下运行。

最常见的问题是 Sqoop 无法与正确的元存储对话。造成这种情况的主要原因通常有:

  1. Hive 元存储服务 没有运行。它应该以远程模式运行,并且应该启动单独的服务。这是检查其是否正在运行的快速方法:

    服务配置单元元存储状态

  2. hive-site.xml 不含 hive.metastore.uris. 。这是一个例子 hive-site.xmlhive.metastore.uris 放:

    <configuration>
    ...
      <property>
        <name>hive.metastore.uris</name>
        <value>thrift://sqoop2.example.com:9083</value>
      </property>
    ...
    </configuration>
    
  3. hive-site.xml 不包含在您的 Sqoop 操作(或其属性)中。尝试将您的 hive-site.xml 添加到 <file> Sqoop 操作中的元素。这是一个示例工作流程.xml <file> 在里面:

    <workflow-app name="sqoop-to-hive" xmlns="uri:oozie:workflow:0.4">
        ...
        <action name="sqoop2hive">
            ...
            <sqoop xmlns="uri:oozie:sqoop-action:0.2">
                ...
                <file>/tmp/hive-site.xml#hive-site.xml</file>
            </sqoop>
            ...
        </action>
        ...
    </workflow-app>
    

其他提示

这似乎是sqoop中的错误。我不确定jira#。Hortonworks提到即使在HDP 2.2版本中也仍未解决该问题。

@abeaamase - 我想尝试使用你的解决方案。

只想检查以下解决方案是否适用于SQOOP + Hive导入一个单一的oozie作业?

...... ...... ...... /tmp/hive-site.xml#hive-site.xml. ...... ......

如果您使用的是CDH,则问题可能是由于Hive Metastore Jar依赖关系发生冲突。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top