徹底分佈式安裝hadoop集羣

0、安裝jdkjava

一、配置hosts文件node

二、創建hadoop運行帳號linux

三、配置ssh免密碼登陸web

四、在namenode上配置hadoop算法

    4.一、修改hadoop-env.sh文件shell

    4.二、修改yarn-env.sh文件apache

    4.三、修改core-site.xml文件vim

    4.四、修改hdfs-site.xml文件瀏覽器

    4.五、修改mapred-site.xml文件安全

    4.六、修改yarn-site.xml文件

五、配置masters和slaves文件

六、向各節點複製hadoop

七、格式化namenode

八、啓動hadoop

九、用jps檢驗各後臺進程是否成功啓動

十、啓動yarn

十一、啓動歷史服務器

十二、測試wordcount程序

附:SSH原理

 

安裝jdk

//將jdk解壓到software目錄下

tar -xzvf jdk-7u79-linux-x64.tar.gz -C ../software/

//配置jdk的環境變量

[wangqi@node000 ~]$ cd ~

[wangqi@node000 ~]$ ls -al

total 36

drwx------. 4 wangqi wangqi 4096 Dec 21 10:48 .

drwxr-xr-x. 9 root root 4096 Dec 21 09:53 ..

-rw-------. 1 wangqi wangqi 18 Dec 21 09:58 .bash_history

-rw-r--r--. 1 wangqi wangqi 18 Feb 22 2013 .bash_logout

-rw-r--r--. 1 wangqi wangqi 176 Feb 22 2013 .bash_profile

-rw-r--r--. 1 wangqi wangqi 124 Feb 22 2013 .bashrc

drwxrwxr-x. 2 wangqi wangqi 4096 Dec 21 10:39 download

drwxrwxr-x. 3 wangqi wangqi 4096 Dec 21 10:42 software

-rw-------. 1 wangqi wangqi 689 Dec 21 10:48 .viminfo

//在.bash_profile中添加用戶環境變量

[wangqi@node000 ~]$ vim .bash_profile

JAVA_HOME=/home/wangqi/software/jdk1.7.0_79

PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/db.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH

//使環境變量生效

[wangqi@node000 ~]$ source .bash_profile

//驗證jdk是否安裝成功

[wangqi@node000 ~]$ javac -version

javac 1.7.0_79

配置hosts文件

全部的節點都須要/etc/hosts文件,使彼此之間都能把主機名解析爲對應ip。

[wangqi@node000 software]$ sudo vim /etc/hosts

10.254.201.200 node000

10.254.201.201 node001

10.254.201.202 node002

這裏咱們有三臺機器,須要在每臺機器的hosts文件中配置主機名和對應的ip,使其能夠相互訪問。

創建hadoop運行帳號

爲了安全起見,最好在各個機器上創建專門用於hadoop開發的帳號。

[root@node001 home]# useradd wangqi

[root@node001 home]# passwd wangqi

Changing password for user wangqi.

New password:

BAD PASSWORD: it is too short

BAD PASSWORD: is too simple

Retype new password:

passwd: all authentication tokens updated successfully.

ssh配置

在每臺機器上都生成公鑰私鑰。

[wangqi@node000 ~]$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/wangqi/.ssh/id_rsa):

Created directory '/home/wangqi/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /home/wangqi/.ssh/id_rsa.

Your public key has been saved in /home/wangqi/.ssh/id_rsa.pub.

The key fingerprint is:

e3:ca:fb:16:15:6b:c1:90:ab:af:5f:b2:1e:65:e5:ab wangqi@node000

The key's randomart image is:

+--[ RSA 2048]----+

| .+ |

| . + |

| . +. |

| . +o |

| .Soo . |

| ...+ . |

| .+.. . |

| . .o= . |

| =B= E |

+-----------------+

而後把公鑰放到受權key中。

[wangqi@node000 ~]$ cd .ssh

[wangqi@node000 .ssh]$ ls

id_rsa id_rsa.pub

[wangqi@node000 .ssh]$ cp id_rsa.pub authrized_keys

