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上。