hadoop的一些知識點 配置步驟

hgs19921112發表於2018-09-03
1.準備Linux環境
	1.0先將虛擬機器的網路模式選為NAT
		
	1.1修改主機名
		vi /etc/sysconfig/network
		
		NETWORKING=yes
		HOSTNAME=itcast    ###
	1.2修改IP
		兩種方式:
		第一種:透過Linux圖形介面進行修改(強烈推薦)
			進入Linux圖形介面 -> 右鍵點選右上方的兩個小電腦 -> 點選Edit connections -> 選中當前網路System eth0 -> 點選edit按鈕 -> 選擇IPv4 -> method選擇為manual -> 點選add按鈕 -> 新增IP:192.168.1.101 子網掩碼:255.255.255.0 閘道器:192.168.1.1 -> apply
	
		第二種:修改配置檔案方式(屌絲程式猿專用)
			vim /etc/sysconfig/network-scripts/ifcfg-eth0
			
			DEVICE="eth0"
			BOOTPROTO="static"               ###
			HWADDR="00:0C:29:3C:BF:E7"
			IPV6INIT="yes"
			NM_CONTROLLED="yes"
			ONBOOT="yes"
			TYPE="Ethernet"
			UUID="ce22eeca-ecde-4536-8cc2-ef0dc36d4a8c"
			IPADDR="192.168.1.101"           ###
			NETMASK="255.255.255.0"          ###
			GATEWAY="192.168.1.1"            ###
			
	1.3修改主機名和IP的對映關係
		vim /etc/hosts
			
		192.168.1.101	itcast
	
	1.4關閉防火牆
		#檢視防火牆狀態
		service iptables status
		#關閉防火牆
		service iptables stop
		#檢視防火牆開機啟動狀態
		chkconfig iptables --list
		#關閉防火牆開機啟動
		chkconfig iptables off
	1.5 修改sudo
		su root
		vim /etc/sudoers
		給hadoop使用者新增執行的許可權
關閉linux伺服器的圖形介面:
vi /etc/inittab 
	
	1.5重啟Linux
		reboot
2.安裝JDK
	2.1上傳alt+p 後出現sftp視窗,然後put d:\xxx\yy\ll\jdk-7u_65-i585.tar.gz
	
	2.2解壓jdk
		#建立資料夾
		mkdir /home/hadoop/app
		#解壓
		tar -zxvf jdk-7u55-linux-i586.tar.gz -C /home/hadoop/app
		
	2.3將java新增到環境變數中
		vim /etc/profile
		#在檔案最後新增
		export JAVA_HOME=/home/hadoop/app/jdk-7u_65-i585
		export PATH=$PATH:$JAVA_HOME/bin
	
		#重新整理配置
		source /etc/profile
		