[wangqi@node000 .ssh]$ ls

authrized_keys id_rsa id_rsa.pub

最後把各個幾點的authorized_keys的內容互相拷貝到對方的此文件中,這樣就能夠免密碼彼此ssh登陸。

在namenode上配置hadoop

1)修改hadoop-env.sh文件

[wangqi@node000 ~]$ cd software/hadoop-2.6.0/etc/hadoop/

取消JAVA_HOME註釋並作以下修改:

export JAVA_HOME=/home/wangqi/software/jdk1.7.0_79

保存退出。

注:不一樣版本的hadoop的配置文件所在的位置可能不同。

2)修改yarn-env.sh文件

vim etc/hadoop/yarn-env.sh

export JAVA_HOME=/home/wangqi/software/jdk1.7.0_79

3)修改core-site.xml文件

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://node000:10000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:///home/wangqi/software/hadoop-2.6.0/tmp</value>
        </property>
</configuration>

注:

一、fs.default.name表示namenode的IP地址和監聽端口。namenode與datanode之間的通訊就是經過該端口來完成的。

二、hadoop.tmp.dir 表示hadoop的臨時文件存儲目錄

三、hadoop.tmp.dir中指定的tmp文件夾不用本身建立,格式化namenode時會自動建立

4)修改hdfs-site.xml文件

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node000:40090</value>
        <description>namenode get the newest fsimage via 
dfs.secondary.http-address</description>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>node000:40070</value>
        <description>secondary get fsimage and edits via 
dfs.namenode.http-address</description>
    </property>
    <property>
        <name> dfs.namenode.name.dir </name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/name</value>
        <description>the place where store the namenode</description>
    </property>
    <property>
        <name> dfs.datanode.data.dir </name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/data</value>
        <description>the place where store the datanode</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

注:

一、dfs.namenode.secondary.http-address表示輔助名稱節點http服務的地址和端口。

二、dfs.namenode.http-address表示名稱節點web ui監聽地址和端口。

三、dfs.namenode.name.dir表示名稱節點所使用的元數據的保存路徑。

四、dfs.datanode.data.dir表示數據節點存儲數據塊的路徑,能夠寫多塊硬盤,逗號分隔。把這些位置分散在每一個節點上的全部磁盤上能夠實現磁盤I/O平衡,會顯著改進磁盤I/O性能。

五、dfs.replication表示hdfs數據塊的複製份數,默認3,理論上份數越多跑數速度越快,可是須要的存儲空間也更多。由於咱們如今是僞分佈式,即只有一個節點,所以只能複製一份。

說明:

一、路徑應該寫成file://的格式。

二、這裏配置的dfs.namenode.secondary.http-address和dfs.namenode.http-address都有默認配置,我是由於機器上有其餘人已經部署了hadoop,爲了防止端口被佔用,所以顯示指定了。

三、dfs.namenode.name.dir和dfs.datanode.data.dir咱們顯示指定時,須要保證其中hdfs這一級目錄已經建立(name和data這一級目錄不用建立,格式化namenode時會自動建立name目錄,啓動dfs時會自動建立data目錄)。

5)修改mapred-site.xml文件

<configuration>
<property>
          <name>mapreduce.framework.name</name>
         <value>yarn</value>
</property>
<property>
         <name>mapreduce.jobtracker.address</name>
           <value>node000:60040</value>
        </property>
<property>
                <name>mapreduce.jobtracker.http.address</name>
                <value>node000:60030</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>node000:60020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>node000:60888</value>
        </property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>           <value>/tmp/hadoop-yarn/staging</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.done-dir</name>
                <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
        </property>
</configuration>

注:

一、mapreduce.framework.name表示執行mapreduce任務時的運行時框架。

二、mapreduce.jobtracker.address表示jobtracker的ip地址和端口號

二、mapreduce.jobtracker.http.address表示jobtracker的http服務的ip地址和端口號。

三、mapreduce.jobhistory.address表示MapReduce JobHistory服務器進程間通訊(IPC)的主機和端口號。

