【问题标题】:How to fetch value from Hive in shell script via an oozie workflow?如何通过 oozie 工作流从 shell 脚本中的 Hive 获取值?
【发布时间】:2020-07-14 14:48:22
【问题描述】:

我有一个 shell 脚本 example.sh

hive -e "select max(id) from dummy.table;" > data.txt
hdfs dfs -put -f data.txt /user/username/data.txt

此脚本从 hive 获取数据并将结果存储在 hdfs 中。这在终端中按预期工作。 但是当我创建一个 oozie 工作流时,创建的文件是空的。我尝试打印一些硬编码值,然后工作流程运行良好。问题是,当涉及 hive 查询时,尽管作业成功,但数据不存在。 我尝试用 hql 运行同样的东西,它运行成功。

insert overwrite directory '/user/username/hiveData' select max(id) from dummy.table;

但我的要求是我必须在我的 shell 脚本中获取配置单元数据。

【问题讨论】:

  • 您的workflow.xml 是什么样的? IE。你只是在里面调用一个shell动作吗?
  • 是的,很简单。只需使用 hive -e 命令调用 shell 脚本。 @mazaneicha
  • 我猜它应该作为一个shell命令完成,而不是两个分开

标签: shell hive hiveql oozie


【解决方案1】:

由于您没有检查$?,您可能不知道它失败了。所以第一步是在你的shell脚本中添加它。否则你将不知道 shell 脚本是否失败(因为 hive 失败)并且 Oozie 将获得 shell 脚本的成功运行状态。

因此,在不知道配置单元代码失败的真正原因的情况下,我正在猜测。

如果您有 Hive 使用的 kerberos 身份验证,则 Hive 查询可能会在 Oozie 调用的 shell 脚本中失败。要解决 kerberos 问题,您可能需要执行以下操作:

if [ -z ${HADOOP_TOKEN_FILE_LOCATION} ]
then
    hive -e "select max(id) from dummy.table;" > data.txt
else
    hive -e "SET mapreduce.job.credentials.binary=$HADOOP_TOKEN_FILE_LOCATION; select max(id) from dummy.table;" > data.txt
fi

你可以阅读更多关于这个here

【讨论】:

    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多