【发布时间】:2015-07-16 11:06:52
【问题描述】:
我正在尝试将数据从本地文件系统移动到 Hadoop 分布式文件系统,但我无法通过 oozie 移动它 我们可以使用 oozie 将数据从本地文件系统移动或复制到 HDFS 吗???
【问题讨论】:
我正在尝试将数据从本地文件系统移动到 Hadoop 分布式文件系统,但我无法通过 oozie 移动它 我们可以使用 oozie 将数据从本地文件系统移动或复制到 HDFS 吗???
【问题讨论】:
我找到了解决此问题的方法。 ssh 操作将始终从 Oozie 服务器执行。因此,如果您的文件位于 Oozie 服务器的本地文件系统上,您将能够将它们复制到 HDFS。 ssh 操作将始终由“oozie”用户执行。因此,您的 ssh 操作应如下所示:myUser@oozie-server-ip,其中 myUser 是对来自 Oozie 服务器的文件具有读取权限的用户。 接下来,您需要在 Oozie 服务器上的 oozie 用户和 myUser 之间设置无密码 ssh。为“oozie”用户生成一个公钥,并将生成的密钥复制到“myUser”的authorized_keys文件中。这是生成 rsa 密钥的命令:
ssh-keygen -t rsa
生成密钥时,需要使用oozie用户登录。通常在 Hadoop 集群上,该用户的主页位于 /var/lib/oozie,公钥将在 /var/lib/oozie/.ssh 的 id_rsa.pub 中生成 接下来将此密钥复制到“myUser”的authorized_keys 文件中。您可以在用户家中的 .ssh 文件夹中找到它。 现在您已经设置了无密码 ssh,是时候设置 ssh oozie 操作了。此操作将执行命令“hadoop”,并将具有参数“-copyFromLocal”、“${local_file_path}”和“${hdfs_file_path}”。
【讨论】:
不,Oozie 不知道本地文件系统,因为它在 Map-Reduce 集群节点中运行。您应该使用Apache Flume 将数据从本地文件系统移动到 HDFS。
【讨论】:
Oozie 不支持从 Local 到 HDFS 的 Copy 操作,反之亦然,但你可以调用 java 程序来做同样的事情,Shell 操作也可以,但如果集群中有多个节点,那么所有节点应该具有可用的所述本地挂载点或以读/写访问权限挂载。
【讨论】:
您可以通过将复制命令放入 shell 脚本中来使用 Oozie shell 操作来执行此操作。
https://oozie.apache.org/docs/3.3.0/DG_ShellActionExtension.html#Shell_Action
例子:
<workflow-app name="reputation" xmlns="uri:oozie:workflow:0.4">
<start to="shell"/>
<action name="shell">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>run.sh</exec>
<file>run.sh#run.sh</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="kill"/>
</action>
<kill name="kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
在您的 run.sh 中,您可以使用:hadoop fs -copyFromLocal 命令。
【讨论】: