最近老是遇到小伙伴問一些hadoop的問題,在這里把一些hadoop常見的問題及解決方案分享給大數據初學者,如果再遇到同樣的問題就對號入座。
一、hadoop安裝完以后,在執行命令時,經常會提示一下警告:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
原因:
這個跟系統位數有關系,我們平常使用的是Centos 6.5 64位操作系統。
解決辦法:
(1)如果你是hadoop2.6的可以下載下面這個:
http://dl.bintray.com/sequenceiq/sequenceiq-bin/hadoop-native-64-2.6.0.tar
(2)下載完以后,解壓到hadoop的native目錄下,覆蓋原有文件即可。操作如下:
tar -x hadoop-native-64-2.4.0.tar -C hadoop/lib/native/
二、在使用combiner的時候,出現IntWritable is not Text,或者其他的類型不匹配問題
原因:這是設置combiner的時候,map輸出的keyvalue類型和combiner輸出的keyvalue類型不一致導致的。
解決:如果設置combiner,必須保證一點,map輸出的keyvalue類型和combiner輸出的keyvalue類型必須一致!!!
489034603
三、error:server IPC version 9 cannot communicate with client version 4
原因:
(1)如果是在使用插件操作hdfs時報錯,是因為,eclipse插件和eclipse的版本不匹配
(2)如果是在執行mapreduce時報錯:是因為jar包不匹配
解決:重新編譯hadoop插件,使用自己的hadoop和eclipse版本
四、Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
原因:在使用hadoop插件的時候,會在本地找winutils.exe這個文件,而這個文件是hadoop安裝包下的文件,必須配置eclipse插件的hadoop的windows本地路徑才行。
解決:配置windows的hadoop環境變量,并且重啟機器,讓環境變量生效
五、Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
原因:程序里面需要打開多個文件,進行分析,系統一般默認數量是1024,(用ulimit -a可以看到)對于正常使用是夠了,但是對于程序來講,就太少了。
解決:
修改2個文件。
/etc/security/limits.conf
vi /etc/security/limits.conf
加上:
* soft nofile 102400
* hard nofile 409600
$cd /etc/pam.d/
$sudo vi login
添加session required /lib/security/pam_limits.so
六、Too many fetch-failures
原因:出現這個問題主要是結點間的連通不夠全面。
解決:
1) 檢查/etc/hosts,要求本機ip對應服務器名,要求要包含所有的服務器ip+服務器名
2) 檢查 .ssh/authorized_keys,要求包含所有服務器(包括其自身)的public key
七、處理速度特別的慢 出現map很快 但是reduce很慢 而且反復出現 reduce=0%
解決:修改 conf/hadoop-env.sh 中的export HADOOP_HEAPSIZE=4000
489034603
八、能夠啟動datanode,但無法訪問,也無法結束的錯誤
原因:可能原因很多,需要查看日志定位,可能的原因是namespaceId不一致
解決:
(1)刪除namenode的本地文件夾:${hadoop}/namedir/*
(2)刪除datanode的本地文件夾:${hadoop}/datadir/*
(3)重新格式化
(4)注意:刪除是個很危險的動作,不能確認的情況下不能刪除!!做好刪除的文件等通通備份!!
九java.io.IOException:Could not obtain block:blk_194219614024901469_1100 file=/user/hive/warehouse/src_20090724_log/src_20090724_log
原因:出現這種情況大多是結點斷了,沒有連接上。
解決:檢查datanode是否有宕機情況,恢復
十、java.lang.OutOfMemoryError: Java heap space
原因:出現這種異常,明顯是jvm內存不夠得原因,要修改所有的datanode的jvm內存大小。
解決:執行命令
Java -Xms1024m -Xmx4096m
一般jvm的最大內存使用應該為總內存大小的一半,我們使用的8G內存,所以設置為4096m,這一值可能依舊不是最優的值。
十一、單個node新加硬盤
原因:datanode的硬盤不夠用了
解決:(1)修改需要新加硬盤的node的dfs.data.dir,用逗號分隔新、舊文件目錄(2)重啟dfs
十二、hdfs的namenode內存飆升,不夠用
原因:可能是上傳了過多的小文件
解決:用命令合并HDFS小文件 hadoop fs -getmerge <src> <dest>
十三、hadoop OutOfMemoryError
解決:
<property>
<name>mapred.child.java.optsname>
<value>-Xmx800M -servervalue>
property>
With the right JVM size in your hadoop-site.xml , you will have to copy this
to all mapred nodes and restart the cluster.
或者:hadoop jar jarfile [main class] -D mapred.child.java.opts=-Xmx800M
十四、Hadoop name -format后Incompatible namespaceIDS 錯誤解決辦法
原因:是格式化namenode后會重新創建一個新的namespaceID,以至于和datanode上原有的不一致。
解決:
(1)刪除datanode dfs.data.dir目錄(默認為tmp/dfs/data)下的數據文件,
(2)hadoop namenode -format
(3)修改/home/hadoop/data/current/VERSION 文件,把namespaceID修成與namenode上相同即可(log錯誤里會有提示)
489034603
十五、namenode無法啟動,不報錯
原因:可能原因是:之前用root用戶啟動過,導致current文件夾的權限和所屬用戶更改了,需要更改回來
解決:current文件夾位于hadoop安裝目錄同級目錄的tmp/dfs/namesecondary
先寫到這里,篇幅太大怕通過不了,下次再補充完。如果小伙伴想要學習大數據架構師的技術,可以加下圖片下面的交流群,群里有很多學習視頻都可以下載,而且每天大數據架構師馬士兵老師都會在群里分享大數據的技術。。
【Hadoop大數據基礎】
第二節 Hadoop安裝與使用
2.1 Hadoop簡介
2.2 MR實現第一節作業
2.3 HDFS分布式存儲系統
2.4 單機安裝
2.5 分布式集群搭建
2.6 課后作業
2.1 Hadoop簡介
在文章的時候已經講解了Hadoop的簡介以及生態圈,有什么不懂的可以"出門右轉"
http://dwz.cn/4rdSdU
2.2 MR實現第一節作業
首先運行計算就要啟動mapreduce,我們剛剛才啟動了start-dfs.sh (HDFS文件系統),所以不能計算那么我們把mapreduce的程序也啟動起來。
啟動mapreduce命令
[root@localhost hadoop]# start-yarn.sh starting yarn daemons
starting resourcemanager, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/yarn-root-resourcemanager-localhost.localdomain.out
localhost: starting nodemanager, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/yarn-root-nodemanager-localhost.localdomain.out
啟動完成以后我們調用"jps"命令看是否真的啟動成功了28113 NodeManager28011 ResourceManager28442 Jps27137 NameNode27401 SecondaryNameNode27246 DataNode
可以很明顯的看到多出來兩個程序。
創建測試文件
創建一個測試的數據:
vi /opt/test/test.txt
麒麟
小張
張張
果哥
澤安
跨越
天天順利
澤安
祖淵
張張
2.2-01.jpg
將測試文件上傳到HDFS
首先我們要在HDFS上再創建兩個文件,一個 input(輸入) / ouput(輸出)的文件夾。
[root@localhost ~]# hdfs dfs -mkdir /input /ouput
16/10/26 04:30:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
將測試數據上傳到"input"文件夾
[root@localhost ~]# hdfs dfs -put /opt/test/test.txt /input16/10/26 04:33:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
查看是上傳成功
[root@localhost ~]# hdfs dfs -cat /input/test.txt16/10/26 04:34:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
麒麟
小張
張張
果哥
澤安
跨越
天天順利
澤安
祖淵
張張
調用Hadoop自帶的WordCount方法
[root@localhost ~]# hadoop jar /opt/hadoop/hadoop-2.6.0-cdh5.8.2/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.8.2.jar wordcount /input /ouput/test16/10/26 04:49:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable16/10/26 04:49:38 INFO client.RMProxy: Connecting to ResourceManager at localhost/127.0.0.1:803216/10/26 04:49:42 INFO input.FileInputFormat: Total input paths to process : 116/10/26 04:49:43 INFO mapreduce.JobSubmitter: number of splits:116/10/26 04:49:44 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1477471653063_000116/10/26 04:49:46 INFO impl.YarnClientImpl: Submitted application application_1477471653063_000116/10/26 04:49:47 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1477471653063_0001/16/10/26 04:49:47 INFO mapreduce.Job: Running job: job_1477471653063_000116/10/26 04:50:21 INFO mapreduce.Job: Job job_1477471653063_0001 running in uber mode : false16/10/26 04:50:21 INFO mapreduce.Job: map 0% reduce 0%16/10/26 04:50:44 INFO mapreduce.Job: map 100% reduce 0%16/10/26 04:51:04 INFO mapreduce.Job: map 100% reduce 100%16/10/26 04:51:06 INFO mapreduce.Job: Job job_1477471653063_0001 completed successfully16/10/26 04:51:06 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=116
FILE: Number of bytes written=232107
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=177
HDFS: Number of bytes written=78
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=18128
Total time spent by all reduces in occupied slots (ms)=17756
Total time spent by all map tasks (ms)=18128
Total time spent by all reduce tasks (ms)=17756
Total vcore-seconds taken by all map tasks=18128
Total vcore-seconds taken by all reduce tasks=17756
Total megabyte-seconds taken by all map tasks=18563072
Total megabyte-seconds taken by all reduce tasks=18182144
Map-Reduce Framework
Map input records=10
Map output records=10
Map output bytes=116
Map output materialized bytes=116
Input split bytes=101
Combine input records=10
Combine output records=8
Reduce input groups=8
Reduce shuffle bytes=116
Reduce input records=8
Reduce output records=8
Spilled Records=16
Shuffled Maps=1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=454
CPU time spent (ms)=3450
Physical memory (bytes) snapshot=306806784
Virtual memory (bytes) snapshot=3017633792
Total committed heap usage (bytes)=163450880
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=76
File Output Format Counters
Bytes Written=78運行完成我們看看計算出來的結果:
[root@localhost ~]# hdfs dfs -ls /ouput/test16/10/26 04:53:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 root supergroup 0 2016-10-26 04:51 /ouput/test/_SUCCESS
-rw-r--r-- 1 root supergroup 78 2016-10-26 04:51 /ouput/test/part-r-00000[root@localhost ~]# hdfs dfs -cat /ouput/test/part-r-0000016/10/26 04:53:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
天天順利 1小張 1張張 2果哥 1澤安 2祖淵 1跨越 1麒麟 1
2.3 HDFS分布式存儲系統
HDFS優點
高容錯性
數據自動保存多個副本
副本都時候會自動恢復
適合批量處理
移動計算而非數據
數據位置暴露給計算框架
適合大數據處理
GB/TB/甚至PB級數據
百萬規模以上文件數量
10k+
可構建廉價的機器上
不管機器人有多么的垃圾,只要有空間內存就可以搭建Hadoop
HDFS缺點
低延遲數據訪問
比如毫秒級
低延遲與高吞吐率
小文件存取
占用NameNode大量內存
尋道時間超過讀取時間
并發寫入/文件隨機修改
一個文件只能有一個寫者
只支持append
HDFS架構
2.3-01.jpg
如圖所示,HDFS是按照Master和Slave的結構
NameNode:類似項目經理職位 下達需求,監控團隊進度,工作分配。
管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
NameNode的主要功能:接受客戶端的讀寫服務。
上傳文件 讀取文件都要聯系NameNode
Namenode保存了metadate信息,而metadate保存著datanode的元數據 包含了block的位置信息(路徑),以及datanode的詳細信息。
Namenode的metadate信息啟動后會加載到內存,metadate存儲到磁盤的文件名;"fsimage",但是其中不包含Block的位置信息,而block的位置信息是在每一次Datanode啟動的時候將block的位置信息發送給NameNode 內存中。
**edits**記錄對metadate的操作日志。
SecondaryNameNode:類似經理助理的職位 分擔領導(Namenode)的工作量;
SecondaryNameNode他不是主節點也不是從節點,它是用來輔助NameNode來完成editslog操作日志的。
合并edits的操作可以配置:
設置fs.checkpoint.period 默認3600秒
設置edits log大小fs.checkpoint.size規定edits文件的最大默認64MB
NN合并流程
DataNode: 程序員干活的,上頭(NameNode)下達一個需求功能需要你(DataNode)實現。存儲client發來的數據塊block;執行數據塊的讀寫操作。
dataNode(block)它是數據存儲單元,就是數據真正存儲的地方。每一個block都會被固定大小的數
據塊,默認數據塊的大小是64MB**可配置**。
問:我這個文件大小沒有達到64MB怎么辦呢?
答:如果該文件還不到64MB的時候,則單獨成一個block
問:那如果大于64MB怎么辦?
答:如果大了就在切分一個block出來,就像我們切肉/切菜一樣,想把他們切的均衡(64MB),假如肉切的1厘米,到最后還剩下3厘米怎么辦?那就繼續再切分。
datanode設計思想
如圖所示
假如我上傳文件大小為"50G"-->切分為多個block。
每一個Block都會有一個3個副本(可配置)
每一個block的3個副本都存在不同的節點(機器)上,如圖"block1"。
HDFS寫流程
簡單易懂
1.HDFS Client-->NameNode:我要上次新文件2.NameNode檢查DataNode空間,檢查出: xxx機器上的節點可以存儲3.NameNode上傳4.記錄log日志
下面是專業術語
客戶端調用create()來創建文件
DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中創建一個新的文件。
元數據節點首先確定文件原來不存在,并且客戶端有創建文件的權限,然后創建新文件。
DistributedFileSystem返回DFSOutputStream,客戶端用于寫數據。
客戶端開始寫入數據,DFSOutputStream將數據分成塊,寫入data queue。Data queue由Data Streamer讀取,并通知元數據節點分配數據節點,用來存儲數據塊(每塊默認復制3塊)。分配的數據節點放在一個pipeline里。Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。
DFSOutputStream為發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。
如果數據節點在寫入的過程中失敗:
關閉pipeline,將ack queue中的數據塊放入data queue的開始。
當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啟后能夠察覺其數據塊是過時的,會被刪除。
失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。
元數據節點則被通知此數據塊是復制塊數不足,將來會再創建第三份備份。
當客戶端結束寫入數據,則調用stream的close函數。此操作將所有的數據塊寫入pipeline中的數據節點,并等待ack queue返回成功。最后通知元數據節點寫入完畢。
寫原理
讀文件
客戶端(client)用FileSystem的open()函數打開文件
DistributedFileSystem用RPC調用元數據節點,得到文件的數據塊信息。
對于每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。
DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據。
客戶端調用stream的read()函數開始讀取數據。
DFSInputStream連接保存此文件第一個數據塊的最近的數據節點。
Data從數據節點讀到客戶端(client)
當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。
當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。
在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。
失敗的數據節點將被記錄,以后不再連接。
讀原理
安全模式
Name啟動的時候,首先將映像文件(fsimage)載入內存,并執行編輯日志(edits)中的各項操作,一旦在內存中成功建立文件系統元數據映射,則創建一個新的fsimage文件(SecondaryNameNode)和一個空的(edits)編輯日志。
此刻Namenode運行"安全模式",即Namenode的文件系統對于客戶端來說是只讀的。(顯示目錄,顯示文件內容等。但是 增刪改都會失敗)。
2.4 單機安裝
系統環境
名稱 | 版本 | 下載 |
---|---|---|
linux | centos | 百度 |
jdk | 1.7 | 百度 |
hadoop | 2.6.0 | 百度 |
jdk安裝
下載地址百度即可,我使用的JDK版本是 1.7 ;
2.4-01.jpg
1.在linux創建一個文件夾放jdk
mkdir /usr/jvm2.將jdk移到剛剛創建的JVM文件夾下,也可以解壓到jvm文件夾下
我這里使用解壓
tar -zxvf /opt/hadoop/tar/jdk-7u79-linux-x64.tar.gz -C /usr/jvm/3.解壓完成以后配置JDK環境變量 /etc/profile
使用命令:
vi /etc/profile
2.4-02.jpg
將↓↓↓↓加在profile中
export JAVA_HOME=/usr/jvm/jdk1.7.0_79 export JAVA_BIN=/usr/jvm/jdk1.7.0_79/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#PATH
PATH=$PATH:$JAVA_HOME/bin
2.4-03.jpg
==在linux配置中有hadoop在這里先不要管==
4.到這里jdk配置已經完成了,我們需要刷新一下剛剛修改的profile。否則我們改改新配置的參數是無法生效的。
[root@zero230 tar]# source /etc/profile5.調用命令查看是否配置成功并且查看版本是否與我們配置的一致
2.4-04.jpg
[root@zero230 tar]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)到這里JDK已經安裝完成!
SSH免驗證
$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
配置Hadoop
一.Hadoop-env.sh
Hadoop也是需要java的,所以我們需要配置(hadoop-env.sh)它調用的java。
vi hadoop-env.sh它默認的配置是:export JAVA_HOME=${JAVA_HOME}。這樣的話必須定義變量才能啟動JAVA,所以我們需要將(hadoop-env.sh)里面的JAVA_HOME變量指定的內容改成我們的JAVA安裝的絕對路徑,我JDK安裝的路徑在"/usr/bin/java"目錄下。export JAVA_HOME=/usr/bin/java
二.core-site.xml
我們需要配置兩個參數 defaultFS(HDFS默認名稱)
//配置HDFS名稱
hdfs:協議頭,如:http https 等
localhost:主機名
9000:端口<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value></property>
三.hdfs-site.xml
replication(副本個數 默認為3個),因為我這里搭建的是單機所以只要一個。
replication:設置的副本個數<property>
<name>dfs.replication</name>
<value>1</value></property>
四.mapred-site.xml
==注意:mapred.site.xml開始并不存在,而是mapred-site.xml.template。我們需要使用cp命令一份命名為mapred.site.xml==
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value></property>
五.yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value></property><property> <name>yarn.resourcemanager.address</name> <value>localhost:8032</value></property>
格式化HDFS
1. $ bin/hdfs namenode -format
格式化NameNode,不需要每次啟動都需要格式化,機器第一次啟動的時候需要格式化一次16/10/26 03:30:03 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]16/10/26 03:30:03 INFO namenode.NameNode: createNameNode [-format]16/10/26 03:30:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Formatting using clusterid: CID-2eba6061-bea3-4e86-85cc-ebb1b51cf73016/10/26 03:30:05 INFO namenode.FSNamesystem: No KeyProvider found.16/10/26 03:30:05 INFO namenode.FSNamesystem: fsLock is fair:true16/10/26 03:30:06 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=100016/10/26 03:30:06 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true16/10/26 03:30:06 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.00016/10/26 03:30:06 INFO blockmanagement.BlockManager: The block deletion will start around 2016 Oct 26 03:30:0616/10/26 03:30:06 INFO util.GSet: Computing capacity for map BlocksMap16/10/26 03:30:06 INFO util.GSet: VM type=64-bit16/10/26 03:30:06 INFO util.GSet: 2.0% max memory 966.7 MB=19.3 MB16/10/26 03:30:06 INFO util.GSet: capacity=2^21=2097152 entries16/10/26 03:30:06 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false16/10/26 03:30:06 INFO blockmanagement.BlockManager: defaultReplication=116/10/26 03:30:06 INFO blockmanagement.BlockManager: maxReplication=51216/10/26 03:30:06 INFO blockmanagement.BlockManager: minReplication=116/10/26 03:30:06 INFO blockmanagement.BlockManager: maxReplicationStreams=216/10/26 03:30:06 INFO blockmanagement.BlockManager: replicationRecheckInterval=300016/10/26 03:30:06 INFO blockmanagement.BlockManager: encryptDataTransfer=false16/10/26 03:30:06 INFO blockmanagement.BlockManager: maxNumBlocksToLog=100016/10/26 03:30:06 INFO namenode.FSNamesystem: fsOwner=root (auth:SIMPLE)16/10/26 03:30:06 INFO namenode.FSNamesystem: supergroup=supergroup16/10/26 03:30:06 INFO namenode.FSNamesystem: isPermissionEnabled=true16/10/26 03:30:06 INFO namenode.FSNamesystem: HA Enabled: false16/10/26 03:30:06 INFO namenode.FSNamesystem: Append Enabled: true16/10/26 03:30:06 INFO util.GSet: Computing capacity for map INodeMap16/10/26 03:30:06 INFO util.GSet: VM type=64-bit16/10/26 03:30:06 INFO util.GSet: 1.0% max memory 966.7 MB=9.7 MB16/10/26 03:30:06 INFO util.GSet: capacity=2^20=1048576 entries16/10/26 03:30:06 INFO namenode.NameNode: Caching file names occuring more than 10 times16/10/26 03:30:06 INFO util.GSet: Computing capacity for map cachedBlocks16/10/26 03:30:06 INFO util.GSet: VM type=64-bit16/10/26 03:30:06 INFO util.GSet: 0.25% max memory 966.7 MB=2.4 MB16/10/26 03:30:06 INFO util.GSet: capacity=2^18=262144 entries16/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct=0.999000012874603316/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes=016/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension=3000016/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.window.num.buckets=1016/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.num.users=1016/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.windows.minutes=1,5,2516/10/26 03:30:06 INFO namenode.FSNamesystem: Retry cache on namenode is enabled16/10/26 03:30:06 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis16/10/26 03:30:06 INFO util.GSet: Computing capacity for map NameNodeRetryCache16/10/26 03:30:06 INFO util.GSet: VM type=64-bit16/10/26 03:30:06 INFO util.GSet: 0.029999999329447746% max memory 966.7 MB=297.0 KB16/10/26 03:30:06 INFO util.GSet: capacity=2^15=32768 entries16/10/26 03:30:06 INFO namenode.NNConf: ACLs enabled? false16/10/26 03:30:06 INFO namenode.NNConf: XAttrs enabled? true16/10/26 03:30:06 INFO namenode.NNConf: Maximum size of an xattr: 1638416/10/26 03:30:06 INFO namenode.FSImage: Allocated new BlockPoolId: BP-857467713-127.0.0.1-147746700675416/10/26 03:30:06 INFO common.Storage: Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted.16/10/26 03:30:07 INFO namenode.FSImageFormatProtobuf: Saving image file /tmp/hadoop-root/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression16/10/26 03:30:07 INFO namenode.FSImageFormatProtobuf: Image file /tmp/hadoop-root/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 351 bytes saved in 0 seconds.16/10/26 03:30:07 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >=016/10/26 03:30:07 INFO util.ExitUtil: Exiting with status 016/10/26 03:30:07 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1
************************************************************/[root@localhost hadoop-2.6.0-cdh5.8.2]#
格式化
截取后半部分,這樣就表示格式化完成
2. sbin/start-dfs.sh
啟動HDFS(NameNode,secondarynamenode,DataNode)
[root@localhost hadoop]# start-dfs.sh
16/10/26 03:57:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicableStarting namenodes on [localhost]
localhost: starting namenode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-namenode-localhost.localdomain.outlocalhost: starting datanode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-datanode-localhost.localdomain.outStarting secondary namenodes [0.0.0.0]0.0.0.0: starting secondarynamenode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-secondarynamenode-localhost.localdomain.out16/10/26 03:58:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2.4-06.jpg
啟動完成以后我們調用"jps"命令看是否真的啟動成功了
[root@localhost hadoop]# jps28442 Jps27137 NameNode27401 SecondaryNameNode27246 DataNode
Web瀏覽HDFS文件
到這一步我們可以通過ip地址訪問HDFS文件系統。
[root@localhost hadoop]# ifconfig
inet **172.19.4.239** netmask 255.255.255.0 broadcast 172.19.4.255
inet6 fe80::250:56ff:fe8d:1144 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:8d:11:44 txqueuelen 1000 (Ethernet)
RX packets 1638661 bytes 777256881 (741.2 MiB)
RX errors 0 dropped 8125 overruns 0 frame 0
TX packets 333206 bytes 24964212 (23.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0我這里的地址為 172.19.4.239 那么外部訪問的地址是:http://172.19.4.239:50070(默認的端口號)/就可以訪問。
2.4-07.jpg
命令操作HDFS文件
我們講到了配置-->啟動,現在我們來講講對HDFS文件系統的操作,操作HDFS 在linux中的命令:
[root@localhost hadoop]# hdfs dfs
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
Generic options supported are
-conf <configuration file> specify an application configuration file
-D <property=value> use value for given property
-fs <local|namenode:port> specify a namenode
-jt <local|resourcemanager:port> specify a ResourceManager
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives> specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
**建立一個文件夾**
[root@localhost hadoop]# hdfs dfs -mkdir /user
16/10/26 04:10:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
**查看是否創建成功**
[root@localhost hadoop]# hdfs dfs -ls /
16/10/26 04:12:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x - root supergroup 0 2016-10-26 04:10 /user
簡單命令就講到這里以后會更單獨講解HDFS
2.5 分布式集群搭建
系統環境
名稱 | 版本 | 下載地址 |
---|---|---|
centos | 7 | 百度 |
JDK | 7 | 百度 |
hadoop | CDH 2.6.0 | 下載地址 |
zero230 | 172.19.4.230 | |
zero231 | 172.19.4.231 | |
zero239 | 172.19.4.239 |
安裝JDK
下載地址百度即可,我使用的JDK版本是 1.7 ;
2.5-01.jpg
1.在linux創建一個文件夾放jdk
mkdir /usr/jvm2.將jdk移到剛剛創建的JVM文件夾下,也可以解壓到jvm文件夾下
我這里使用解壓
tar -zxvf /opt/hadoop/tar/jdk-7u79-linux-x64.tar.gz -C /usr/jvm/3.解壓完成以后配置JDK環境變量 /etc/profile
使用命令:
vi /etc/profile
2.5-02.jpg
將↓↓↓↓加在profile中
export JAVA_HOME=/usr/jvm/jdk1.7.0_79 export JAVA_BIN=/usr/jvm/jdk1.7.0_79/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#PATH
PATH=$PATH:$JAVA_HOME/bin
2.5-03.jpg
==在linux配置中有hadoop在這里先不要管==
4.到這里jdk配置已經完成了,我們需要刷新一下剛剛修改的profile。否則我們改改新配置的參數是無法生效的。
[root@zero230 tar]# source /etc/profile5.調用命令查看是否配置成功并且查看版本是否與我們配置的一致
2.5-04.jpg
[root@zero230 tar]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)到這里JDK已經安裝完成!
SSH互免驗證
1.在 zero230 zero231 zero239 機器上分別執行一下命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
執行完以后會獲得 id_dsa(私鑰) 和 id_dsa.pub(公鑰) 兩個文件2.在zero239 機器上執行該命令
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
意思就是將 公鑰 的內容追加到 authorized_keys 文件中。3.將 zero231/zero230 的 id_dsa.pub(公鑰)復制到zero239機器上
[root@zero230 ~]# scp -r ~/.ssh/id_dsa.pub root@zero239:~/.ssh/230.pub
[root@zero231 ~]# scp -r ~/.ssh/id_dsa.pub root@zero239:~/.ssh/231.pub
**注意:**在這里復制到zero239機器上必須重新命令否則會將 zero239 的給覆蓋。4.將 230 231 機器上的 id_dsa.pub 復制到 239機器上了將他們追加到 "authorized_keys" 文件中。
[root@zero239 ~]# cat ~/.ssh/23*.pub >> ~/.ssh/authorized_keys
2.5-05.jpg
5.將239機器上已經添加了 230/231機器的公鑰"authorized_keys"文件復制到230和231機器上
scp -r ~/.ssh/authorized_keys root@zero230:~/.ssh/
scp -r ~/.ssh/authorized_keys root@zero231:~/.ssh/
中有提示(yes/no),選擇yes6.測試SSH是否互通
ssh zero230
回車即可,如果需要輸入密碼請檢查是否配置正確
[root@zero239 ~]# ssh zero230
Last login: Thu Oct 27 14:56:54 2016 from a-bg-519.ztequantum.com
[root@zero230 ~]# exit
配置hadoop
1.將hadoop安裝包復制到230 231 239 三臺機器上
使用命令Scp
2.解壓到/opt/hadoop(解壓到那個目錄下看自己,但一定要記得在哪個目錄下)文件夾下,建議*三臺機器上的hadoop存放的位置相同*
tar zxvf /opt/hadoop/tar/hadoop-2.6.0-cdh5.8.2.tar.gz -C /opt/hadoop/3.修改配置文件
首先我們要做分布式的Hadoop,那么配置一定需要將他們連串起來,否則怎么可以相互傳遞數據呢?
一.core-site.xml
參數|說明
----|----
fs.defaultFS|Namenode 定義,HDFS Url訪問地址
io.file.buffer.size|設置緩存的大小
二.hdfs-site.xml
參數 | 說明 |
---|---|
dfs.namenode.name.dir | Namenode 存儲的磁盤路徑 |
dfs.datanode.data.dir | DataNode 存儲的磁盤路徑 |
dfs.blocksize | block的大小設置 |
dfs.replication | 節點數量設置,默認為3個。這里230 231 239三個節點,這里可以設置也可以不設置。 |
三.mapred-site.xml
參數 | 說明 |
---|---|
mapreduce.framwork.name | mapreduce.framework.name屬性為yarn-tez,就可以替換默認的MR框架為tez引擎。就是管理yarn |
四.yarn-site.xml
參數 | 說明 |
---|---|
yarn.resourcemanager.hostname | resourcemanager 啟動在那臺機器上 |
五.slaves
將 zero239 zero230 zero231 主機名添加進去
2.5-06.jpg
4.配置修改完成以后將它復制分配到各個節點上\
scp -r /opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/* root@zero230:/opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/
scp -r /opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/* root@zero231:/opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/5.格式化hdfs
hdfs namenode -format
2.5-07.jpg
6.啟動hadoop
方法一: start-dfs.sh 然后 yarn-start.sh
方法二:start-all.sh
2.5-08.jpg
7.查看進程是否全部啟動使用命令:JPS 239機器:
[root@zero239 hadoop-2.6.0-cdh5.8.2]# jps
7518 NodeManager
6813 NameNode 7874 Jps 5292 DataNode 7113 SecondaryNameNode 7404 ResourceManager 230機器:
[root@zero230 ~]# jps
5690 Jps 5545 NodeManager 5692 DataNode 231機器
[root@zero231 ~]# jps
3855 NodeManager 3631 DataNode 4082 Jps
到這一步說明分布式集群搭建完成。
錯誤記錄
[root@localhost ~]# hadoop jar /opt/hadoop/hadoop-2.6.0-cdh5.8.2/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.8.2.jar wordcount /input /ouput16/10/26 04:40:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable16/10/26 04:40:33 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:803216/10/26 04:40:34 WARN security.UserGroupInformation: PriviledgedActionException as:root (auth:SIMPLE) cause:java.net.ConnectException: Call From localhost.localdomain/127.0.0.1 to localhost:9001 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefusedjava.net.ConnectException: Call From localhost.localdomain/127.0.0.1 to localhost:9001 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:791)
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:731)
at org.apache.hadoop.ipc.Client.call(Client.java:1475)
at org.apache.hadoop.ipc.Client.call(Client.java:1408)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:762)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:256)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2121)
at org.apache.hadoop.hdfs.DistributedFileSystem.doCall(DistributedFileSystem.java:1215)
at org.apache.hadoop.hdfs.DistributedFileSystem.doCall(DistributedFileSystem.java:1211)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1211)
at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1412)
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:145)
at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:270)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:143)
at org.apache.hadoop.mapreduce.Job.run(Job.java:1307)
at org.apache.hadoop.mapreduce.Job.run(Job.java:1304)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1304)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1325)
at org.apache.hadoop.examples.WordCount.main(WordCount.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:530)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:494)
at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:614)
at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:713)
at org.apache.hadoop.ipc.Client$Connection.access00(Client.java:375)
at org.apache.hadoop.ipc.Client.getConnection(Client.java:1524)
at org.apache.hadoop.ipc.Client.call(Client.java:1447)
... 41 more[root@localhost ~]#
問題:沒有關閉防火墻
service iptables stop 關閉
chkconfig iptables off 永久關閉
2.6 課后作業
搭建一個3個節點的Hadoop分布式環境
用MR的方式實現第一課的作業,對文本進行統計,輸出統計結果到HDFS
更多課程可以關注
【微信公眾號】小張網校
公眾號內有微信群,掃描加入后更多大牛交流學習