33

我有一个 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
4

5 回答 5

90

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

HADOOP_USER_NAME=hdfs hadoop dfs -put ...
于 2013-10-01T20:06:29.877 回答
19

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

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

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

export HADOOP_USER_NAME=<your hdfs user>
于 2016-01-27T16:17:57.677 回答
13

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

Hadoop 在 HDFS 中用于权限的用户身份是通过在客户端系统上运行 whoami 命令来确定的。类似地,组名来自运行组的输出。

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

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

于 2012-07-07T01:30:54.730 回答
1

外壳/命令方式:

设置HADOOP_USER_NAME变量,执行hdfs命令

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

Pythonic方式:

  import os 
  os.environ["HADOOP_USER_NAME"] = "manjunath"
于 2021-08-14T03:21:09.737 回答
0

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

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

有关详细信息,请参阅将远程文件放入 hadoop 而不将其复制到本地磁盘

于 2012-07-07T16:42:22.803 回答