四、mapreduce.jobhistory.webapp.address表示MapReduce JobHistory服務器Web UI 的主機和端口號。

五、yarn.app.mapreduce.am.staging-dir表示提交的job的暫存目錄。

六、mapreduce.jobhistory.done-dir表示在什麼目錄下存放已經運行完的Hadoop做業記錄。

七、mapreduce.jobhistory.intermediate-done-dir表示在什麼目錄下存放正在運行的Hadoop做業記錄。

6)修改yarn-site.xml文件

<configuration>
        <property>
               <name>yarn.nodemanager.aux-services</name>
               <value>mapreduce_shuffle</value>
        </property>
        <property>                                                                
           <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
               <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
        <property>
               <name>yarn.resourcemanager.address</name>
               <value>node001:9032</value>
       </property>
       <property>
               <name>yarn.resourcemanager.scheduler.address</name>
               <value>node001:9030</value>
       </property>
       <property>
            <name>yarn.resourcemanager.resource-tracker.address</name>
             <value>node001:9031</value>
      </property>
      <property>
              <name>yarn.resourcemanager.admin.address</name>
               <value>node001:9033</value>
       </property>
       <property>
               <name> yarn.resourcemanager.webapp.address </name>
               <value>node001:9088</value>
       </property>
</configuration>

注:

一、yarn.resourcemanager.webapp.address表示RM web應用的http地址和端口。

修改masters和slaves文件

[wangqi@node000 sbin]$ vim ~/software/hadoop-2.6.0/etc/hadoop/masters

node000

[wangqi@node000 sbin]$ vim ~/software/hadoop-2.6.0/etc/hadoop/slaves

node001

node002

注:

一、masters文件中指定的是secondary namenode的主機名,不是namenode

將配置好的hadoop發送到從節點

[wangqi@node000 sbin]$ scp -r ~/software/hadoop-2.6.0/

wangqi@10.254.201.201:~/software/

[wangqi@node000 sbin]$ scp -r ~/software/hadoop-2.6.0/

wangqi@10.254.201.202:~/software/

另外,由於我這邊的機器上,其餘人已經部署了hadoop,爲了防止端口被佔用,還須要修改各從節點中的hdfs-site.xml文件。(若是機器上沒有其餘人部署了hadoop,則省略這步操做)

1)修改從節點201中的hdfs-site.xml文件

將從節點201的hdfs-site.xml文件修改以下:

[wangqi@node001 software]$ vim hadoop-2.6.0/etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node000:40090</value>
        <description>namenode get the newest fsimage via 
dfs.secondary.http-address</description>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>node000:40070</value>
        <description>secondary get fsimage and edits via 
dfs.namenode.http-address</description>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/name</value>
        <description>the place where store the namenode</description>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/data</value>
        <description>the place where store the datanode</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.datanode.address</name>
        <value>node001:60010</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>node001:60075</value>
    </property>
    <property>
        <name>dfs.datanode.ipc.address</name>
        <value>node001:60020</value>
    </property>
</configuration>

注:

一、dfs.datanode.address表示數據節點傳輸數據時的地址和端口。

二、dfs.datanode.http.address表示數據節點http服務的地址和端口。

三、dfs.datanode.ipc.address表示數據節點IPC(進程間通訊)服務地址和端口。

2)修改從節點202中的hdfs-site.xml文件

對從節點202中hdfs-site.xml文件的修改和上面同樣,只是把node001修改爲了node002,以下:

<configuration>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>node000:40090</value>
        <description>namenode get the newest fsimage via 
dfs.secondary.http-address</description>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>node000:40070</value>
        <description>secondary get fsimage and edits via 
dfs.namenode.http-address</description>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/name</value>
        <description>the place where store the namenode</description>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>file:///home/wangqi/software/hadoop-2.6.0/hdfs/data</value>
        <description>the place where store the datanode</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.datanode.address</name>
        <value>node002:60010</value>
    </property>
    <property>
        <name>dfs.datanode.http.address</name>
        <value>node002:60075</value>
    </property>
    <property>
        <name>dfs.datanode.ipc.address</name>
        <value>node002:60020</value>
    </property>
