標籤:叢集 hadoop mapreduce namenode hdfs
一.簡介
二.安裝部署
三.運行hadoop例子並測試部署環境
四.注意的地方
一.簡介
Hadoop是一個由Apache基金會所開發的分布式系統基礎架構,Hadoop的架構最核心的設計就是:HDFS和MapReduce。HDFS為海量的資料提供了儲存,HDFS有高容錯性的特點,並且設計用來部署在低廉的(low-cost)硬體上;而且它提供高輸送量(high throughput)來訪問應用程式的資料,適合那些有著超大資料集(large data set)的應用程式。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streaming access)檔案系統中的資料,則MapReduce為海量的資料提供了計算。Hadoop 容易開發和運行處理大規模資料的平台。
HDFS是Java語言開發,因此任何支援Java的機器都可以部署Namenode或Datanode,HDFS採用master/slave架構,一個HDFS叢集是由一個Namenode和一定數目的Datanodes組成。Namenode是一個中心伺服器,負責管理檔案系統的名字空間(namespace)以及用戶端對檔案的訪問。叢集中的Datanode一般是一個節點一個,負責管理它所在節點上的儲存。HDFS暴露了檔案系統的名字空間,使用者能夠以檔案的形式在上面儲存資料。從內部看,一個檔案其實被分成一個或多個資料區塊,這些Block Storage在一組Datanode上。Namenode執行檔案系統的名字空間操作,比如開啟、關閉、重新命名檔案或目錄。它也負責確定資料區塊到具體Datanode節點的映射。Datanode負責處理檔案系統用戶端的讀寫請求。在Namenode的統一調度下進行資料區塊的建立、刪除和複製。所示:
Hadoop Map/Reduce是一個使用簡易的軟體架構,基於它寫出來的應用程式能夠運行在由上千個商用機器組成的大型叢集上,並以一種可靠容錯的方式平行處理上T層級的資料集。一個Map/Reduce 作業(job) 通常會把輸入的資料集切分為若干獨立的資料區塊,由 map任務(task)以完全並行的方式處理它們。架構會對map的輸出先進行排序, 然後把結果輸入給reduce任務。通常作業的輸入和輸出都會被儲存在檔案系統中。 整個架構負責任務的調度和監控,以及重新執行已經失敗的任務。
Hadoop是一個能夠讓使用者輕鬆架構和使用的分散式運算平台。使用者可以輕鬆地在Hadoop上開發和運行處理海量資料的應用程式。它主要有以下幾個優點:
1.高可靠性。Hadoop按位儲存和處理資料的能力值得人們信賴。
2.高擴充性。Hadoop是在可用的電腦集簇間分配資料並完成計算任務的,這些集簇可以方便地擴充到數以千計的節點中。
3.高效性。Hadoop能夠在節點之間動態地移動資料,並保證各個節點的動態平衡,因此處理速度非常快。
4.高容錯性。Hadoop能夠自動儲存資料的多個副本,並且能夠自動將失敗的任務重新分配。
5.低成本。與一體機、商用資料倉儲以及QlikView、Yonghong Z-Suite等資料集市相比,hadoop是開源的,項目的軟體成本因此會大大降低。
Hadoop 偽分布式模式是在單機上類比 Hadoop 分布式,條件有限,所以linux虛擬機器上部署Hadoop 偽分布式模式來類比 Hadoop 分布式。
二.安裝部署
Linux虛擬機器上JDK安裝配置,這裡就不介紹,我之前文章有介紹過了。
第一步:ssh無密碼驗證配置
1.查看一下SSH是否有安裝
2.基於空口令建立一個新的SSH密鑰,啟用無密碼登入
#ssh-keygen -t rsa -P ‘‘ -f~/.ssh/id_rsa
#cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
3.測試一下是否要求輸入密碼登陸
#ssh localhost :
這說明已經安裝成功,第一次登入時會詢問你是否繼續連結,輸入yes即可進入。
說明:
因為在Hadoop的安裝過程中,如果不配置無密碼登入,每次啟動Hadoop,需要輸入密碼登陸到DataNode,我們通常會做叢集,所以這樣就不方便我們操作。
第二步:部署hadoop
1.下載 http://hadoop.apache.org/
我們這邊下載的是hadoop-2.6.0.tar.gz
2.mkdir /usr/local/hadoop
3.#tar -zxvf hadoop-2.6.0.tar.gz//解壓
4.#vi /etc/profile //配置hadoop
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0
export PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
#source/etc/profile //使配置生效
5.配置core-site.xml,hdfs-site.xml及mapred-site.xml
#cd hadoop-2.6.0//進入hadoop解壓的目錄
etc/hadoop/core-site.xml<configuration> <property> <name>fs.default.name</name> <value>hdfs://192.168.74.129:9000</value></property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/tmp</value> </property> </configuration>etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.name.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/hdfs/name</value> <description>對namenode儲存路徑</description> </property> <property> <name>dfs.data.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/hdfs/data</value> <description>對datanode儲存路徑</description> </property> <property> <name>dfs.replication</name> <value>1</value> </property></configuration>etc/hadoop/mapred-site.xml<configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://192.168.74.129:9001</value></property> <property> <name>mapred.local.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/mapred/local</value> <description>儲存mapred自己使用的路徑</description> </property> <property> <name>mapred.system.dir</name> <value>/usr/local/hadoop/hadoop-2.6.0/mapred/system</value> <description>儲存mapred系統層級的路徑,可以共用</description> </property> </configuration>
6.修改hadoop-env.sh的jdk路徑
#vi etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_67
7.#hadoop namenode -format //格式化HDFS檔案系統以建立一個空大檔案系統。
執行成功:
產生core-site.xml,hdfs-site.xml及mapred-site.xml對應的目錄,:
第三步:啟動hadoop服務
1.#sbin/start-all.sh //啟動 sbin/stop-all.sh //關閉
2.#jps//驗證一下
3.在瀏覽器查看hadoop資訊
http://192.168.74.129:50070
http://192.168.74.129:8088 hadoop管理頁面
4.可以在 cd /usr/local/hadoop/hadoop-2.6.0/logs 查看日誌
三.運行hadoop例子並測試部署環境
1.我們從官方網的例子來運行一下,看看我們部署的hadoop環境是否正確,統計數代碼如下:
import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }}
上傳到hadoop解壓的目錄,:
2.查看有沒有目錄
#hadoop fs –ls //剛部署完,我們還沒建立目錄,所以會顯示沒目錄:
3.我們建立一個file0.txt文本,輸入內容,也就是我們要統計的單詞,:
4.建立輸入和輸出目錄
先在hdfs上建個檔案夾
#bin/hdfs dfs -mkdir –p /user/root/input
#bin/hdfs dfs -mkdir -p /user/root/output
5.把要統計的文本上傳到hdfs的輸入目錄下
# bin/hdfs dfs -put/usr/local/hadoop/hadoop-2.6.0/test/* /user/root/input //把tes/file0檔案上傳到hdfs的/user/root/input中
6.查看
#bin/hdfs dfs -cat /user/root/input/file0
7.編譯我們剛才寫的統計Java類WordCount.java
#bin/hadoop com.sun.tools.javac.Main WordCount.java
8.編譯好的WordCount.class建立一個 jar
jar cf wc.jar WordCount*.class
9.執行統計
#bin/hadoop jar wc.jar WordCount /user/root/input/user/root/output/count
10.查看輸出output
#bin/hdfs dfs -cat/user/root/output/count/part-r-00000
四.注意的地方
1.#hadoop namenode -format格式化時,HostName配置不對時,會報這個錯誤,:
分析:
#hsotname
這時在/etc/hosts檔案中找不到對應的這個hostname
解決方案:
1)vi /etc/hosts //修改設定的ip
2)#vi /etc/sysconfig/network //修改hostname
3)/etc/rc.d/init.d/network restart //重啟一下
如果沒修改過來,就重啟一下Linux虛擬機器
2.#hadoop fs –ls會出現
Java HotSpot(TM) Server VM warning: Youhave loaded library/usr/local/hadoop/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0 which might havedisabled stack guard. The VM will try to fix the stack guard now.
It‘s highly recommended that you fix thelibrary with ‘execstack -c <libfile>‘, or link it with ‘-z noexecstack‘.
解決:
#vi /etc/profile
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
#source /etc/profile
在執行一下hadoop fs –ls就不會出現這樣的問題,:
Hadoop2 偽分布式部署