避免在伪分布式模式下启动 Hadoop 时输入密码

避免在伪分布式模式下启动 Hadoop 时输入密码

因此,我在笔记本电脑上以伪分布式模式运行 Hadoop,以了解这些事情。

我正在按照手动的

我可以启动 Hadoop,没有问题,但是启动过程不方便。看,要启动它,需要执行以下操作:

start-dfs.sh

然后,系统会提示输入密码3次(在我的情况下,三次都是相同的):

Starting namenodes on [localhost]
me@localhost's password: 
localhost: starting namenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-namenode-me-HP-ENVY-15-Notebook-PC.out
me@localhost's password: 
localhost: starting datanode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-datanode-me-HP-ENVY-15-Notebook-PC.out
Starting secondary namenodes [0.0.0.0]
[email protected]'s password: 
0.0.0.0: starting secondarynamenode, logging to /home/me/hadoop-2.7.3/logs/hadoop-me-secondarynamenode-me-HP-ENVY-15-Notebook-PC.out

(当一个人这样做时也是一样stop-dfs.sh)。

这很麻烦。有没有办法让 ubuntu 记住密码,这样就不用输入密码了?

答案1

使用描述的步骤解决了我的问题这个答案基本上,这样做:

ssh-keygen -t rsa -P ""
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh localhost

然后

start-dfs.sh

不会要求输入密码。

答案2

我还会尝试以下操作(如果您有 hdfs 用户):

sudo -u hdfs start-dfs.sh  service-name

这样,您只需输入一次密码,但后续调用应该被缓存。

答案3

一个想法是在后台启动进程,将其 stdout(stderr?)重定向到一个文件,并让脚本等待并循环监视该文件。每当进程打印密码提示时,脚本都会通过其 stdin 将密码输入到进程中。

实现这一点其实很棘手。您可以使用两个脚本,一个用于监视输出并输入密码,另一个用于首先启动它们,应用必要的重定向。

因此启动器脚本是:

#!/bin/bash
TEMP_FILE=/tmp/hapboon.stdout
start-dfs.sh  <(./feed-passwords.py "$TEMP_FILE")  > "$TEMP_FILE"

无论出于什么原因,我将使用 Python 来完成另一个:

#!/usr/bin/python3
PASSWORD="""TYPE_YOUR_PASSWORD_HERE"""

from sys import argv
temp_file = argv[1]  # Raises exception if argument is missing

counter = 0
maximum = 3
previous_length = 0

while True:
    with open(temp_file) as f:
        output = f.read()
    if len(output) == previous_length:
        continue
    previous_length = len(output)
    last_line = output.strip().split('\n')[-1]
    if last_line.endswith(' password:'):
        print(PASSWORD)  # Our stdout goes to `start-dfs.sh`
        counter += 1
    if counter == maximum:
        break

我没有测试过这些。这种方法依赖的一个假设是,通过其标准输入接收密码的人是start-dfs.sh它自己,这很可能是不真实的。启动脚本通常只是调用其他进程,因此密码可能需要发送到其他进程的标准输入。

您可能需要修改start-dfs.sh脚本本身,并让其重定向接收密码的进程的标准输入。这也意味着我们的feed-passwords.py脚本必须每次将密码打印到相应的文件中,这可能意味着整个方法的架构将发生变化。

此外,虽然我们还没有做到这一点,但这个脚本还有一点不灵活;它只适用于预设数量的密码(由变量定义maximum)。可能需要对其进行修改,使其持续监视密码提示,直到经过一定的超时时间(例如 15 秒),从而适应任意数量的密码提示,而无需每次都更改数字。(如果需要,我可以帮你。)

另一个注意事项:如果您不想存储密码,只需将该PASSWORD=...行替换为:PASSWORD=input("Type your password: ")。这样,您每次启动脚本时只需输入一次密码,并且不会在任何地方存储您的密码。

相关内容