引用:http://www.reibang.com/p/575b912a4781
Hadoop允跑、HBase、Hive搪柑、Spark分布式系統(tǒng)架構(gòu),本文通過全套部署方法來讓大家深入系統(tǒng)內(nèi)部以充分理解分布式系統(tǒng)架構(gòu)和他們之間的關(guān)系索烹。
機器學(xué)習(xí)工碾、數(shù)據(jù)挖掘等各種大數(shù)據(jù)處理都離不開各種開源分布式系統(tǒng),hadoop用戶分布式存儲和map-reduce計算百姓,spark用于分布式機器學(xué)習(xí)渊额,hive是分布式數(shù)據(jù)庫,hbase是分布式kv系統(tǒng)垒拢,看似互不相關(guān)的他們卻都是基于相同的hdfs存儲和yarn資源管理旬迹,本文通過全套部署方法來讓大家深入系統(tǒng)內(nèi)部以充分理解分布式系統(tǒng)架構(gòu)和他們之間的關(guān)系
本文結(jié)構(gòu)
首先,我們來分別部署一套hadoop求类、hbase奔垦、hive、spark尸疆,在講解部署方法過程中會特殊說明一些重要配置椿猎,以及一些架構(gòu)圖以幫我們理解,目的是為后面講解系統(tǒng)架構(gòu)和關(guān)系打基礎(chǔ)寿弱。
之后犯眠,我們會通過運行一些程序來分析一下這些系統(tǒng)的功能
最后,我們會總結(jié)這些系統(tǒng)之間的關(guān)系
分布式hadoop部署
首先症革,在 http://hadoop.apache.org/releases.html 找到最新穩(wěn)定版tar包筐咧,我選擇的是
http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz
下載到 /data/apache 并解壓
在真正部署之前,我們先了解一下 hadoop 的架構(gòu)
hadoop分為幾大部分:yarn負(fù)責(zé)資源和任務(wù)管理噪矛、hdfs負(fù)責(zé)分布式存儲量蕊、map-reduce負(fù)責(zé)分布式計算
先來了解一下yarn的架構(gòu):
yarn的兩個部分:資源管理、任務(wù)調(diào)度摩疑。
資源管理需要一個全局的ResourceManager(RM)和分布在每臺機器上的NodeManager協(xié)同工作危融,RM負(fù)責(zé)資源的仲裁,NodeManager負(fù)責(zé)每個節(jié)點的資源監(jiān)控雷袋、狀態(tài)匯報和Container的管理
任務(wù)調(diào)度也需要ResourceManager負(fù)責(zé)任務(wù)的接受和調(diào)度吉殃,在任務(wù)調(diào)度中辞居,在Container中啟動的ApplicationMaster(AM)負(fù)責(zé)這個任務(wù)的管理,當(dāng)任務(wù)需要資源時蛋勺,會向RM申請瓦灶,分配到的Container用來起任務(wù),然后AM和這些Container做通信抱完,AM和具體執(zhí)行的任務(wù)都是在Container中執(zhí)行的
yarn區(qū)別于第一代hadoop的部署(namenode贼陶、jobtracker、tasktracker)
然后再看一下hdfs的架構(gòu):hdfs部分由NameNode巧娱、SecondaryNameNode和DataNode組成碉怔。DataNode是真正的在每個存儲節(jié)點上管理數(shù)據(jù)的模塊,NameNode是對全局?jǐn)?shù)據(jù)的名字信息做管理的模塊禁添,SecondaryNameNode是它的從節(jié)點撮胧,以防掛掉。
最后再說map-reduce:Map-reduce依賴于yarn和hdfs老翘,另外還有一個JobHistoryServer用來看任務(wù)運行歷史
hadoop雖然有多個模塊分別部署芹啥,但是所需要的程序都在同一個tar包中,所以不同模塊用到的配置文件都在一起铺峭,讓我們來看幾個最重要的配置文件:
各種默認(rèn)配置:core-default.xml, hdfs-default.xml, yarn-default.xml, mapred-default.xml
各種web頁面配置:core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml
從這些配置文件也可以看出hadoop的幾大部分是分開配置的墓怀。
除上面這些之外還有一些重要的配置:hadoop-env.sh、mapred-env.sh卫键、yarn-env.sh傀履,他們用來配置程序運行時的java虛擬機參數(shù)以及一些二進制、配置永罚、日志等的目錄配置
下面我們真正的來修改必須修改的配置文件啤呼。
修改etc/hadoop/core-site.xml,把配置改成:
1.
2.
3. fs.defaultFS
4. hdfs://127.0.0.1:8000
5.
6.
7. io.file.buffer.size
8. 131072
9.
10.
這里面配置的是hdfs的文件系統(tǒng)地址:本機的9001端口
修改etc/hadoop/hdfs-site.xml呢袱,把配置改成:
1.
2.
3. dfs.namenode.name.dir
4. file:/data/apache/dfs/name
5.
6.
7. dfs.datanode.data.dir
8. file:/data/apache/dfs/data
9.
10.
11. dfs.datanode.fsdataset.volume.choosing.policy
12. org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy 13.
14.
15. dfs.namenode.http-address
16. 127.0.0.1:50070
17.
18.
19. dfs.namenode.secondary.http-address
20. 127.0.0.1:8001
21.
22.
這里面配置的是hdfs文件存儲在本地的哪里以及secondary namenode的地址
修改etc/hadoop/yarn-site.xml官扣,把配置改成:
1.
2.
3. yarn.resourcemanager.hostname
4. 127.0.0.1
5.
6. ?7. yarn.resourcemanager.webapp.address
8. 127.0.0.1:8088
9.
10.
11. yarn.nodemanager.aux-services
12. mapreduce_shuffle
13.
14.
15. yarn.nodemanager.aux-services.mapreduce.shuffle.class
16. org.apache.hadoop.mapred.ShuffleHandler
17.
18.
19. yarn.log-aggregation-enable
20. true
21.
22.
23. yarn.log-aggregation.retain-seconds
24. 864000
25.
26.
27. yarn.log-aggregation.retain-check-interval-seconds
28. 86400
29.
30.
31. yarn.nodemanager.remote-app-log-dir
32. /YarnApp/Logs
33.
34.
35. yarn.log.server.url
36. http://127.0.0.1:19888/jobhistory/logs/
37.
38.
39. yarn.nodemanager.local-dirs
40. /data/apache/tmp/
41.
42.
43. yarn.scheduler.maximum-allocation-mb
44. 5000
45.
46.
47. yarn.scheduler.minimum-allocation-mb
48. 1024
49.
50.
51. yarn.nodemanager.vmem-pmem-ratio
52. 4.1
53.
54.
55. yarn.nodemanager.vmem-check-enabled
56. false
57.
58.
這里面配置的是yarn的日志地址以及一些參數(shù)配置
通過cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml創(chuàng)建etc/hadoop/mapred-site.xml,內(nèi)容改為如下:
1.
2.
3. mapreduce.framework.name
4. yarn
5. Execution framework set to Hadoop YARN.
6.
7.
8. yarn.app.mapreduce.am.staging-dir
9. /tmp/hadoop-yarn/staging
10.
11.
12. mapreduce.jobhistory.address
13. 127.0.0.1:10020
14.
15.
16. mapreduce.jobhistory.webapp.address
17. 127.0.0.1:19888
18.
19.
20. mapreduce.jobhistory.done-dir
21. ${yarn.app.mapreduce.am.staging-dir}/history/done
22.
23.
24.
25. mapreduce.jobhistory.intermediate-done-dir
26. ${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate
27.
28.
29. mapreduce.jobhistory.joblist.cache.size
30. 1000
31.
32.
33.
34. mapreduce.tasktracker.map.tasks.maximum
35. 8
36.
37.
38. mapreduce.tasktracker.reduce.tasks.maximum
39. 8
40.
41.
42. mapreduce.jobtracker.maxtasks.perjob 43. 5
44. The maximum number of tasks for a single job.
45. A value of -1 indicates that there is no maximum.
46.
47.
48.
這里面配置的是mapred的任務(wù)歷史相關(guān)配置
如果你的hadoop部署在多臺機器羞福,那么需要修改etc/hadoop/slaves惕蹄,把其他slave機器ip加到里面,如果只部署在這一臺治专,那么就留一個localhost即可
下面我們啟動hadoop卖陵,啟動之前我們配置好必要的環(huán)境變量:
1.export JAVA_HOME="你的java安裝地址"
先啟動hdfs,在此之前要格式化分布式文件系統(tǒng)张峰,執(zhí)行:
1../bin/hdfs namenode -format myclustername
如果格式化正忱崮瑁可以看到/data/apache/dfs下生成了name目錄
然后啟動namenode,執(zhí)行:
1../sbin/hadoop-daemon.sh --script hdfs start namenode
如果正常啟動喘批,可以看到啟動了相應(yīng)的進程撩荣,并且logs目錄下生成了相應(yīng)的日志
然后啟動datanode铣揉,執(zhí)行:
1../sbin/hadoop-daemon.sh --script hdfs start datanode
如果考慮啟動secondary namenode,可以用同樣的方法啟動
下面我們啟動yarn餐曹,先啟動resourcemanager逛拱,執(zhí)行:
1../sbin/yarn-daemon.sh start resourcemanager
如果正常啟動,可以看到啟動了相應(yīng)的進程台猴,并且logs目錄下生成了相應(yīng)的日志
然后啟動nodemanager朽合,執(zhí)行:
1../sbin/yarn-daemon.sh start nodemanager
如果正常啟動,可以看到啟動了相應(yīng)的進程饱狂,并且logs目錄下生成了相應(yīng)的日志
然后啟動MapReduce JobHistory Server曹步,執(zhí)行:
1../sbin/mr-jobhistory-daemon.sh start historyserver
如果正常啟動,可以看到啟動了相應(yīng)的進程休讳,并且logs目錄下生成了相應(yīng)的日志
下面我們看下web界面
打開 http://127.0.0.1:8088/cluster看下yarn管理的集群資源情況(因為在yarn-site.xml中我們配置了yarn.resourcemanager.webapp.address是127.0.0.1:8088)
打開 http://127.0.0.1:19888/jobhistory看下map-reduce任務(wù)的執(zhí)行歷史情況(因為在mapred-site.xml中我們配置了mapreduce.jobhistory.webapp.address是127.0.0.1:19888)
打開 http://127.0.0.1:50070/dfshealth.html 看下namenode的存儲系統(tǒng)情況(因為在hdfs-site.xml中我們配置了dfs.namenode.http-address是127.0.0.1:50070)
到此為止我們對hadoop的部署完成箭窜。下面試驗一下hadoop的功能
先驗證一下hdfs分布式文件系統(tǒng),執(zhí)行以下命令看是否有輸出:
1.[root@MYAY hadoop]# ./bin/hadoop fs -mkdir /input 2.[root@MYAY hadoop]# cat data 3.1 4.2 5.3 6.4 7.[root@MYAY hadoop]# ./bin/hadoop fs -put input /input 8.[root@MYAY hadoop]# ./bin/hadoop fs -ls /input 9.Found 1 items 10.-rw-r--r-- 3 root supergroup 8 2016-08-07 15:04 /input/data
這時通過 http://127.0.0.1:50070/dfshealth.html 可以看到存儲系統(tǒng)的一些變化
下面我們以input為輸入啟動一個mapreduce任務(wù)
1.[root@MYAY hadoop]# ./bin/hadoop jar ./share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar -input /input -output /output -mapper cat -reducer wc
之后看是否產(chǎn)生了/output的輸出:
1.[root@MYAY hadoop]# ./bin/hadoop fs -ls /output
2.Found 2 items
3.-rw-r--r-- 3 root supergroup 0 2016-08-07 15:11 /output/_SUCCESS
4.-rw-r--r-- 3 root supergroup 25 2016-08-07 15:11 /output/part-00000
5.[root@MYAY hadoop]# ./bin/hadoop fs -cat /output/part-00000
6. 4 4 12
這時通過 http://127.0.0.1:19888/jobhistory 可以看到mapreduce任務(wù)歷史:
也可以通過 http://127.0.0.1:8088/cluster 看到任務(wù)歷史
為什么兩處都有歷史呢?他們的區(qū)別是什么呢?
我們看到cluster顯示的其實是每一個application的歷史信息衍腥,他是yarn(ResourceManager)的管理頁面,也就是不管是mapreduce還是其他類似mapreduce這樣的任務(wù)纳猫,都會在這里顯示婆咸,mapreduce任務(wù)的Application Type是MAPREDUCE,其他任務(wù)的類型就是其他了芜辕,但是jobhistory是專門顯示mapreduce任務(wù)的
hbase的部署
首先從 http://www.apache.org/dyn/closer.cgi/hbase/ 下載穩(wěn)定版安裝包尚骄,我下的是https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-1.2.2-bin.tar.gz
解壓后修改conf/hbase-site.xml,改成:
1.
2.
3. hbase.cluster.distributed
4. true
5.
6.
7. hbase.rootdir
8. hdfs://127.0.0.1:8001/hbase
9.
10.
11. hbase.zookeeper.quorum
12. 127.0.0.1
13.
14.
其中hbase.rootdir配置的是hdfs地址侵续,ip:port要和hadoop/core-site.xml中的fs.defaultFS保持一致
其中hbase.zookeeper.quorum是zookeeper的地址倔丈,可以配多個,我們試驗用就先配一個
啟動hbase状蜗,執(zhí)行:
1../bin/start-hbase.sh
這時有可能會讓你輸入本地機器的密碼
啟動成功后可以看到幾個進程起來需五,包括zookeeper的HQuorumPeer和hbase的HMaster、HRegionServer
下面我們試驗一下hbase的使用轧坎,執(zhí)行:
1.hbase(main):001:0> status
2.1 active master, 0 backup masters, 1 servers, 0 dead, 3.0000 average load
創(chuàng)建一張表
1.hbase(main):004:0> create 'table1','field1' 2.0 row(s) in 1.3430 seconds 3. 4.=> Hbase::Table - table1
獲取一張表
1.hbase(main):005:0> t1 = get_table('table1') 2.0 row(s) in 0.0010 seconds 3. 4.=> Hbase::Table - table1
添加一行
1.hbase(main):008:0> t1.put 'row1', 'field1:qualifier1', 'value1' 2.0 row(s) in 0.4160 seconds
讀取全部
1.hbase(main):009:0> t1.scan
2.ROW COLUMN+CELL
3. row1 column=field1:qualifier1, timestamp=1470621285068, value=value1
4.1 row(s) in 0.1000 seconds
我們同時也看到hdfs中多出了hbase存儲的目錄:
1.[root@MYAY hbase]# ./hadoop/bin/hadoop fs -ls /hbase
2.Found 7 items
3.drwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/.tmp
4.drwxr-xr-x - root supergroup 0 2016-08-08 09:58 /hbase/MasterProcWALs
5.drwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/WALs
6.drwxr-xr-x - root supergroup 0 2016-08-08 09:05 /hbase/data
7.-rw-r--r-- 3 root supergroup 42 2016-08-08 09:05 /hbase/hbase.id
8.-rw-r--r-- 3 root supergroup 7 2016-08-08 09:05 /hbase/hbase.version
9.drwxr-xr-x - root supergroup 0 2016-08-08 09:24 /hbase/oldWALs
這說明hbase是以hdfs為存儲介質(zhì)的宏邮,因此它具有分布式存儲擁有的所有優(yōu)點
hbase的架構(gòu)如下:
其中HMaster負(fù)責(zé)管理HRegionServer以實現(xiàn)負(fù)載均衡,負(fù)責(zé)管理和分配HRegion(數(shù)據(jù)分片)缸血,還負(fù)責(zé)管理命名空間和table元數(shù)據(jù)蜜氨,以及權(quán)限控制
HRegionServer負(fù)責(zé)管理本地的HRegion、管理數(shù)據(jù)以及和hdfs交互捎泻。
Zookeeper負(fù)責(zé)集群的協(xié)調(diào)(如HMaster主從的failover)以及集群狀態(tài)信息的存儲
客戶端傳輸數(shù)據(jù)直接和HRegionServer通信
hive的部署
從 http://mirrors.hust.edu.cn/apache/hive 下載安裝包飒炎,我下的是http://mirrors.hust.edu.cn/apache/hive/stable-2/apache-hive-2.1.0-bin.tar.gz
解壓后,我們先準(zhǔn)備hdfs笆豁,執(zhí)行:
1.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /tmp
2.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user
3.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user/hive
4.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -mkdir /user/hive/warehourse
5.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -chmod g+w /tmp
6.[root@MYAY hadoop]# ./hadoop/bin/hadoop fs -chmod g+w /user/hive/warehourse
使用hive必須提前設(shè)置好HADOOP_HOME環(huán)境變量郎汪,這樣它可以自動找到我們的hdfs作為存儲赤赊,不妨我們把各種HOME和各種PATH都配置好,如:
1.HADOOP_HOME=/data/apache/hadoop
2.export HADOOP_HOME
3.HBASE_HOME=/data/apache/hbase
4.export HBASE_HOME 5.HIVE_HOME=/data/apache/hive
6.export HIVE_HOME
7.PATH=$PATH:$HOME/bin
8.PATH=$PATH:$HBASE_HOME/bin
9.PATH=$PATH:$HIVE_HOME/bin
10.PATH=$PATH:$HADOOP_HOME/bin
11.export PATH
拷貝創(chuàng)建hive-site.xml怒竿、hive-log4j2.properties砍鸠、hive-exec-log4j2.properties,執(zhí)行
1.[root@MYAY hive]# cp conf/hive-default.xml.template conf/hive-site.xml
2.[root@MYAY hive]# cp conf/hive-log4j2.properties.template conf/hive-log4j2.properties
3.[root@MYAY hive]# cp conf/hive-exec-log4j2.properties.template conf/hive-exec-log4j2.properties
修改hive-site.xml耕驰,把其中的${system:java.io.tmpdir}都修改成/data/apache/tmp爷辱,你也可以自己設(shè)置成自己的tmp目錄,把${system:user.name}都換成用戶名
1.:%s/${system:java.io.tmpdir}/\/data\/apache\/tmp/g
2.:%s/${system:user.name}/myself/g
初始化元數(shù)據(jù)數(shù)據(jù)庫(默認(rèn)保存在本地的derby數(shù)據(jù)庫朦肘,也可以配置成mysql)饭弓,注意,不要先執(zhí)行hive命令媒抠,否則這一步會出錯弟断,具體見http://stackoverflow.com/questions/35655306/hive-installation-issues-hive-metastore-database-is-not-initialized ,下面執(zhí)行:
1.[root@MYAY hive]# schematool -dbType derby -initSchema
成功之后我們可以以客戶端形式直接啟動hive趴生,如:
1.[root@MYAY hive]# hive
2.hive> show databases;
3.OK
4.default
5.Time taken: 1.886 seconds, Fetched: 1 row(s)
6.hive>
試著創(chuàng)建個數(shù)據(jù)庫是否可以:
1.hive> create database mydatabase;
2.OK
3.Time taken: 0.721 seconds
4.hive> show databases;
5.OK 6.default
7.mydatabase
8.Time taken: 0.051 seconds, Fetched: 2 row(s)
9.hive>
這樣我們還是單機的hive阀趴,不能在其他機器登陸,所以我們要以server形式啟動:
1.nohup hiveserver2 &> hive.log &
默認(rèn)會監(jiān)聽10000端口苍匆,這時可以通過jdbc客戶端連接這個服務(wù)訪問hive
hive的具體使用在這里不贅述
spark部署
首先在 http://spark.apache.org/downloads.html 下載指定hadoop版本的安裝包刘急,我下載的是http://d3kbcqa49mib13.cloudfront.net/spark-2.0.0-bin-hadoop2.7.tgz
spark有多種部署方式,首先支持單機直接跑浸踩,如執(zhí)行樣例程序:
1../bin/spark-submit examples/src/main/python/pi.py 10
它可以直接運行得出結(jié)果
下面我們說下spark集群部署方法:
解壓安裝包后直接執(zhí)行:
1.[root@MYAY spark-2.0.0-bin-hadoop2.7]# sbin/start-master.sh
這時可以打開 http://127.0.0.1:8080/ 看到web界面如下:
根據(jù)上面的url:spark://MYAY:7077叔汁,我們再啟動slave:
1.[root@MYAY spark-2.0.0-bin-hadoop2.7]# ./sbin/start-slave.sh spark://MYAY:7077
刷新web界面如下:
出現(xiàn)了一個worker,我們可以根據(jù)需要啟動多個worker
下面我們把上面執(zhí)行過的任務(wù)部署到spark集群上執(zhí)行:
1../bin/spark-submit --master spark://MYAY:7077 examples/src/main/python/pi.py 10
web界面如下:
spark程序也可以部署到y(tǒng)arn集群上執(zhí)行检碗,也就是我們部署hadoop時啟動的yarn
我們需要提前配置好HADOOP_CONF_DIR据块,如下:
1.HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop/
2.export HADOOP_CONF_DIR
下面我們把任務(wù)部署到y(tǒng)arn集群上去:
1../bin/spark-submit --master yarn --deploy-mode cluster examples/src/main/python/pi.py 10
看 http://127.0.0.1:8088/cluster 效果如下:
總結(jié)一下
hdfs是所有hadoop生態(tài)的底層存儲架構(gòu),它主要完成了分布式存儲系統(tǒng)的邏輯折剃,凡是需要存儲的都基于其上構(gòu)建
yarn是負(fù)責(zé)集群資源管理的部分另假,這個資源包括計算資源和存儲資源,因此它也支撐了hdfs和各種計算模塊
map-reduce組件主要完成了map-reduce任務(wù)的調(diào)度邏輯怕犁,它依賴于hdfs作為輸入輸出及中間過程的存儲浪谴,因此在hdfs之上,它也依賴yarn為它分配資源因苹,因此也在yarn之上
hbase基于hdfs存儲苟耻,通過獨立的服務(wù)管理起來,因此僅在hdfs之上
hive基于hdfs存儲扶檐,通過獨立的服務(wù)管理起來凶杖,因此僅在hdfs之上
spark基于hdfs存儲,即可以依賴yarn做資源分配計算資源也可以通過獨立的服務(wù)管理款筑,因此在hdfs之上也在yarn之上智蝠,從結(jié)構(gòu)上看它和mapreduce一層比較像
總之腾么,每一個系統(tǒng)負(fù)責(zé)了自己擅長的一部分,同時相互依托杈湾,形成了整個hadoop生態(tài)解虱。
作者:0o失魂魚o0
鏈接:http://www.reibang.com/p/575b912a4781
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)漆撞,非商業(yè)轉(zhuǎn)載請注明出處殴泰。