3.安裝hadoop2.4.1
	先上傳hadoop的安裝包到伺服器上去/home/hadoop/
	注意:hadoop2.x的配置檔案$HADOOP_HOME/etc/hadoop
	偽分散式需要修改5個配置檔案
	3.1配置hadoop
	第一個:hadoop-env.sh
		vim hadoop-env.sh
		#第27行
		export JAVA_HOME=/usr/java/jdk1.7.0_65
		
	第二個:core-site.xml
		<!-- 指定HADOOP所使用的檔案系統schema(URI),HDFS的老大(NameNode)的地址 -->
		<property>
			<name>fs.defaultFS</name>
			<value>hdfs://weekend-1206-01:9000</value>
		</property>
		<!-- 指定hadoop執行時產生檔案的儲存目錄 -->
		<property>
			<name>hadoop.tmp.dir</name>
			<value>/home/hadoop/hadoop-2.4.1/tmp</value>
    </property>
		
	第三個:hdfs-site.xml   
		<!-- 指定HDFS副本的數量 -->
		<property>
			<name>dfs.replication</name>
			<value>1</value>
		</property>
		
		<property>
			<name>dfs.secondary.http.address</name>
			<value>192.168.1.152:50090</value>
		</property>
    
    
		
	第四個:mapred-site.xml (mv mapred-site.xml.template mapred-site.xml)
		mv mapred-site.xml.template mapred-site.xml
		vim mapred-site.xml
		<!-- 指定mr執行在yarn上 -->
		<property>
			<name>mapreduce.framework.name</name>
			<value>yarn</value>
		</property>
		
	第五個:yarn-site.xml
		<!-- 指定YARN的老大(ResourceManager)的地址 -->
		<property>
			<name>yarn.resourcemanager.hostname</name>
			<value>weekend-1206-01</value>
		</property>
		<!-- reducer獲取資料的方式 -->
		<property>
			<name>yarn.nodemanager.aux-services</name>
			<value>mapreduce_shuffle</value>
		</property>
     	
	3.2將hadoop新增到環境變數
	
	vim /etc/proflie
		export JAVA_HOME=/usr/java/jdk1.7.0_65
		export HADOOP_HOME=/itcast/hadoop-2.4.1
		export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
	source /etc/profile
	
	3.3格式化namenode(是對namenode進行初始化)
		hdfs namenode -format (hadoop namenode -format)
		
	3.4啟動hadoop
		先啟動HDFS
		sbin/start-dfs.sh
		
		再啟動YARN
		sbin/start-yarn.sh
		
	3.5驗證是否啟動成功
		使用jps命令驗證
		27408 NameNode
		28218 Jps
		27643 SecondaryNameNode
		28066 NodeManager
		27803 ResourceManager
		27512 DataNode
	
		http://192.168.1.101:50070 (HDFS管理介面)
		http://192.168.1.101:8088 (MR管理介面)
		
4.配置ssh免登陸
	#生成ssh免登陸金鑰
	#進入到我的home目錄
	cd ~/.ssh
	ssh-keygen -t rsa (四個回車)
	執行完這個命令後,會生成兩個檔案id_rsa(私鑰)、id_rsa.pub(公鑰)
	將公鑰複製到要免密登陸的目標機器上
	ssh-copy-id localhost
	---------------------------
	ssh免登陸:
		生成key:
		ssh-keygen
		複製從A複製到B上:
		ssh-copy-id B
		驗證:
		ssh localhost/exit,ps -e|grep ssh
		ssh A  #在B中執行
