引言
? 哇屁擅,好久沒更新偿凭,最近工作太忙了。記得上次我們簡單了解了一下Hadoop的HDFS嗎煤蹭?今天我們就來簡單的搭建一下笔喉,非常簡單,帶大家一起深入看看硝皂。本次使用的是虛擬機VM14版本常挚、系統(tǒng)CentOS7 、Hadoop為3.X
稽物。
PS:Hadoop版本不一樣奄毡,做法可能有差異!
至于如何安裝贝或,大家可以在網(wǎng)上自行查找吼过,我認為比較有參考價值的我就粘出來:
1、 https://blog.csdn.net/babyxue/article/details/80970526【VMware安裝Centos7超詳細過程(圖文)】
2咪奖、 https://blog.csdn.net/u010476739/article/details/86647585 【centos7.6安裝配置hadoop-3.2.0筆記(單機安裝盗忱、偽分布式安裝)】
3、 https://blog.csdn.net/jimuka_liu/article/details/82784313【centos安裝hadoop超級詳細沒有之一】
兄弟們羊赵,只能幫你們到這里了
這里就簡單總結(jié)一下趟佃,安裝hadoop的注意點:
【單機、偽分布式】
- 把虛擬機的網(wǎng)絡(luò)設(shè)置好(我使用的是NAT)
- 下載并上傳
hadoop3.X
和jdk1.8
(可下可不下)安裝包到你的虛擬機 - 獲權(quán)root
- 裝好centOS必要的插件 如
rsync
- 關(guān)閉防火墻昧捷,并檢查你虛擬機內(nèi)是否存在jdk闲昭,若無請安裝、修改系統(tǒng)環(huán)境變量
- 安裝Hadoop靡挥,記得要在bin目錄下執(zhí)行指令(你懂的)——老手忽略這一點
- 運行偽分布式要記得合理修改配置xml文件序矩,注意ip地址,注意能否ssh免密碼登錄
- 修改完任何配置文件后跋破,都要進行格式化
【集群】
- 網(wǎng)絡(luò)方面更需要設(shè)置好
- 創(chuàng)建多個hadoop用戶簸淀,同時記得賦root權(quán)
- hosts設(shè)置好節(jié)點
- 在每臺機子設(shè)置好/etc/profile的Hadoop環(huán)境
? 這里不做過多解釋了,我在上手的過程中毒返,會出現(xiàn)很多小問題啃擦,供大家參考解決方案【求大家給出你們遇到的問題和更好的方案共享】
情況一
[hadoop@cenServer bin]$ ./hadoop version
ERROR: JAVA_HOME is not set and could not be found.
回答:明顯是你裝了java之后沒有配置環(huán)境變量,記得隨時java -version
檢查一下饿悬。
情況二
[hadoop@cenServer bin]$ ./hadoop version
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /opt/hadoop/hadoop-3.2.0/logs/fairscheduler-statedump.log (權(quán)限不夠)
回答:看到權(quán)限不夠
或者Permission denied
字樣令蛉,應(yīng)該懂得使用sudo
塞?什么?不想輸入密碼珠叔?參考
https://blog.csdn.net/Z0157/article/details/82079252 【Liunx:sudo命令不在重復(fù)輸入password蝎宇,和不再每次都輸入sudo】
情況三
[hadoop@cenServer hadoop-3.2.0]$ bin/hdfs namenode -format
ERROR: Unable to write in /opt/hadoop/hadoop-3.2.0/logs. Aborting.
回答:要么你還是sudo
,要么你就chmod -R 777 /opt/hadoop/hadoop-3.2.0/logs
給他賦權(quán)唄
情況四
Starting namenodes on [192.xxx.xxx.134]
上一次登錄:五 5月 31 10:34:23 CST 2019pts/4 上
192.168.114.134: ssh: connect to host 192.168.114.134 port 22: Connection timed out
Starting datanodes
上一次登錄:五 5月 31 10:36:23 CST 2019pts/4 上
Starting secondary namenodes [cenServer]
上一次登錄:五 5月 31 10:36:34 CST 2019pts/4 上
cenServer: ssh: Could not resolve hostname censerver: Name or service not known
回答:假如在啟動hadoop出現(xiàn)以上的情況祷安,首先可以去logs去查日志姥芥,其次就是查看/etc/hosts
內(nèi)有無設(shè)置好ip地址,如上不認識censerver汇鞭,就需要把censerver給一個localhost凉唐,要設(shè)置自己正確的ip窩。
情況五
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -put input input_test
2019-06-03 10:13:33,439 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
put: Cannot create directory /user/root/input_test/input. Name node is in safe mode.
回答:看見Name node is in safe mode.
字樣霍骄,肯定讓其離開安全模式台囱,即可輸入hadoop dfsadmin -safemode leave
指令。
情況六
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
回答:由于可能存在依賴包版本過低读整,看到這種提示簿训,一可以選擇忽略,二是可以先排除64位與32位的問題米间,其次就是查看glibc 版本和輸入hadoop checknative -a
指令查看是否出現(xiàn)false字樣强品。
解決方案參考:
https://blog.csdn.net/u010003835/article/details/81127984 【1】
開擼,首先成功啟動Hadoop的時候屈糊,我們不難發(fā)現(xiàn)一些關(guān)鍵詞出現(xiàn)在上一篇介紹hdfs的文章的榛,
[root@cenServer hadoop-3.2.0]# sbin/start-dfs.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [cenServer]
上一次登錄:五 5月 31 10:44:00 CST 2019pts/4 上
cenServer: Warning: Permanently added 'censerver,192.xxx.xxx.130' (ECDSA) to the list of known hosts.
Starting datanodes
上一次登錄:五 5月 31 11:09:48 CST 2019pts/4 上
Starting secondary namenodes [cenServer]
上一次登錄:五 5月 31 11:09:51 CST 2019pts/4 上
namenodes、datanodes還有secondary namenodes的進程啟動逻锐,你甚至可以輸入jps
去查看這些進程是否啟動夫晌。
為了不同于鏈接中的例子,整一個demo演示一波hadoop-mapreduce-examples-3.2.0.jar這個包的作用谦去,以此簡單介紹一下map-reduce慷丽。
首先當(dāng)然是創(chuàng)建目錄
[root@cenServer hadoop-3.2.0]# mkdir input
[root@cenServer hadoop-3.2.0]# cd input/
再創(chuàng)建兩份文件蹦哼,分別輸入內(nèi)容hello world
和hello hadoop
[root@cenServer input]# touch fileA.txt;echo "hello world" >> fileA.txt
[root@cenServer input]# touch fileB.txt;echo "hello hadoop" >> fileB.txt
將input目錄上傳到hadoop上命名為input_test鳄哭,并查看
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -put input input_test
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -ls
Found 1 items
drwxr-xr-x - root supergroup 0 2019-05-31 17:26 input_test
運行map-reduce包的wordcount功能,待運行完畢后會生成output文件夾
[root@cenServer hadoop-3.2.0]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.0.jar wordcount input_test output
運行成功的話纲熏,打開output文件夾里面的part-r-00000 的文件內(nèi)容
[root@cenServer hadoop-3.2.0]# bin/hdfs dfs -cat output/part-r-00000
hadoop 1
hello 2
world 1
表面上的確是單詞統(tǒng)計的功能妆丘,我們先反編譯這個jar包看看源碼:
加上官方文檔的解釋
MapReduce - 用戶界面
本節(jié)提供了MapReduce框架的每個面向用戶方面的合理數(shù)量的詳細信息。這應(yīng)該有助于用戶以細粒度的方式實現(xiàn)局劲,配置和調(diào)整他們的工作勺拣。但請注意,每個類/接口的javadoc仍然是最全面的文檔; 這只是一個教程鱼填。
我們先來看看
Mapper
和Reducer
接口药有。應(yīng)用程序通常會實現(xiàn)它們以提供map
和reduce
方法。然后我們將討論其他核心接口,包括
Job
愤惰,Partitioner
苇经,InputFormat
,OutputFormat
等宦言。最后扇单,我們將討論框架的一些有用功能,如
DistributedCache
奠旺,IsolationRunner
等蜘澜。Mapper
Mapper將key/value對映射到一組中間key/value對。
Maps是將輸入記錄轉(zhuǎn)換為中間記錄的各個任務(wù)响疚。轉(zhuǎn)換后的中間記錄不需要與輸入記錄的類型相同鄙信。給定的輸入對可以映射到零個或多個輸出對。
Hadoop MapReduce框架為作業(yè)的
InputFormat
生成的每個InputSplit
生成一個map任務(wù)稽寒。``總的來說扮碧,Mapper實現(xiàn)通過Job.setMapperClass(Class)方法傳遞給作業(yè)。然后杏糙,框架為該任務(wù)的
InputSplit
中的每個鍵/值對調(diào)用map(WritableComparable慎王,Writable,Context)宏侍。然后赖淤,應(yīng)用程序可以覆蓋清理(Context)
方法以執(zhí)行任何所需的清理。````輸出對不需要與輸入對具有相同的類型谅河。給定的輸入對可以映射到零個或多個輸出對咱旱。通過調(diào)用context.write(WritableComparable,Writable)來收集輸出對绷耍。
應(yīng)用程序可以使用
Counter
報告其統(tǒng)計信息吐限。隨后將與給定輸出鍵關(guān)聯(lián)的所有中間值按框架分組,并傳遞給
Reducer
以確定最終輸出褂始。用戶可以通過Job.setGroupingComparatorClass(Class)指定Comparator
來控制分組诸典。對
Mapper
輸出進行排序,然后根據(jù)Reducer
進行分區(qū)崎苗。分區(qū)總數(shù)與作業(yè)的reduce任務(wù)數(shù)相同狐粱。用戶可以通過實現(xiàn)自定義分區(qū)程序
來控制哪些鍵(以及記錄)轉(zhuǎn)到哪個Reducer
。``用戶可以選擇通過Job.setCombinerClass(Class)指定
組合器
胆数,以執(zhí)行中間輸出的本地聚合肌蜻,這有助于減少從Mapper
傳輸?shù)?code>Reducer的數(shù)據(jù)量。````中間排序的輸出始終以簡單(key-len必尼,key蒋搜,value-len,value)格式存儲。應(yīng)用程序可以控制是否以及如何壓縮中間輸出豆挽,以及通過
配置
使用CompressionCodec酸休。``有多少Map?
Maps的數(shù)量通常由輸入的總大小驅(qū)動祷杈,即輸入文件的塊總數(shù)斑司。
Maps的正確并行度似乎是每個節(jié)點大約10-100個maps,盡管已經(jīng)為非常cpu-light地圖任務(wù)設(shè)置了300個maps但汞。任務(wù)設(shè)置需要一段時間宿刮,因此最好是maps至少需要一分鐘才能執(zhí)行。
因此私蕾,如果您期望10TB的輸入數(shù)據(jù)并且塊大小為
128MB
僵缺,那么除非使用Configuration.set(MRJobConfig.NUM_MAPS
,int)(僅提供框架提示)來設(shè)置82,000個映射踩叭,否則將使用它來設(shè)置它甚至更高磕潮。Reducer
Reducer減少了一組中間值,這些中間值與一組較小的值共享一個鍵容贝。
作業(yè)的減少次數(shù)由用戶通過Job.setNumReduceTasks(int)設(shè)置自脯。
總的來說,
Reducer
實現(xiàn)通過Job.setReducerClass(Class)方法傳遞Job
的作業(yè)斤富,并且可以覆蓋它以初始化它們自己膏潮。然后,框架為分組輸入中的每個<key满力,(list of values)>
對調(diào)用reduce(WritableComparable焕参,Iterable ,Context)方法油额。然后叠纷,應(yīng)用程序可以覆蓋清理(Context)
方法以執(zhí)行任何所需的清理。````
Reducer
有3個主要階段:shuffle潦嘶,sort和reduce涩嚣。
為了更好的解釋其作用,我還有以下的圖片作為參考
? 由于時間關(guān)系衬以,在這里也不能大篇幅給你們講解缓艳,希望在之后的文章中校摩,以更好的形式(或者分析部分源碼)讓大家了解到Map-Reduce看峻,大家也可以只知道他有助于用戶以細粒度的方式實現(xiàn)、配置和調(diào)整他們的工作的作用就好了衙吩。