从远程机器将文件放在 HDFS 上时如何指定用户名?

Posted

技术标签:

【中文标题】从远程机器将文件放在 HDFS 上时如何指定用户名?【英文标题】:How to specify username when putting files on HDFS from a remote machine? 【发布时间】:2012-07-07 10:33:11 【问题描述】:

我有一个 Hadoop 集群设置并在一个常见的默认用户名“user1”下工作。我想从不属于 hadoop 集群的远程机器将文件放入 hadoop。我在远程机器上配置了 hadoop 文件,当

hadoop dfs -put file1 ...

从远程机器调用,它将file1放在Hadoop集群上。

唯一的问题是我在远程机器上以“user2”身份登录,这并没有给我预期的结果。其实上面的代码只能在远程机器上执行为:

hadoop dfs -put file1 /user/user2/testFolder

但是,我真正想要的是能够将文件存储为:

hadoop dfs -put file1 /user/user1/testFolder

如果我尝试运行最后一个代码,hadoop 会因为访问权限而引发错误。无论如何我可以在 hadoop dfs 命令中指定用户名吗?

我正在寻找类似的东西:

hadoop dfs -username user1 file1 /user/user1/testFolder

【问题讨论】:

我认为***.com/questions/11041253 回答得很好。 我认为您需要将正确答案更改为 HADOOP_USER_NAME 变体,获得最多支持。当您可以设置 env 变量时,whoami hack 是不正确的做法。 【参考方案1】:

Shell/命令方式:

设置HADOOP_USER_NAME变量,并执行hdfs命令

  export HADOOP_USER_NAME=manjunath
  hdfs dfs -put <source>  <destination>

Python 方式:

  import os 
  os.environ["HADOOP_USER_NAME"] = "manjunath"

【讨论】:

【参考方案2】:

这对任何人都可能无关紧要,但我正在为此使用一个小技巧。

我将 HADOOP_USER_NAME 导出到 .bash_profile 中,这样每次登录时都会设置用户。

只需将以下代码行添加到 .bash_profile:

export HADOOP_USER_NAME=<your hdfs user>

【讨论】:

【参考方案3】:

如果您使用 HADOOP_USER_NAME 环境变量,您可以告诉 HDFS 使用哪个用户名进行操作。请注意,这仅在您的集群未使用安全功能(例如 Kerberos)时才有效。例如:

HADOOP_USER_NAME=hdfs hadoop dfs -put ...

【讨论】:

有设置HDFS组的环境变量吗?【参考方案4】:

还有一篇与此类似的帖子,可以为您提供通过 ssh 使用流式传输的解决方法:

cat file.txt | ssh user1@clusternode "hadoop fs -put - /path/in/hdfs/file.txt"

更多信息请参见putting a remote file into hadoop without copying it to local disk

【讨论】:

谢谢。但这也是我自己的帖子。尝试之后,我注意到不使用管道更快。事实上,使用“sep”将文件复制到其中一台hadoop机器,然后使用“ssh”将文件从本地驱动器复制到hadoop结果更快。我不确定原因,但可能与可用缓冲区数量的限制有关。无论如何,我试图跳过这两个步骤,直接从远程机器上使用“hadoop”。它适用于复制文件,但我面临着两个不同用户名下的文件。【参考方案5】:

默认情况下,Hadoop 中的身份验证和授权是关闭的。根据Hadoop - The Definitive Guide (顺便说一句,好书 - 建议购买)

Hadoop 在 HDFS 中用于权限的用户身份是通过运行来确定的 客户端系统上的 whoami 命令。同样,组名来源于 跑步组的输出。

因此,您可以创建一个新的whoami 命令,该命令返回所需的用户名并将其适当地放在 PATH 中,以便在找到 Linux 附带的实际 whoami 之前找到创建的 whoami。同样,您也可以使用groups 命令。

这是一个 hack,一旦打开身份验证和授权就无法工作。

【讨论】:

是的 - 在某处读到 Hadoop 最初是在小型受信任用户之间使用的,安全性并不是真正的问题,后来随着使用量的增长,安全性被添加到 Hadoop 之上。实际上,安全性应该是软件设计从头开始考虑的问题,而不是事后考虑。只是我的 2c。 谢谢。您能否详细说明我应该如何创建一个新的“whoami”命令并将其放入路径中?也许举个例子。谢谢 echo yourname 创建一个文本文件文件whoami 并赋予它可执行权限。将whoami 的文件夹作为第一件事添加到 .bashrc 文件中的 PATH 变量中。 不错的技巧,但它不起作用。我创建了 whoamifile 并更新了我的路径。现在,当我运行 whoami 时,它会返回 user1。但是当我尝试使用“hadoop dfs -put file1 /user/user1/testFolder”将文件放入hadoop时,由于权限而引发错误并将用户名指定为user2:( 由于某种原因,Hadoop 没有选择您创建的 whoami。正确设置路径,它应该可以工作。

以上是关于从远程机器将文件放在 HDFS 上时如何指定用户名?的主要内容,如果未能解决你的问题,请参考以下文章

linux文件拷贝到其他机器

HDFS 核心原理

HDFS 核心原理

用户将手指放在屏幕上时立即触发事件

如何使用 ASP.NET 将文件从一台机器移动到另一台机器?

Spark学习笔记——在远程机器中运行WordCount