---------------------------------------------------
	hdfs-site.xml
	引數dfs.name.dir 配置映象檔案的目錄,可以逗號分隔多值
	引數dfs.data.dir 配置映象檔案的目錄,可以逗號分隔多值
	java 客戶端api
	Configuration 配置
	FileSystem 檔案系統操作相關
		FileSystem.getInstance(configuration)
		FileSystem.mkdirs()
		FileSystem.delete()
		FileSystem.listFiles()迭代器迭代檔案;
		FileSystem.listStatus()返回檔案陣列
	用Stream流訪問hdfs,訪問指定偏移量的資料
	
	mapreduce
	Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
		KEYIN:預設情況下為mr框架所讀到的文字偏移量,long型
		VALUEIN:預設情況下是一行文字 string
		KEYOUT:是使用者自定義邏輯處理完成後輸出的key 
		VALUEOUT:使用者自定義邏輯處理完成後輸出的value
		map(key, value context)
	Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
		reduce();
	如果涉及物件,則物件繼承Writable 實現序列化
	Job
		job.getInstance(conf);
		job.setJarClass
		job.setMapClsss
		job.setReduceclass
		job.setInputKeyClass
		job.setInoutValueClass
		job.setOutputKey
		job.setOutputValue();
		FileInputformat.setInputPaths
		FileOutputFormat.setOutputPath();
		job.waitForCompletion(true);等待退出
	yarn  8088
	hdfs  50070
	
	map切片配置引數
		mapreduce.iput.fileinputformat.split.minsize;
		mapreduce.iput.fileinputformat.split.maxsize;
	自定義partioner:
		class xxx extends Partitioner<map_keyout,map_keyvalue>{}
		job.setPartitionerClass();//設定自定義分割槽的類
		job.seteNumReduceTasks();//指定reduce的個數
	自定義輸出檔名:
	自定義排序順序:
		排序在Mapper的map()方法輸出的時候進行
		分割槽在Mapper的map()方法後執行
	combiner的作用:
		在mapper溢位資料的時候做一次combiner型別相同的進行合併,
		job.setCombinereClass(xxx.class);
	關於大量小檔案的最佳化策略
		(1)預設情況下,TextInputFormat對任務的切片機制是按照檔案切片的,
		  不管檔案多小都會是單獨切片,都交給一個maptask, 這樣效率很低
		(2)最佳化策略,在採集的時候將小檔案合併到檔案,再上傳hdfs
		  補救措施:如果已經在hdfs可以使用CombinerFileInputFormat,它的邏輯和
		  fileinputformat的邏輯不同,它可以將過個小檔案在邏輯上規劃為一個分片
		  job.setInputFormatClass(CombineTextInputformat.class);
		  CombineTextInputformat.setmaxInputSize();
		  CombineTextInputformat.setminInputSize();
	mr本地執行與yarn執行
		預設配置:
		conf.set("mapreduce.framwork.name","local");
		conf.set("fs.defaultFS","file:///")
		叢集模式:
			需要修改原始碼
		conf.set("mapreduce.framwork.name","yarn");
		conf.set("yarn.resourcemanager.hostname","xxxx.xxxx.xxxx.xxx");
		conf.set("fs.defaulFS","hdfs://xxxx.xxxx.xxxx.xxxx:9000/");
	的到切分的檔名:
		FileSplit sp = (FileSplit) context.getInputSplit();
		String name = sp.getPath().getName();
	資料傾斜問題:
		map side join(map端join去掉reduce,使用distributecache,將需要關聯的小檔案放到分散式快取中,整個job只在map中完成,reduce,不做其他的事情)
		job.addArchiveToClassPath(archive);//快取jar包到task工作classpath
		job.addFileToClassPath(new URI("file://  "));//快取檔案到task的工作classpath目錄
		job.addCacheArchive(uri);//快取壓縮包到工作目錄
		job.addCacheFile(uri);快取檔案到執行節點的工作目錄
		job.setReduceTask(0);//reduceTask數量為0
		讀取快取的檔案的時候需要讀取連結如: File f = new File("./thefile"); "thefile" 是 job.addCacheFile(new URI("hdfs://data134:9000/home/tmp.txt#thefile"));的相對內容
	使用groupcomparator求最大值
	class groupcomparator implements WritableComparator
		 	groupcomparator(){
				super(xxxx.class ,true);
			}
			int compare(xxxx x1,xxxx x2){
				return x1.id.compareTo(x2.id);					
			}			
			job.setGroupingComparatorClass(xxxx.class);
			
	自定義outputformat:
		class myoutputFormat extends FileInputformat<keyin,valuein>
		class myrecordwriter extends RecordWriter<keyin,valuein>
	自定義inputFormat:
	
	
