将 hdfs 上的脚本文件传递给 impala-shell
Passing script files on hdfs to impala-shell
我有一个 oozie 作业,其中有一个 shell 操作。
首先,shell 操作以编程方式查找存储在 hdfs 上的某些 sql 脚本文件。
然后尝试 运行 impala 上的每个 sql 脚本。
由于事先不知道我想要 运行 的 sql 脚本列表,因此无法作为 <file>
参数传递给 oozie 操作,有没有办法到 运行 impala-shell 并给它一个 hdfs 路径而不是 linux 路径?
Impala shell 可以接受来自 STDIN 的查询文本。如所述 here,选项 -f
-f query_file or --query_file=query_file
query_file=path_to_query_file
Passes a SQL query from a file. Multiple statements must be semicolon
(;) delimited. In Impala 2.3 and higher, you can specify a filename of
- to represent standard input. This feature makes it convenient to use impala-shell as part of a Unix pipeline where SQL statements are
generated dynamically by other tools.
所以在你的情况下,你的 shell 脚本可以简单地做类似
的事情
$ hdfs dfs -cat <hdfs_file_name> | impala-shell -i <impala_daemon> -f -
如果您有固定数量的查询,或者您可以将它们收集(分类)到一个文件中,那么您可以将此文件的名称作为参数传递给 <action>
使用<capture-output/>
标签:
$ 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步骤中将其用作<file>
参数:
...
<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
的 PYTHON_EGG_CACHE(或 bash
-> impala-shell
)。
我有一个 oozie 作业,其中有一个 shell 操作。 首先,shell 操作以编程方式查找存储在 hdfs 上的某些 sql 脚本文件。 然后尝试 运行 impala 上的每个 sql 脚本。
由于事先不知道我想要 运行 的 sql 脚本列表,因此无法作为 <file>
参数传递给 oozie 操作,有没有办法到 运行 impala-shell 并给它一个 hdfs 路径而不是 linux 路径?
Impala shell 可以接受来自 STDIN 的查询文本。如所述 here,选项 -f
-f query_file or --query_file=query_file
query_file=path_to_query_file
Passes a SQL query from a file. Multiple statements must be semicolon (;) delimited. In Impala 2.3 and higher, you can specify a filename of - to represent standard input. This feature makes it convenient to use impala-shell as part of a Unix pipeline where SQL statements are generated dynamically by other tools.
所以在你的情况下,你的 shell 脚本可以简单地做类似
的事情$ hdfs dfs -cat <hdfs_file_name> | impala-shell -i <impala_daemon> -f -
如果您有固定数量的查询,或者您可以将它们收集(分类)到一个文件中,那么您可以将此文件的名称作为参数传递给 <action>
使用<capture-output/>
标签:
$ 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步骤中将其用作<file>
参数:
...
<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
的 PYTHON_EGG_CACHE(或 bash
-> impala-shell
)。