将 hdfs 上的脚本文件传递给 impala-shell

Posted

技术标签:

【中文标题】将 hdfs 上的脚本文件传递给 impala-shell【英文标题】:Passing script files on hdfs to impala-shell 【发布时间】:2019-08-06 11:08:44 【问题描述】:

我有一个 oozie 工作,它有一个 shell 操作。 首先,shell 操作以编程方式查找存储在 hdfs 上的某些 sql 脚本文件。 然后尝试在 impala 上运行每个 sql 脚本。

由于事先不知道我要运行的 sql 脚本列表,因此不能作为 <file> 参数传递给 oozie 操作,有没有办法运行 impala-shell 并给它一个 hdfs 路径linux路径?

【问题讨论】:

【参考方案1】:

Impala shell 可以接受来自 STDIN 的查询文本。如here所述,选项-f

-f query_file 或 --query_file=query_file

query_file=path_to_query_file

从文件传递 SQL 查询。多个语句必须是分号 (;) 分隔。在 Impala 2.3 及更高版本中,您可以指定一个文件名 - 表示标准输入。此功能可以方便地将 impala-shell 用作 Unix 管道的一部分,其中 SQL 语句 由其他工具动态生成。

因此,在您的情况下,您的 shell 脚本可以简单地执行类似

的操作
$ hdfs dfs -cat <hdfs_file_name> | impala-shell -i <impala_daemon> -f -

【讨论】:

【参考方案2】:

如果您有固定数量的查询,或者您可以将它们收集(cat)到一个文件中,那么您可以使用 &lt;capture-output/&gt; 标记将该文件的名称作为参数从 &lt;action&gt; 中传递出去:

$ hdfs hdfs -cat /user/impala/sql/custom_script_name.sql

CREATE TABLE default.t1(n INT);
INSERT INTO default.t1 VALUES(1);

$ hdfs hdfs -cat /oozie/shell/prepare-implala-sql.sh

#!/bin/bash
echo HDFS_IMPALA_SCRIPT:/user/impala/sql/custom_script_name.sql

$ hdfs hdfs -cat /user/oozie/workflow/wf_impala_env/wf_impala_env.xml

<workflow-app name="wf_impala_env" xmlns="uri:oozie:workflow:0.5">
  <start to="a1"/>
  <kill name="a0">
    <message>Error: [$wf:errorMessage(wf:lastErrorNode())]</message>
  </kill>
  <action name="a1">
    <shell xmlns="uri:oozie:shell-action:0.2">
      <job-tracker>$resourceManager</job-tracker>
      <name-node>$nameNode</name-node>
      <exec>bash</exec>
      <argument>prepare-implala-sql.sh</argument>
      <file>/oozie/shell/prepare-implala-sql.sh#prepare-implala-sql.sh</file>
      <capture-output/>
    </shell>
    <ok to="a2"/>
    <error to="a0"/>
  </action>
  ...

然后在 Impala 步骤中将其用作 &lt;file&gt; 参数:

  ...
  <action name="a2">
    <shell xmlns="uri:oozie:shell-action:0.2">
      <job-tracker>$resourceManager</job-tracker>
      <name-node>$nameNode</name-node>
      <exec>impala-shell</exec>
      <argument>-i</argument>
      <argument>$impalad</argument>
      <argument>-f</argument>
      <argument>query.sql</argument>
      <env-var>PYTHON_EGG_CACHE=./myeggs</env-var>
      <file>$wf:actionData("a1")["HDFS_IMPALA_SCRIPT"]#query.sql</file>
      <capture-output/>
    </shell>
    <ok to="a99"/>
    <error to="a0"/>
  </action>

  <end name="a99"/>
</workflow-app>

不要忘记impala-shell(或bash -> impala-shell)的PYTHON_EGG_CACHE。

【讨论】:

以上是关于将 hdfs 上的脚本文件传递给 impala-shell的主要内容,如果未能解决你的问题,请参考以下文章

将PNG文件请求传递给Nginx中的PHP脚本

Pyspark:使用 configParser 读取 HDFS 上的属性文件

访问存储在 HDFS 分布式缓存中的 python 脚本中的文件

通过 Python 脚本将多个输入传递给 .bat 文件

Django - 将变量传递给同一脚本标签内的 javascript 文件

MAMP phpmyadmin 上的脚本超时传递错误