-----------------------------------------------------------------------------------------------------------------------
	11.1 資源相關引數
		//以下引數是在使用者自己的mr應用程式中配置就可以生效
		(1) mapreduce.map.memory.mb: 一個Map Task可使用的資源上限(單位:MB),預設為1024。如果Map Task實際使用的資源量超過該值,則會被強制殺死。
		(2) mapreduce.reduce.memory.mb: 一個Reduce Task可使用的資源上限(單位:MB),預設為1024。如果Reduce Task實際使用的資源量超過該值,則會被強制殺死。
		(3) mapreduce.map.java.opts: Map Task的JVM引數,你可以在此配置預設的java heap size等引數, e.g.
		“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc” (@taskid@會被Hadoop框架自動換為相應的taskid), 預設值: “”
		(4) mapreduce.reduce.java.opts: Reduce Task的JVM引數,你可以在此配置預設的java heap size等引數, e.g.
		“-Xmx1024m -verbose:gc -Xloggc:/tmp/@taskid@.gc”, 預設值: “”
		(5) mapreduce.map.cpu.vcores: 每個Map task可使用的最多cpu core數目, 預設值: 1
		(6) mapreduce.reduce.cpu.vcores: 每個Reduce task可使用的最多cpu core數目, 預設值: 1
		//應該在yarn啟動之前就配置在伺服器的配置檔案中才能生效
		(7) yarn.scheduler.minimum-allocation-mb	  1024   給應用程式container分配的最小記憶體
		(8) yarn.scheduler.maximum-allocation-mb	  8192	給應用程式container分配的最大記憶體
		(9) yarn.scheduler.minimum-allocation-vcores	1	
		(10)yarn.scheduler.maximum-allocation-vcores	32
		(11)yarn.nodemanager.resource.memory-mb   8192  
		//shuffle效能最佳化的關鍵引數,應在yarn啟動之前就配置好
		(12) mapreduce.task.io.sort.mb   100         //shuffle的環形緩衝區大小,預設100m
		(13) mapreduce.map.sort.spill.percent   0.8    //環形緩衝區溢位的閾值,預設80%
	11.2 容錯相關引數
		(1) mapreduce.map.maxattempts: 每個Map Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。
		(2) mapreduce.reduce.maxattempts: 每個Reduce Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。
		(3) mapreduce.map.failures.maxpercent: 當失敗的Map Task失敗比例超過該值為,整個作業則失敗,預設值為0. 如果你的應用程式允許丟棄部分輸入資料,則該該值設為一個大於0的值,比如5,表示如果有低於5%的Map Task失敗(如果一個Map Task重試次數超過mapreduce.map.maxattempts,則認為這個Map Task失敗,其對應的輸入資料將不會產生任何結果),整個作業扔認為成功。
		(4) mapreduce.reduce.failures.maxpercent: 當失敗的Reduce Task失敗比例超過該值為,整個作業則失敗,預設值為0.
		(5) mapreduce.task.timeout: Task超時時間,經常需要設定的一個引數,該參數列達的意思為:如果一個task在一定時間內沒有任何進入,即不會讀取新的資料,也沒有輸出資料,則認為該task處於block狀態,可能是卡住了,也許永遠會卡主,為了防止因為使用者程式永遠block住不退出,則強制設定了一個該超時時間(單位毫秒),預設是300000。如果你的程式對每條輸入資料的處理時間過長(比如會訪問資料庫,透過網路拉取資料等),建議將該引數調大,該引數過小常出現的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。
	11.3 本地執行mapreduce 作業
		設定以下幾個引數:
		mapreduce.framework.name=local
		mapreduce.jobtracker.address=local
		fs.defaultFS=local
	11.4 效率和穩定性相關引數
		(1) mapreduce.map.speculative: 是否為Map Task開啟推測執行機制,預設為false
		(2) mapreduce.reduce.speculative: 是否為Reduce Task開啟推測執行機制,預設為false
		(3) mapreduce.job.user.classpath.first & mapreduce.task.classpath.user.precedence:當同一個class同時出現在使用者jar包和hadoop jar中時,優先使用哪個jar包中的class,預設為false,表示優先使用hadoop jar中的class。
		(4) mapreduce.input.fileinputformat.split.minsize: FileInputFormat做切片時的最小切片大小,(5)mapreduce.input.fileinputformat.split.maxsize:  FileInputFormat做切片時的最大切片大小
		(切片的預設大小就等於blocksize,即 134217728)