</configuration>

格式化分佈式文件系統

[wangqi@node000 bin]$ ./hadoop namenode -format

或者

[wangqi@node000 bin]$ ./hdfs namenode -format

15/12/28 12:12:06 INFO common.Storage: Storage directory

/home/wangqi/software/hadoop-2.6.0/hdfs/name has been successfully formatted.

15/12/28 12:12:06 INFO namenode.NNStorageRetentionManager: Going to retain 1 images

with txid >= 0

15/12/28 12:12:06 INFO util.ExitUtil: Exiting with status 0

15/12/28 12:12:06 INFO namenode.NameNode: SHUTDOWN_MSG:

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at node001/10.254.201.201

************************************************************/

啓動hdfs

[wangqi@node000 sbin]$ ./start-dfs.sh

15/12/25 15:51:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Starting namenodes on [node000]

node000: starting namenode, logging to

/home/wangqi/software/hadoop-2.6.0/logs/hadoop-wangqi-namenode-node000.out

node001: starting datanode, logging to

/home/wangqi/software/hadoop-2.6.0/logs/hadoop-wangqi-datanode-node001.out

node002: starting datanode, logging to

/home/wangqi/software/hadoop-2.6.0/logs/hadoop-wangqi-datanode-node002.out

Starting secondary namenodes [node000]

node000: starting secondarynamenode, logging to

/home/wangqi/software/hadoop-2.6.0/logs/hadoop-wangqi-secondarynamenode-node000.out

15/12/25 15:51:23 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

檢測守護進程啓動狀況

[wangqi@node000 sbin]$ jps

100266 Jps

99858 NameNode

100092 SecondaryNameNode

[wangqi@node001 software]$ jps

39666 DataNode

39759 Jps

[wangqi@node002 software]$ jps

239950 Jps

239858 DataNode

啓動yarn

[wangqi@node000 sbin]$ start-yarn.sh

starting yarn daemons

starting resourcemanager, logging to

/home/wangqi/software/hadoop-2.6.0/logs/yarn-wangqi-resourcemanager-node000.out

node001: starting nodemanager, logging to

/home/wangqi/software/hadoop-2.6.0/logs/yarn-wangqi-nodemanager-node001.out

node002: starting nodemanager, logging to

/home/wangqi/software/hadoop-2.6.0/logs/yarn-wangqi-nodemanager-node002.out

[wangqi@node000 sbin]$ jps

11901 ResourceManager

12176 Jps

11437 NameNode

11663 SecondaryNameNode

[wangqi@node001 hadoop-2.6.0]$ jps

5520 Jps

5166 DataNode

5323 NodeManager

此時hadoop集羣已所有部署完成。

在瀏覽器中輸入:http://10.254.201.201:9088/,結果以下:

啓動歷史服務器

[wangqi@node001 sbin]$ mr-jobhistory-daemon.sh start historyserver

starting historyserver, logging to

/home/wangqi/software/hadoop-2.6.0/logs/mapred-wangqi-historyserver-node001.out

測試WordCount程序

一、在hdfs上建立input目錄

[wangqi@node001 input]$ hdfs dfs -mkdir -p /user/wangqi/in

[wangqi@node001 input]$ hdfs dfs -ls -R /

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user/wangqi

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user/wangqi/in

注:必定要建立成/user/wangqi/in(其中wangqi是建立的用戶),由於後面執行mapreduce任務時,會在user/wangqi目錄下找in目錄,不然會報錯:

Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://node001:10000/user/wangqi/input

二、在本機上建立input目錄,並寫入兩個文件

[wangqi@node001 ~]$ mkdir input

[wangqi@node001 input]$ echo "hello world" > test1.txt

[wangqi@node001 input]$ echo "hello hadoop" > test2.txt

[wangqi@node001 input]$ cat test1.txt

hello world

[wangqi@node001 input]$ cat test2.txt

hello hadoop

