篩選算法:
關注度權重公式:
W = TF * Log(N/DF)
TF:當前關鍵字在該條記錄中出現的總次數;
N:總的記錄數;
DF:當前關鍵字在所有記錄中出現的條數;
HDFS的 namenode HA和namenode Federation
(1)解決單點故障:
使用HDFS HA :通過主備namenode解決;如果主發生故障,則切換到備上。
(2)解決內存受限:
使用HDFS Federation,水平擴展,支持多個namenode,相互獨立。共享所有datanode。
下面詳細說明:
namenode HA:namenode對元數據的修改都會經過journalnode,在QJM的集群上備份一個,因此QJM上元數據和namenode上元數據是一樣的(namenode的元數據就是QJM上的元數據鏡像),在namenode掛掉后,standby的namenode會找QJM集群上的元數據,繼續工作。如果使用namenode Federation,則每個namenode的共享數據都會在journalnode的集群上。相當于每個namenode上都存了一個對journalnode集群的鏡像,namenode的讀寫,都是在jn集群上修改和尋找的。
客戶端一開始請求hdfs時,先訪問zookeeper,去檢查哪些namenode掛掉了,哪些活著,去決定訪問哪個namenode。任何一個namenode都會對應一個FailoverController,也就是ZKFC競爭鎖。在一個namenode掛掉后,有競爭鎖來選擇用哪一個namenode,這里使用的是投票機制,因此zookeeper要使用奇數的。
namenode Federation:是在一個集群中有若干個獨立的namenode,相當于多個獨立的集群,但是共用datanode??蛻舳嗽L問這些namenode時,要選擇使用哪個namenode才可以訪問和使用。
在Federation上加HA,是對每一個namenode都加HA,互相獨立。
YARN:
YARN是資源管理系統,管理HDFS的數據,知曉數據的所有情況;計算框架向yarn去申請資源去計算,可以做到資源不浪費,可以并發的運行計算框架;兼容其他第三方的并行計算框架;
在資源管理方面:
ResourceManager:負責整個集群的資源管理和調度
ApplicationMaster:負責應用程序相關的事務,比如任務調度、任務監控和容錯等。其在每個節點上工作時有nodeManager,這里面就有ApplicationMaster。
nodeManager最好是在datanode的機器上,因為方便計算;
以namenode HA的方式來配置啟動hadoop集群
配置hdfs-site.xml及其說明:
這里都是對hdfs的配置進行操作,如哪些node上有哪些特定的操作。
<configuration> <property> <name>dfs.name.dir</name> <value>/root/data/namenode</value> </property> <property> <name>dfs.data.dir</name> <value>/root/data/datanode</value> </property> <property> <name>dfs.tmp.dir</name> <value>/root/data/tmp</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> //nameservices是該集群的名字,是唯一的標示,供zookeeper去識別,mycluster就是名字,可以改為其他的 <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> //指明在該集群下,有幾個namenode及其名字,這里有集群的名字,和上面的對應 <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> //每個namenode的rpc協議的地址,為了傳遞數據用的,客戶端上傳下載用這個 <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop11:4001</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop22:4001</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn1</name> <value>hadoop11:4011</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn2</name> <value>hadoop22:4011</value> </property> //http協議的端口,是為了通過網絡,如瀏覽器,去查看hdfs的 <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop11:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop22:50070</value> </property> //這里是配置journalnode的主機,配置為奇數個,集群中在哪些機器上有journalnode。 //namenode進行讀寫時,請求的是這個地址,journalnode實時的記錄了文件的情況,外界訪問namenode,namenode一方面自己響應請求,一方面找journalnode進行讀寫,做好備份。 <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop11:8485;hadoop22:8485;hadoop33:8485/mycluster</value> </property> //journalNode在機器上的文件位置,工作目錄 <property> <name>dfs.journalnode.edits.dir</name> <value>/root/data/journaldata/</value> </property> //外界連接激活的namenode調用的類 //供外界去找到active的namenode <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> //自動切換namenode <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> //用于一臺機子登陸另一臺機器使用的密匙的位置 <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> //私鑰文件所在的位置 <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_dsa</value> </property>
配置core-site.xml
//這個是hdfs的統一入口,mycluster是我們自己配置的該集群的統一服務標識 //外界訪問的是這個集群 <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> //由zookeeper去管理hdfs,這里是ZooKeeper集群的地址和端口。注意,數量一定是奇數,且不少于三個節點 <property> <name>ha.zookeeper.quorum</name> <value>hadoop11:2181,hadoop22:2181,hadoop33:2181</value> </property>
如果一個不是HA的namenode變為HA的,則在要改的namenode的主機上執行hdfs -initializeSharedEdits,這可以使該namenode上的元數據改為journalnode上的元數據。
root用戶下的.bashrc文件是環境變量的配置文件,只供root用戶使用
zookeeper的配置:
一個是先配置dir路徑,以存放文件,避免關閉后zookeeper信息丟失
server.1=hadoop11:2888:3888 server.2=hadoop22:2888:3888 server.3=hadoop33:2888:3888
server.1是指zookeeper在集群中的編號
在zookeeper的配置文件中還有一個這個dataDir=/root/data/zookeeper,里面有個myid文件
[root@hadoop11 data]# cd zookeeper/
[root@hadoop11 zookeeper]# ls
myid version-2
這個myid文件指明了當前的zookeeper在集群中的編號是幾。
配置過程簡述:
現在每臺機器上啟動zookeeper,zk。。。啟動。不要動
而后,hdfs-daemon.sh journalnode,啟動journalnode,在其中一個機器上啟動namenode,使用hdfs namenode -format,得到namenode的源文件,可以啟動這個節點的namenode,再在另一個namenode上使用hdfs namenode -bootstrapStandby,作為備用的節點,兩個namenode的元文件一樣。
If you are setting up a fresh HDFS cluster, you should first run the format command (hdfs namenode -format) on one of NameNodes.
If you have already formatted the NameNode, or are converting a non-HA-enabled cluster to be HA-enabled, you should now copy over the contents of your NameNode metadata directories to the other, unformatted NameNode by running the command "hdfs namenode -bootstrapStandby" on the unformatted NameNode. Running this command will also ensure that the JournalNodes (as configured by dfs.namenode.shared.edits.dir) contain sufficient edits transactions to be able to start both NameNodes.
If you are converting a non-HA NameNode to be HA, you should run the command "hdfs -initializeSharedEdits", which will initialize the JournalNodes with the edits data from the local NameNode edits directories.
每個namenode上都有一個zkfc,是失敗機制,與zookeeper交互的。
在某一個namenode上要執行下列指令,使得zkfc與zookeeper相關聯
使得zkfc可以正常啟動
After the configuration keys have been added, the next step is to initialize required state in ZooKeeper. You can do so by running the following command from one of the NameNode hosts.
$ hdfs zkfc -formatZK
This will create a znode in ZooKeeper inside of which the automatic failover system stores its data.
hdfs的一些特點:
sbin目錄下的hadoop-deamon.sh 【節點】可以用于開啟該機器上的某一個節點
可以用kill -9 哪個進程 去殺掉某一個進程的node
start-dfs.sh啟動集群的hdfs
把hadoop的bin和sbin配置在環境變量后,可以使用hdfs實現很多操作,如下:
[root@hadoop11 ~]# hdfs
Usage: hdfs [--config confdir] COMMAND
where COMMAND is one of:
dfs run a filesystem command on the file systems supported in Hadoop.
namenode -format format the DFS filesystem
secondarynamenode run the DFS secondary namenode
namenode run the DFS namenode
journalnode run the DFS journalnode
zkfc run the ZK Failover Controller daemon
datanode run a DFS datanode
dfsadmin run a DFS admin client
haadmin run a DFS HA admin client
fsck run a DFS filesystem checking utility
balancer run a cluster balancing utility
jmxget get JMX exported values from NameNode or DataNode.
oiv apply the offline fsp_w_picpath viewer to an fsp_w_picpath
oev apply the offline edits viewer to an edits file
fetchdt fetch a delegation token from the NameNode
getconf get config values from configuration
groups get the groups which users belong to
snapshotDiff diff two snapshots of a directory or diff the
current directory contents with a snapshot
lsSnapshottableDir list all snapshottable dirs owned by the current user
Use -help to see options
portmap run a portmap service
nfs3 run an NFS version 3 gateway
cacheadmin configure the HDFS cache
YARN的配置
mapred-site.xml 中
mapred-site.xml <configuration> //這里是指明mapreduce使用的是哪個框架 <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
yarn-site.xml中
yarn-site.xml <configuration> //下面幾個在每個節點中配置的都一樣,因為這里指明集群中使用哪臺機器作為resourcemanager //這個是yarn資源管理器地址,用于外界連接到資源管理器(這個) <property> <name>yarn.resourcemanager.address</name> <value>hadoop1:9080</value> </property> //應用程序宿主借此與資源管理器通信 <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop1:9081</value> </property> //節點管理器借此與資源管理器通信的端口,如在hadoop2中陪這個,2中的nodemanager就可以找到1的resourcemanager <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop1:9082</value> </property> //節點管理器運行的附加服務列表 <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
每臺機器都可以自己啟動nodemanager,使用yarn-darmon.sh start nodemanager,這是啟動的nodemanager會根據yarn-site.xml文件中的配置找到其resourcemanager。但是在集群中nodemanager是運行在datanode上,去管理datanode的,因此如果在slaves中指明哪些機器上有datanode,在主機上使用start-yarn.sh時,該主機作為resourcemanager,同時會從slaves中,把該文件中的節點上啟動nodemanager。
在每個節點上都有yarn,其會根據自己的yarn的配置去有序的形成一個集群,以resourcemanager為主。
在resourcemanager要求的地址啟動yarn,才會啟動resourcemanager。
如果要在hadoop上運行mapreduce:
要把mapreduce程序打包,放在hadoop集群中;
使用指令:hadoop jar [web.jar程序名] [主函數所在的類名] [輸入文件路徑] [輸出文件路徑]
如:hadoop jar web.jar org.shizhen.wordcount /test /output
之后就可在output上查看了
hadoop集群中本身的hadoop和yarn就對應了很多指令:
使用這些指令可以操作某個進程某個節點。。。。
[root@hadoop11 ~]# hadoop
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
fs run a generic filesystem user client
version print the version
jar <jar> run a jar file
checknative [-a|-h] check native hadoop and compression libraries availability
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath prints the class path needed to get the
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
使用這些yarn類的指令,可以操縱mapreduce相關的節點和監控程序的流程,如application。。。
[root@hadoop11 ~]# yarn
Usage: yarn [--config confdir] COMMAND
where COMMAND is one of:
resourcemanager run the ResourceManager
nodemanager run a nodemanager on each slave
historyserver run the application history server
rmadmin admin tools
version print the version
jar <jar> run a jar file
application prints application(s) report/kill application
applicationattempt prints applicationattempt(s) report
container prints container(s) report
node prints node report(s)
logs dump container logs
classpath prints the class path needed to get the
Hadoop jar and the required libraries
daemonlog get/set the log level for each daemon
or
CLASSNAME run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
配置完成后:
啟動時先zkServer.sh start 啟動zookeeper,然后start-all.sh啟動hadoop即可。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。