从远程机器将文件放在 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 上时如何指定用户名?的主要内容,如果未能解决你的问题,请参考以下文章