三、將文件上傳到hadoop的input目錄下

[wangqi@node001 input]$ hdfs dfs -put ./* /user/wangqi/in/

[wangqi@node001 input]$ hdfs dfs -ls -R /

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user/wangqi

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:17 /user/wangqi/in

-rw-r--r-- 2 wangqi supergroup 12 2015-12-28 16:17 /user/wangqi/in/test1.txt

-rw-r--r-- 2 wangqi supergroup 13 2015-12-28 16:17 /user/wangqi/in/test2.txt

四、運行示例程序WordCount

[wangqi@node001 input]$ hadoop jar /home/wangqi/software/hadoop-2.6.0/share/hadoop/mapreduce/sources/hadoop-mapreduce-exampls-2.6.0-sources.jar org.apache.hadoop.examples.WordCount in out

15/12/28 16:18:39 INFO client.RMProxy: Connecting to ResourceManager at

node001/10.254.201.201:9032

15/12/28 16:18:40 INFO input.FileInputFormat: Total input paths to process : 2

15/12/28 16:18:40 INFO mapreduce.JobSubmitter: number of splits:2

15/12/28 16:18:40 INFO mapreduce.JobSubmitter: Submitting tokens for job:

job_1451286103870_0007

15/12/28 16:18:40 INFO impl.YarnClientImpl: Submitted application

application_1451286103870_0007

15/12/28 16:18:40 INFO mapreduce.Job: The url to track the job:

http://node001:9088/proxy/application_1451286103870_0007/

15/12/28 16:18:40 INFO mapreduce.Job: Running job: job_1451286103870_0007

15/12/28 16:18:47 INFO mapreduce.Job: Job job_1451286103870_0007 running in uber

mode : false

15/12/28 16:18:47 INFO mapreduce.Job: map 0% reduce 0%

15/12/28 16:18:53 INFO mapreduce.Job: map 100% reduce 0%

15/12/28 16:18:59 INFO mapreduce.Job: map 100% reduce 100%

15/12/28 16:18:59 INFO mapreduce.Job: Job job_1451286103870_0007 completed

successfully

15/12/28 16:19:00 INFO mapreduce.Job: Counters: 49

File System Counters

FILE: Number of bytes read=55

FILE: Number of bytes written=317236

FILE: Number of read operations=0

FILE: Number of large read operations=0

FILE: Number of write operations=0

HDFS: Number of bytes read=245

HDFS: Number of bytes written=25

HDFS: Number of read operations=9

HDFS: Number of large read operations=0

HDFS: Number of write operations=2

Job Counters

Launched map tasks=2

Launched reduce tasks=1

Data-local map tasks=2

Total time spent by all maps in occupied slots (ms)=7461

Total time spent by all reduces in occupied slots (ms)=3882

Total time spent by all map tasks (ms)=7461

Total time spent by all reduce tasks (ms)=3882

Total vcore-seconds taken by all map tasks=7461

Total vcore-seconds taken by all reduce tasks=3882

Total megabyte-seconds taken by all map tasks=7640064

Total megabyte-seconds taken by all reduce tasks=3975168

Map-Reduce Framework

Map input records=2

Map output records=4

Map output bytes=41

Map output materialized bytes=61

Input split bytes=220

Combine input records=4

Combine output records=4

Reduce input groups=3

Reduce shuffle bytes=61

Reduce input records=4

Reduce output records=3

Spilled Records=8

Shuffled Maps =2

Failed Shuffles=0

Merged Map outputs=2

GC time elapsed (ms)=94

CPU time spent (ms)=3510

Physical memory (bytes) snapshot=698580992

Virtual memory (bytes) snapshot=2897805312

Total committed heap usage (bytes)=603979776

Shuffle Errors

BAD_ID=0

CONNECTION=0

IO_ERROR=0

WRONG_LENGTH=0

WRONG_MAP=0

WRONG_REDUCE=0

File Input Format Counters

Bytes Read=25

File Output Format Counters

Bytes Written=25

五、查看結果

[wangqi@node001 input]$ hdfs dfs -ls -R /

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:14 /user

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:18 /user/wangqi

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:17 /user/wangqi/in

-rw-r--r-- 2 wangqi supergroup 12 2015-12-28 16:17 /user/wangqi/in/test1.txt

-rw-r--r-- 2 wangqi supergroup 13 2015-12-28 16:17 /user/wangqi/in/test2.txt

drwxr-xr-x - wangqi supergroup 0 2015-12-28 16:18 /user/wangqi/out

-rw-r--r-- 2 wangqi supergroup 0 2015-12-28 16:18

/user/wangqi/out/_SUCCESS

-rw-r--r-- 2 wangqi supergroup 25 2015-12-28 16:18

/user/wangqi/out/part-r-00000

[wangqi@node001 input]$ hdfs dfs -cat /user/wangqi/out/part-r-00000

hadoop 1

hello 2

world 1

異常處理

Got exception: org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container.

This token is expired. current time is 1451316339594 found 1451288164469

Note: System times on machines may be out of sync. Check system time and time zones.

這是由於datanode與namenode之間未設置時間同步,因此引發該異常。解決方案是將多個datanode與namenode進行時間同步,即在每一個服務器上執行ntpdate time.nist.gov命令,以下:

[wangqi@node002 ~]$ sudo ntpdate time.nist.gov

附:SSH原理

爲了更好的理解SSH免密碼登陸原理,咱們先來講說SSH的安全驗證,SSH採用的是」非對稱密鑰系統」,即耳熟能詳的公鑰私鑰加密系統,其安全驗證又分爲兩種級別。

1. 基於口令的安全驗證

這種方式使用用戶名密碼進行聯機登陸,通常狀況下咱們使用的都是這種方式。整個過程大體以下:

(1)客戶端發起鏈接請求。

(2)遠程主機收到用戶的登陸請求,把本身的公鑰發給客戶端。

(3)客戶端接收遠程主機的公鑰,而後使用遠程主機的公鑰加密登陸密碼,發送給遠程主機。

(4)遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。

在linux上,若是你是第一次登陸對方主機,系統會出現下面的提示:

The authenticity of host '10.254.201.202 (10.254.201.202)' can't be established.

RSA key fingerprint is a6:fb:54:f6:ae:54:dd:c3:23:12:c8:2d:ca:d6:3f:12.

這段話的意思是,沒法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續鏈接嗎?

所謂"公鑰指紋",是指公鑰長度較長(這裏採用RSA算法,長達1024位),很難比對,因此對其進行MD5計算,將它變成一個128位的指紋再進行比較,就容易多了,上例中的是a6:fb:54:f6:ae:54:dd:c3:23:12:c8:2d:ca:d6:3f:12。

很天然的一個問題就是,用戶怎麼知道遠程主機的公鑰指紋應該是多少?回答是沒有好辦法,遠程主機必須在本身的網站上貼出公鑰指紋,以便用戶自行覈對。

假定通過風險衡量之後,用戶決定接受這個遠程主機的公鑰。

Are you sure you want to continue connecting (yes/no)? yes

系統會出現一句提示,表示10.254.201.202主機已經獲得承認。

Warning: Permanently added '10.254.201.202' (RSA) to the list of known hosts.

而後,會要求輸入密碼。

wangqi@10.254.201.202's password:

若是密碼正確,就能夠登陸了。

當遠程主機的公鑰被接受之後,它就會被保存在文件$HOME/.ssh/known_hosts之中。下次再鏈接這臺主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。

每一個SSH用戶都有本身的known_hosts文件,分別在本身的$HOME目錄下,此外操做系統也有一個這樣的文件,一般是/etc/ssh/ssh_known_hosts,保存一些對全部用戶均可信賴的遠程主機的公鑰。

注:當網絡中有另外一臺冒牌服務器冒充遠程主機時,客戶端的鏈接請求被服務器B攔截,服務器B將本身的公鑰發送給客戶端,客戶端就會將密碼加密後發送給冒牌服務器,冒牌服務器就能夠拿本身的私鑰獲取到密碼,而後隨心所欲。所以當第一次連接遠程主機時,在上述步驟的第(3)步中,會提示您當前遠程主機的」公鑰指紋」,以確認遠程主機是不是正版的遠程主機,若是選擇繼續後就能夠輸入密碼進行登陸了,當遠程的主機接受之後,該臺服務器的公鑰就會保存到 ~/.ssh/known_hosts文件中。

2. 基於公鑰的安全驗證

使用密碼登陸,每次都必須輸入密碼,很是麻煩。好在SSH還提供了公鑰登陸,能夠省去輸入密碼的步驟。

所謂"公鑰登陸",原理很簡單,就是用戶將本身的公鑰儲存在遠程主機上。登陸的時候,遠程主機會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸shell,再也不要求輸入密碼,這和以前的ssh帳號密碼也沒有直接關係。

這種方法要求用戶必須提供本身的公鑰。若是沒有現成的,能夠直接用ssh-keygen生成一個:

$ ssh-keygen

運行上面的命令之後,系統會出現一系列提示,能夠一路回車。其中有一個問題是,要不要對私鑰設置口令(passphrase),若是擔憂私鑰的安全,這裏能夠設置一個。

運行結束之後,在$HOME/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。前者是你的公鑰,後者是你的私鑰。

這時再輸入下面的命令,將公鑰傳送到遠程主機host上面:

scp id_rsa.pub wangqi@10.254.201.202:~/

好了,今後你再登陸遠程主機,就不須要輸入密碼了。

若是仍是不行,就打開遠程主機的/etc/ssh/sshd_config這個文件,檢查下面幾行前面"#"註釋是否取掉。

RSAAuthentication yes

PubkeyAuthentication yes #是否容許使用公鑰驗證方式登陸

AuthorizedKeysFile .ssh/authorized_keys #容許登陸的主機的公鑰存放文件,默認爲用#戶家目錄下的.ssh/authorized_keys

而後,重啓遠程主機的ssh服務。

3.關於authorized_keys文件

遠程主機將用戶的公鑰,保存在登陸後的用戶主目錄的$HOME/.ssh/authorized_keys文件中。公鑰就是一段字符串,只要把它追加在authorized_keys文件的末尾就好了。

若是不使用上面的ssh-copy-id命令,改用下面的命令也能夠:

# scp -P 22 id_rsa.pub root@192.168.1.77:/root/.ssh/authorized_keys

root@192.168.1.77's password: <-- 輸入機器Server的root用戶密碼

id_rsa.pub 100% 218 0.2KB/s 00:00

若是遠程主機的authorized_keys文件已經存在,也能夠往裏添加公鑰:

先將公鑰文件上傳到遠程主機中,

#scp -P 22 ~/.ssh/id_rsa.pub root@192.168.1.91:/root/

SSH到登錄到遠程主機,將公鑰追加到 authorized_keys 文件中

cat /root/id_rsa.pub >> /root/.ssh/authorized_keys

或直接運行命令:

cat ~/.ssh/id_dsa.pub|ssh -p 22 root@192.168.1.91 `cat - >> ~/.ssh/authorized_keys`

寫入authorized_keys文件後,公鑰登陸的設置就完成了。

 

Hadoop須要使用SSH協議,namenode將使用SSH協議啓動namenode和datanode進程。以namenode到datanode爲例子:Namenode做爲客戶端,要實現無密碼公鑰認證,鏈接到服務端datanode上時,須要在namenode上生成一個密鑰對,包括一個公鑰和一個私鑰,然後將公鑰複製到datanode上。當namenode經過ssh鏈接datanode時,datanode就會生成一個隨機數併發送給namenode。namenode收到隨機數以後再用私鑰進行加密,並將加密數回傳給datanode,datanode用公鑰解密成功後就容許namenode進行鏈接了。這就是一個公鑰認證過程,其間不須要用戶手工輸入密碼。重要過程是將客戶端namenode公鑰複製到datanode上。

相關文章
相關標籤/搜索