4. 集羣搭建
4.1 HADOOP集羣搭建
4.1.1集羣簡介
HADOOP集羣具體來說包含兩個集羣:HDFS集羣和YARN集羣,兩者邏輯上分離,但物理上常在一起
HDFS集羣:
負責海量數據的存儲,集羣中的角色主要有 NameNode / DataNode
YARN集羣:
負責海量數據運算時的資源調度,集羣中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什麼呢?它其實是一個應用程序開發包)
本集羣搭建案例,以5節點爲例進行搭建,角色分配如下:
hdp-node-01 NameNode SecondaryNameNode hdp-node-02 ResourceManager hdp-node-03 DataNode NodeManager hdp-node-04 DataNode NodeManager hdp-node-05 DataNode NodeManager |
4.1.2服務器準備
本案例使用虛擬機服務器來搭建HADOOP集羣,所用軟件及版本:
ü Vmware 11.0
ü Centos 6.5 64bit
4.1.3網絡環境準備
ü 採用NAT方式聯網
ü 網關地址:192.168.33.1
ü 3個服務器節點IP地址:192.168.33.101、192.168.33.102、192.168.33.103
ü 子網掩碼:255.255.255.0
4.1.4服務器系統設置
ü 添加HADOOP用戶
ü 爲HADOOP用戶分配sudoer權限
ü 同步時間
ü 設置主機名
n hdp-node-01
n hdp-node-02
n hdp-node-03
ü 配置內網域名映射:
n 192.168.33.101 hdp-node-01
n 192.168.33.102 hdp-node-02
n 192.168.33.103 hdp-node-03
ü 配置ssh免密登陸
ü 配置防火牆
4.1.5 Jdk環境安裝
ü 上傳jdk安裝包
ü 規劃安裝目錄 /home/hadoop/apps/jdk_1.7.65
ü 解壓安裝包
ü 配置環境變量 /etc/profile
4.1.6 HADOOP安裝部署
補充: HADOOP的版本選擇
1、APACHE官方版本
大版本: 0.20.2
1.x
2.x 2.6.4 2.7.3
2、商業發行版(商業版提供完善的管理系統、修bug可能領先於官方):
Cloudera公司的CDH:5.7.x
ü 上傳HADOOP安裝包
ü 規劃安裝目錄 /root/apps/hadoop-2.6.1
ü 解壓安裝包
ü 修改配置文件 $HADOOP_HOME/etc/hadoop/
最簡化配置如下:
vi hadoop-env.sh
# The java implementation to use. export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51 |
vi core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hdp-node-01:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value> </property> </configuration> |
vi hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/data/name,/path2/,/path3/,nfs://</value> </property> <!---namenode配置多個目錄和datanode配置多個目錄,有什麼區別?----> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/data/data,/path2/</value> </property>
<property> <name>dfs.replication</name> <value>3</value> </property>
<property> <name>dfs.secondary.http.address</name> <value>hdp-node-01:50090</value> </property> </configuration> |
vi mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> |
vi yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property>
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> |
vi salves
hdp-node-01 hdp-node-02 hdp-node-03 |
4.1.7 啓動集羣
初始化HDFS
bin/hadoop namenode -format |
啓動HDFS
sbin/start-dfs.sh |
啓動YARN
sbin/start-yarn.sh |
4.1.8 測試
1、上傳文件到HDFS
從本地上傳一個文本文件到hdfs的/wordcount/input目錄下
[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input [HADOOP@hdp-node-01 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input |
2、運行一個mapreduce程序
在HADOOP安裝目錄下,運行一個示例mr程序
cd $HADOOP_HOME/share/hadoop/mapreduce/ hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output |
5 集羣使用初步
5.1 HDFS使用
1、查看集羣狀態
命令: hdfs dfsadmin –report
可以看出,集羣共有3個datanode可用
也可打開web控制檯查看HDFS集羣信息,在瀏覽器打開http://hdp-node-01:50070/
2、上傳文件到HDFS
² 查看HDFS中的目錄信息
命令: hadoop fs –ls /
² 上傳文件
命令: hadoop fs -put ./ scala-2.10.6.tgz to /
² 從HDFS下載文件
命令: hadoop fs -get /yarn-site.xml
5.2 MAPREDUCE使用
mapreduce是hadoop中的分佈式運算編程框架,只要按照其編程規範,只需要編寫少量的業務邏輯代碼即可實現一個強大的海量數據併發處理程序
5.2.1 Demo開發——wordcount
1、需求
從大量(比如T級別)文本文件中,統計出每一個單詞出現的總次數
2、mapreduce實現思路
Map階段:
a) 從HDFS的源數據文件中逐行讀取數據
b) 將每一行數據切分出單詞
c) 爲每一個單詞構造一個鍵值對(單詞,1)
d) 將鍵值對發送給reduce
Reduce階段:
a) 接收map階段輸出的單詞鍵值對
b) 將相同單詞的鍵值對匯聚成一組
c) 對每一組,遍歷組中的所有“值”,累加求和,即得到每一個單詞的總次數
d) 將(單詞,總次數)輸出到HDFS的文件中
1、 具體編碼實現
(1)定義一個mapper類
//首先要定義四個泛型的類型 //keyin: LongWritable valuein: Text //keyout: Text valueout:IntWritable
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ //map方法的生命週期: 框架每傳一行數據就被調用一次 //key : 這一行的起始點在文件中的偏移量 //value: 這一行的內容 @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //拿到一行數據轉換爲string String line = value.toString(); //將這一行切分出各個單詞 String[] words = line.split(" "); //遍歷數組,輸出<單詞,1> for(String word:words){ context.write(new Text(word), new IntWritable(1)); } } } |
(2)定義一個reducer類
//生命週期:框架每傳遞進來一個kv 組,reduce方法被調用一次 @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { //定義一個計數器 int count = 0; //遍歷這一組kv的所有v,累加到count中 for(IntWritable value:values){ count += value.get(); } context.write(key, new IntWritable(count)); } } |
(3)定義一個主類,用來描述job並提交job
public class WordCountRunner { //把業務邏輯相關的信息(哪個是mapper,哪個是reducer,要處理的數據在哪裏,輸出的結果放哪裏。。。。。。)描述成一個job對象 //把這個描述好的job提交給集羣去運行 public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job wcjob = Job.getInstance(conf); //指定我這個job所在的jar包 //wcjob.setJar("/home/hadoop/wordcount.jar"); wcjob.setJarByClass(WordCountRunner.class); wcjob.setMapperClass(WordCountMapper.class); wcjob.setReducerClass(WordCountReducer.class); //設置我們的業務邏輯Mapper類的輸出key和value的數據類型 wcjob.setMapOutputKeyClass(Text.class); wcjob.setMapOutputValueClass(IntWritable.class); //設置我們的業務邏輯Reducer類的輸出key和value的數據類型 wcjob.setOutputKeyClass(Text.class); wcjob.setOutputValueClass(IntWritable.class); //指定要處理的數據所在的位置 FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt"); //指定處理完成之後的結果所保存的位置 FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/")); //向yarn集羣提交這個job boolean res = wcjob.waitForCompletion(true); System.exit(res?0:1); } |
5.2.2 程序打包運行
1. 將程序打包
2. 準備輸入數據
vi /home/hadoop/test.txt
Hello tom Hello jim Hello ketty Hello world Ketty tom |
在hdfs上創建輸入數據文件夾:
hadoop fs mkdir -p /wordcount/input
將words.txt上傳到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input
3. 將程序jar包上傳到集羣的任意一臺服務器上
4. 使用命令啓動執行wordcount程序jar包
$ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out
5. 查看執行結果
$ hadoop fs –cat /wordcount/out/part-r-00000