Apache Airflow:尝试使用 HiveOperator 执行 DAG 时,没有这样的文件或目录:'beeline'
Apache Airflow: No such file or directory: 'beeline' when trying to execute DAG with HiveOperator
运行ning DAG 时在任务日志中收到以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'beeline': 'beeline'
这是我的 DAG:
import airflow
from airflow import DAG
from airflow.providers.apache.hive.operators.hive import HiveOperator
from airflow.utils.dates import days_ago
from datetime import timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': airflow.utils.dates.days_ago(2),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag_data_summarizer = DAG(
dag_id="data_summarizer",
default_args=default_args,
description='Data summarizer DAG',
schedule_interval='*/20 * * * *',
start_date=airflow.utils.dates.days_ago(1)
)
hql_query = """create database if not exist new_test_db;"""
hive_task = HiveOperator(
hql=hql_query,
task_id="data_retrieval",
hive_cli_conn_id="new_hive_conn",
dag=dag_data_summarizer,
run_as_user="airflow" # airflow user has beeline executable set in PATH
)
if __name__ == '__main__':
dag_data_summarizer.cli()
new_hive_conn
连接类型为“hive_cli”(尝试使用连接类型“hiveserver2”也没有成功)
任务日志打印以下命令:
beeline -u "jdbc:hive2://hive-server-1:10000/default;auth=NONE"
当我 运行 在 worker docker 容器上执行此命令时,该命令有效并且我已连接到配置单元服务器。
worker 容器在其 PATH 上为“airflow”和“root”用户配置了 beeline
可执行文件:
/home/airflow/.local/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/airflow/hive/apache-hive-2.3.2-bin/bin:/home/airflow/hadoop/hadoop-3.3.1/bin
'run_as_user' 功能使用 'sudo' 在非交互模式下切换到 airflow
用户。 sudo
命令永远不会(无论您指定什么参数,包括 -E)保留 PATH 变量,除非您在 --interactive 模式下执行 sudo(由用户登录)。只有在 --interactive 模式下,用户的 .profile 、 .bashrc 和其他启动脚本才会被执行(这些通常是为用户设置 PATH 的脚本)。
所有非交互式 'sudo' 命令的路径都将设置为 /etc/sudoers 文件中设置的 secure_path
。
我的情况:
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
您需要将 /etc/sudoers
或 copy/link 的路径添加到现有的“安全”二进制路径之一。
运行ning DAG 时在任务日志中收到以下错误:
FileNotFoundError: [Errno 2] No such file or directory: 'beeline': 'beeline'
这是我的 DAG:
import airflow
from airflow import DAG
from airflow.providers.apache.hive.operators.hive import HiveOperator
from airflow.utils.dates import days_ago
from datetime import timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': airflow.utils.dates.days_ago(2),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag_data_summarizer = DAG(
dag_id="data_summarizer",
default_args=default_args,
description='Data summarizer DAG',
schedule_interval='*/20 * * * *',
start_date=airflow.utils.dates.days_ago(1)
)
hql_query = """create database if not exist new_test_db;"""
hive_task = HiveOperator(
hql=hql_query,
task_id="data_retrieval",
hive_cli_conn_id="new_hive_conn",
dag=dag_data_summarizer,
run_as_user="airflow" # airflow user has beeline executable set in PATH
)
if __name__ == '__main__':
dag_data_summarizer.cli()
new_hive_conn
连接类型为“hive_cli”(尝试使用连接类型“hiveserver2”也没有成功)
任务日志打印以下命令:
beeline -u "jdbc:hive2://hive-server-1:10000/default;auth=NONE"
当我 运行 在 worker docker 容器上执行此命令时,该命令有效并且我已连接到配置单元服务器。
worker 容器在其 PATH 上为“airflow”和“root”用户配置了 beeline
可执行文件:
/home/airflow/.local/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/airflow/hive/apache-hive-2.3.2-bin/bin:/home/airflow/hadoop/hadoop-3.3.1/bin
'run_as_user' 功能使用 'sudo' 在非交互模式下切换到 airflow
用户。 sudo
命令永远不会(无论您指定什么参数,包括 -E)保留 PATH 变量,除非您在 --interactive 模式下执行 sudo(由用户登录)。只有在 --interactive 模式下,用户的 .profile 、 .bashrc 和其他启动脚本才会被执行(这些通常是为用户设置 PATH 的脚本)。
所有非交互式 'sudo' 命令的路径都将设置为 /etc/sudoers 文件中设置的 secure_path
。
我的情况:
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
您需要将 /etc/sudoers
或 copy/link 的路径添加到现有的“安全”二进制路径之一。