---------------------------------------------------------------------------------------------------------------
Hadoop HA
	hadoop2.0已經發布了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.6.4又增加了YARN HA
		注意:apache提供的hadoop-2.6.4的安裝包是在32位作業系統編譯的,因為hadoop依賴一些C++的本地庫,
		所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64作業系統上重新編譯
		(建議第一次安裝用32位的系統,我將編譯好的64位的也上傳到群共享裡了,如果有興趣的可以自己編譯一下)
		前期準備就不詳細說了,課堂上都介紹了
		1.修改Linux主機名
		2.修改IP
		3.修改主機名和IP的對映關係 /etc/hosts
			######注意######如果你們公司是租用的伺服器或是使用的雲主機(如華為用主機、阿里雲主機等)
			/etc/hosts裡面要配置的是內網IP地址和主機名的對映關係	
		4.關閉防火牆
		5.ssh免登陸
		6.安裝JDK,配置環境變數等
		叢集規劃:
			主機名		IP				安裝的軟體					執行的程式
			mini1	192.168.1.200	jdk、hadoop					NameNode、DFSZKFailoverController(zkfc)
			mini2	192.168.1.201	jdk、hadoop					NameNode、DFSZKFailoverController(zkfc)
			mini3	192.168.1.202	jdk、hadoop					ResourceManager 
			mini4	192.168.1.203	jdk、hadoop					ResourceManager
			mini5	192.168.1.205	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
			mini6	192.168.1.206	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
			mini7	192.168.1.207	jdk、hadoop、zookeeper		DataNode、NodeManager、JournalNode、QuorumPeerMain
			
		說明:
			1.在hadoop2.0中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
			hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的QJM。在該方案中,主備NameNode之間透過一組JournalNode同步後設資料資訊,一條資料只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode
			這裡還配置了一個zookeeper叢集,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態
			2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
		安裝步驟:
			1.安裝配置zooekeeper叢集(在hadoop05上)
				1.1解壓
					tar -zxvf zookeeper-3.4.5.tar.gz -C /home/hadoop/app/
				1.2修改配置
					cd /home/hadoop/app/zookeeper-3.4.5/conf/
					cp zoo_sample.cfg zoo.cfg
					vim zoo.cfg
					修改:dataDir=/home/hadoop/app/zookeeper-3.4.5/tmp
					在最後新增:
					server.1=hadoop05:2888:3888
					server.2=hadoop06:2888:3888
					server.3=hadoop07:2888:3888
					儲存退出
					然後建立一個tmp資料夾
					mkdir /home/hadoop/app/zookeeper-3.4.5/tmp
					echo 1 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
				1.3將配置好的zookeeper複製到其他節點(首先分別在hadoop06、hadoop07根目錄下建立一個hadoop目錄:mkdir /hadoop)
					scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop06:/home/hadoop/app/
					scp -r /home/hadoop/app/zookeeper-3.4.5/ hadoop07:/home/hadoop/app/
					
					注意:修改hadoop06、hadoop07對應/hadoop/zookeeper-3.4.5/tmp/myid內容
					hadoop06:
						echo 2 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
					hadoop07:
						echo 3 > /home/hadoop/app/zookeeper-3.4.5/tmp/myid
			
			2.安裝配置hadoop叢集(在hadoop00上操作)
				2.1解壓
					tar -zxvf hadoop-2.6.4.tar.gz -C /home/hadoop/app/
				2.2配置HDFS(hadoop2.0所有的配置檔案都在$HADOOP_HOME/etc/hadoop目錄下)
					#將hadoop新增到環境變數中
					vim /etc/profile
					export JAVA_HOME=/usr/java/jdk1.7.0_55
					export HADOOP_HOME=/hadoop/hadoop-2.6.4
					export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
					
					#hadoop2.0的配置檔案全部在$HADOOP_HOME/etc/hadoop下
					cd /home/hadoop/app/hadoop-2.6.4/etc/hadoop
					
					2.2.1修改hadoo-env.sh
						export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55
		###############################################################################
						
		2.2.2修改core-site.xml
		<configuration>
		<!-- 指定hdfs的nameservice為ns1 -->
		<property>
		<name>fs.defaultFS</name>
		<value>hdfs://bi/</value>
		</property>
		<!-- 指定hadoop臨時目錄 -->
		<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/hadoop/app/hdpdata/</value>
		</property>
		<!-- 指定zookeeper地址 -->
		<property>
		<name>ha.zookeeper.quorum</name>
		<value>mini5:2181,mini6:2181,mini7:2181</value>
		</property>
		</configuration>
		###############################################################################
						
		2.2.3修改hdfs-site.xml
		<configuration>
		<!--指定hdfs的nameservice為bi,需要和core-site.xml中的保持一致 -->
		<property>
		<name>dfs.nameservices</name>
		<value>bi</value>
		</property>
		<!-- bi下面有兩個NameNode,分別是nn1,nn2 -->
		<property>
		<name>dfs.ha.namenodes.bi</name>
		<value>nn1,nn2</value>
		</property>
		<!-- nn1的RPC通訊地址 -->
		<property>
		<name>dfs.namenode.rpc-address.bi.nn1</name>
		<value>mini1:9000</value>
		</property>
		<!-- nn1的http通訊地址 -->
		<property>
		<name>dfs.namenode.http-address.bi.nn1</name>
		<value>mini1:50070</value>
		</property>
		<!-- nn2的RPC通訊地址 -->
		<property>
		<name>dfs.namenode.rpc-address.bi.nn2</name>
		<value>mini2:9000</value>
		</property>
		<!-- nn2的http通訊地址 -->
		<property>
		<name>dfs.namenode.http-address.bi.nn2</name>
		<value>mini2:50070</value>
		</property>
		<!-- 指定NameNode的edits後設資料在JournalNode上的存放位置 -->
		<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value>
		</property>
		<!-- 指定JournalNode在本地磁碟存放資料的位置 -->
		<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/home/hadoop/journaldata</value>
		</property>
		<!-- 開啟NameNode失敗自動切換 -->
		<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
		</property>
		<!-- 配置失敗自動切換實現方式 -->
		<property>
		<name>dfs.client.failover.proxy.provider.bi</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
		</property>
		<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
		<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
		sshfence
		shell(/bin/true)
		</value>
		</property>
		<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
		<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/home/hadoop/.ssh/id_rsa</value>
		</property>
		<!-- 配置sshfence隔離機制超時時間 -->
		<property>
		<name>dfs.ha.fencing.ssh.connect-timeout</name>
		<value>30000</value>
		</property>
		</configuration>
		###############################################################################
					
		2.2.4修改mapred-site.xml
		<configuration>
		<!-- 指定mr框架為yarn方式 -->
		<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
		</property>
		</configuration>	
		###############################################################################
					
		2.2.5修改yarn-site.xml
		<configuration>
		<!-- 開啟RM高可用 -->
		<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
		</property>
		<!-- 指定RM的cluster id -->
		<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>yrc</value>
		</property>
		<!-- 指定RM的名字 -->
		<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
		</property>
		<!-- 分別指定RM的地址 -->
		<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>mini3</value>
		</property>
		<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>mini4</value>
		</property>
		<!-- 指定zk叢集地址 -->
		<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>mini5:2181,mini6:2181,mini7:2181</value>
		</property>
		<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
		</property>
		</configuration>
					
						
		2.2.6修改slaves(slaves是指定子節點的位置,因為要在hadoop01上啟動HDFS、在hadoop03啟動yarn,所以hadoop01上的slaves檔案指定的是datanode的位置,hadoop03上的slaves檔案指定的是nodemanager的位置)
		mini5
		mini6
		mini7
					2.2.7配置免密碼登陸
						#首先要配置hadoop00到hadoop01、hadoop02、hadoop03、hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸
						#在hadoop01上生產一對鑰匙
						ssh-keygen -t rsa
						#將公鑰複製到其他節點,包括自己
						ssh-coyp-id hadoop00
						ssh-coyp-id hadoop01
						ssh-coyp-id hadoop02
						ssh-coyp-id hadoop03
						ssh-coyp-id hadoop04
						ssh-coyp-id hadoop05
						ssh-coyp-id hadoop06
						ssh-coyp-id hadoop07
						#配置hadoop02到hadoop04、hadoop05、hadoop06、hadoop07的免密碼登陸
						#在hadoop02上生產一對鑰匙
						ssh-keygen -t rsa
						#將公鑰複製到其他節點
						ssh-coyp-id hadoop03				
						ssh-coyp-id hadoop04
						ssh-coyp-id hadoop05
						ssh-coyp-id hadoop06
						ssh-coyp-id hadoop07
						#注意:兩個namenode之間要配置ssh免密碼登陸,別忘了配置hadoop01到hadoop00的免登陸
						在hadoop01上生產一對鑰匙
						ssh-keygen -t rsa
						ssh-coyp-id -i hadoop00				
				
				2.4將配置好的hadoop複製到其他節點
					scp -r /hadoop/ hadoop02:/
					scp -r /hadoop/ hadoop03:/
					scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop04:/hadoop/
					scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop05:/hadoop/
					scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop06:/hadoop/
					scp -r /hadoop/hadoop-2.6.4/ hadoop@hadoop07:/hadoop/
					
					
					
		###注意:嚴格按照下面的步驟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
				2.5啟動zookeeper叢集(分別在mini5、mini6、mini7上啟動zk)
					cd /hadoop/zookeeper-3.4.5/bin/
					./zkServer.sh start
					#檢視狀態:一個leader,兩個follower
					./zkServer.sh status
					
				2.6啟動journalnode(分別在在mini5、mini6、mini7上執行)
					cd /hadoop/hadoop-2.6.4
					sbin/hadoop-daemon.sh start journalnode
					#執行jps命令檢驗,hadoop05、hadoop06、hadoop07上多了JournalNode程式
				
				2.7格式化HDFS
					#在mini1上執行命令:
					hdfs namenode -format
					#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡我配置的是/hadoop/hadoop-2.6.4/tmp,然後將/hadoop/hadoop-2.6.4/tmp複製到hadoop02的/hadoop/hadoop-2.6.4/下。
					scp -r tmp/ hadoop02:/home/hadoop/app/hadoop-2.6.4/
					##也可以這樣,建議hdfs namenode -bootstrapStandby
				
				2.8格式化ZKFC(在mini1上執行一次即可)
					hdfs zkfc -formatZK
				
				2.9啟動HDFS(在mini1上執行)
					sbin/start-dfs.sh
				2.10啟動YARN(#####注意#####:是在hadoop02上執行start-yarn.sh,把namenode和resourcemanager分開是因為效能問題,因為他們都要佔用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
					sbin/start-yarn.sh
				
			到此,hadoop-2.6.4配置完畢,可以統計瀏覽器訪問:
				
				NameNode 'hadoop01:9000' (active)
				
				NameNode 'hadoop02:9000' (standby)
			
			驗證HDFS HA
				首先向hdfs上傳一個檔案
				hadoop fs -put /etc/profile /profile
				hadoop fs -ls /
				然後再kill掉active的NameNode
				kill -9 <pid of NN>
				透過瀏覽器訪問:http://192.168.1.202:50070
				NameNode 'hadoop02:9000' (active)
				這個時候hadoop02上的NameNode變成了active
				在執行命令:
				hadoop fs -ls /
				-rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
				剛才上傳的檔案依然存在!!!
				手動啟動那個掛掉的NameNode
				sbin/hadoop-daemon.sh start namenode
				透過瀏覽器訪問:http://192.168.1.201:50070
				NameNode 'hadoop01:9000' (standby)
			
			驗證YARN:
				執行一下hadoop提供的demo中的WordCount程式:
				hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
			
			OK,大功告成!!!
			
					
				
		測試叢集工作狀態的一些指令 :
		bin/hdfs dfsadmin -report	 檢視hdfs的各節點狀態資訊
		bin/hdfs haadmin -getServiceState nn1		 獲取一個namenode節點的HA狀態
		sbin/hadoop-daemon.sh start namenode  單獨啟動一個namenode程式
		./hadoop-daemon.sh start zkfc   單獨啟動一個zkfc程式
		
-----------------------------------------------------------------------------------------------------
hadoop federation:
		
			
				
			
			
	
			
		
	
 
	
			
	
	 
		
		
		
		
	
	
	
	


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2213488/,如需轉載,請註明出處,否則將追究法律責任。

相關文章