web-dev-qa-db-ja.com

疑似分散モードでHadoopを起動するときにパスワードを入力しないでください

これらのことを学ぶために、ラップトップ上で擬似分散モードでHadoopを実行しています。

manual で説明されているように設定しています。

Hadoopを起動しても問題ありませんが、起動プロセスは不便です。ものを起動するために、次のことを参照してください。

start-dfs.sh

次に、パスワードを3回要求されます(私の場合、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にそのパスワードを記憶させて、まったく入力する必要がないようにする方法はありますか?

4
user2413

this S.O. answer で説明されている手順を使用して問題を解決しました。基本的に、以下を行います:

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

それから

start-dfs.sh

パスワードを要求しません。

2
user2413

また、次のことも試してみます(hdfsユーザーがいる場合)。

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

この方法では、パスワードを1回入力しますが、その後の呼び出しはキャッシュする必要があります。

2
devrimbaris

1つのアイデアは、プロセスをバックグラウンドで起動し、その標準出力(stderr?)をファイルにリダイレクトし、スクリプトを待機させてそのファイルをループで監視させることです。プロセスがパスワードプロンプトを出力するたびに、スクリプトはそのstdinを介してパスワードをプロセスにフィードします。

これを実現するのは実際には注意が必要です。 2つのスクリプトを使用できます。1つは出力の監視とパスワードの入力用で、もう1つは最初に起動して必要なリダイレクトを適用するためのものです。

ランチャースクリプトは次のとおりです。

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

何らかの理由で、もう1つに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

私はこれをテストしていません。このアプローチが依存している前提の1つは、stdinを介してパスワードを受信するのはstart-dfs.sh自体であり、これは誤りである可能性が非常に高いことです。多くの場合、起動スクリプトは他のプロセスを呼び出すだけなので、他のプロセスの標準入力にパスワードを送信する必要があります。

start-dfs.shスクリプト自体をいじって、パスワードを受け取るプロセスの標準入力をリダイレクトする必要があるかもしれません。これはまた、feed-passwords.pyスクリプトが毎回適切なファイルにパスワードを印刷する必要があることを意味します。これは、おそらくアプローチ全体のアーキテクチャが変更されることを意味します。

また、まだそこにいませんが、このスクリプトに関するもう1つのことは柔軟性がありません。事前に設定された数のパスワード(maximum変数で定義)でのみ機能します。特定のタイムアウト(たとえば、15秒)が経過するまでパスワードプロンプトを監視し続けるように変更することが望ましい場合があります。したがって、毎回番号を変更する必要なく、任意の数のパスワードプロンプトに対応します。 (必要な場合に私はあなたを助けることができます。)

別の注意:パスワードを保存したくない場合は、PASSWORD=...行をPASSWORD=input("Type your password: ")に置き換えてください。これにより、スクリプトを起動するたびに1回だけパスワードが入力され、パスワードはどこにも保存されません。

0
Yamaho