“在過去的幾年里生成世界數(shù)據(jù)的90%。”
由于新技術(shù),設(shè)備,和類似的社交網(wǎng)站通信裝置的出現(xiàn),由人類產(chǎn)生的數(shù)據(jù)的量正在迅速每年都在增長。美國從一開始的時候,直到2003年生產(chǎn)的數(shù)據(jù)量為5十億字節(jié)。如果堆積在磁盤形式的數(shù)據(jù)可能填充整個足球場。相同量在每兩天創(chuàng)建于2011年,并在每十分鐘在2013年該速率仍在增長極大。雖然生產(chǎn)的所有信息是有意義的,在處理時是有用的,它被忽略。
大數(shù)據(jù)是不能用傳統(tǒng)的計算技術(shù)來處理大型數(shù)據(jù)集的集合。它不是一個單一的技術(shù)或工具,而它涉及的業(yè)務(wù)和技術(shù)的許多領(lǐng)域。
大數(shù)據(jù)包括通過不同的設(shè)備和應(yīng)用程序所產(chǎn)生的數(shù)據(jù)。下面給出的是一些大數(shù)據(jù)的保護傘下前來字段。
黑匣子數(shù)據(jù) :這是直升機,飛機和飛機的,組件等,它抓住了機組人員的聲音,麥克風(fēng)和耳機錄音和飛機的性能信息。
社會化媒體數(shù)據(jù) :社會化媒體,如Facebook和Twitter保持信息和張貼數(shù)百萬世界各地的人的意見。
聯(lián)交所數(shù)據(jù) :交易所數(shù)據(jù)保存有關(guān)的“買入”和“賣出”上由客戶提出不同的公司的比例作出決策的信息。
電網(wǎng)數(shù)據(jù) :電網(wǎng)數(shù)據(jù)保存由特定節(jié)點相對于基站所消耗的信息。
運輸數(shù)據(jù) :運輸數(shù)據(jù)包括車輛的型號,容量,距離和可用性。
搜索引擎數(shù)據(jù) :搜索引擎獲取大量來自不同數(shù)據(jù)庫中的數(shù)據(jù)。
因此,大數(shù)據(jù)包括體積龐大,高速和可擴展的各種數(shù)據(jù)。在它的數(shù)據(jù)將是三種類型。
結(jié)構(gòu)化數(shù)據(jù) :關(guān)系數(shù)據(jù)。
半結(jié)構(gòu)化數(shù)據(jù) :XML數(shù)據(jù)。
非結(jié)構(gòu)化數(shù)據(jù) :字,PDF,文本,媒體日志。
使用保持Facebook等社交網(wǎng)絡(luò)中的信息,營銷機構(gòu)了解他們的活動,促銷等廣告媒介的響應(yīng)。
在社會化媒體的喜好和他們的消費者的產(chǎn)品認知,產(chǎn)品企業(yè)和零售企業(yè)利用信息計劃生產(chǎn)。
關(guān)于使用患者以前的病歷資料,醫(yī)院提供更好的和快速的服務(wù)。
大數(shù)據(jù)的技術(shù)是在提供更準確的分析,這可能導(dǎo)致產(chǎn)生更大的操作效率,降低成本,更具體決策重要的,并且減少了為業(yè)務(wù)風(fēng)險。
要充分利用大數(shù)據(jù)的力量,你將需要能夠管理和處理實時結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的數(shù)量巨大,并且可以保護數(shù)據(jù)隱私和安全的基礎(chǔ)設(shè)施。
有在市場上的各種技術(shù)來自不同的廠商,包括亞馬遜,IBM,微軟等,以處理大數(shù)據(jù)。雖然尋找到了處理大數(shù)據(jù)的技術(shù),我們考察了以下兩類技術(shù):
這些包括像的MongoDB系統(tǒng),提供用于實時運行能力,其中數(shù)據(jù)主要捕捉和存儲互動工作負荷。
NoSQL的大數(shù)據(jù)系統(tǒng)的設(shè)計充分利用已經(jīng)出現(xiàn)在過去的十年,讓大量的計算,以廉價,高效地運行新的云計算架構(gòu)的優(yōu)勢。這使得運行大數(shù)據(jù)工作負載,更易于管理,更便宜,更快速地實現(xiàn)。
一些NoSQL系統(tǒng)可以提供深入了解基于與最少的編碼和無需數(shù)據(jù)科學(xué)家和增加的基礎(chǔ)設(shè)施的實時數(shù)據(jù)模式和趨勢。
這些包括像大規(guī)模并行處理(MPP)數(shù)據(jù)庫系統(tǒng)和MapReduce提供了可能觸及大部分或全部數(shù)據(jù)的回顧與復(fù)雜的分析分析能力的系統(tǒng)。
MapReduce的提供分析數(shù)據(jù)的基礎(chǔ)上的MapReduce可從單個服務(wù)器可以按比例放大至數(shù)千高端和低端機即由SQL提供的功能,并且一個系統(tǒng)的互補的新方法。
這兩類技術(shù)是互補的,并經(jīng)常一起部署。
操作 | 分析 | |
---|---|---|
潛伏 | 1毫秒 - 100毫秒 | 1分鐘 - 100分鐘 |
并發(fā) | 1000 - 100,000 | 1 - 10 |
訪問模式 | 寫入和讀取 | 讀 |
查詢 | 選擇 | 非選擇性 |
數(shù)據(jù)范圍 | 操作 | 回顧 |
最終用戶 | 顧客 | 數(shù)據(jù)科學(xué)家 |
技術(shù) | NoSQL的 | MapReduce的,MPP數(shù)據(jù)庫 |
與大數(shù)據(jù)相關(guān)的主要挑戰(zhàn)如下:
為了實現(xiàn)上述挑戰(zhàn),企業(yè)通常需要企業(yè)服務(wù)器的幫助。
在這種方法中,一個企業(yè)將有一個計算機存儲和處理大的數(shù)據(jù)。對于存儲而言,程序員將自己選擇的數(shù)據(jù)庫廠商,如Oracle,IBM等的幫助下在這種方法中,用戶與應(yīng)用程序,從而處理數(shù)據(jù)存儲和分析的部分進行互動。
這種方法正常工作與那些處理可以由標準數(shù)據(jù)庫服務(wù)器被容納,或至多被處理數(shù)據(jù)的處理器的限制少大量數(shù)據(jù)的應(yīng)用程序。但是,當(dāng)涉及到處理大量的可伸縮數(shù)據(jù),這是一個忙碌的任務(wù),通過一個單一的數(shù)據(jù)庫瓶頸來處理這些數(shù)據(jù)。
谷歌使用一種名為MapReduce算法解決了這個問題。這個算法將任務(wù)分成小份,并將它們分配到多臺計算機,并且收集從他們其結(jié)果整合時,形成結(jié)果數(shù)據(jù)集。
使用谷歌提供的解決方案,Doug Cutting開發(fā)和他的團隊開發(fā)的一個開源項目叫做HADOOP。
Hadoop的運行使用的MapReduce算法,其中數(shù)據(jù)是在與其他并行處理的應(yīng)用程序。總之,Hadoop是用于開發(fā)可以在海量數(shù)據(jù)進行完整的統(tǒng)計分析應(yīng)用。
Hadoop是寫在允許跨使用簡單的編程模型的計算機集群分布的大型數(shù)據(jù)集的處理Java的Apache的開源框架。 Hadoop框架應(yīng)用程序可在提供跨計算機集群的分布式存儲和計算的環(huán)境。 Hadoop是設(shè)計用來從單一服務(wù)器到上千臺機器的擴展,每提供本地計算和存儲。
在其核心,Hadoop的即有兩個主要層次:
MapReduce的是一個可靠的,容錯的方式,以書面的商品硬件在谷歌設(shè)計了大量數(shù)據(jù)的高效處理(多TB數(shù)據(jù)集)的分布式應(yīng)用程序,在大型集群(數(shù)千個節(jié)點)的并行編程模型。 MapReduce的程序在Hadoop是Apache的開源框架運行。
Hadoop分布式文件系統(tǒng)(HDFS)是基于谷歌文件系統(tǒng)(GFS),并提供被設(shè)計為在商用硬件上運行分布式文件系統(tǒng)。它與現(xiàn)有的分布式文件系統(tǒng)有許多相似之處。然而,來自其他分布式文件系統(tǒng)的差異顯著。它是高度容錯并且被設(shè)計為部署在低成本的硬件。將其提供給應(yīng)用程序數(shù)據(jù)高吞吐量連接,并且適用于具有大數(shù)據(jù)集的應(yīng)用程序。
除了上面提到的兩個核心組件,Hadoop框架還包括以下兩個模塊:
Hadoop的常見 :這些是Java庫和其他Hadoop的模塊所需的工具。
Hadoop的紗 :這是作業(yè)調(diào)度和集群資源管理的框架。
它是建立與處理大規(guī)模加工重配置更大的服務(wù)器相當(dāng)昂貴,但作為一種替代方法,您可以單CPU綁在一起許多商品的電腦,作為一個單一功能的分布式系統(tǒng),實際上,集群計算機可以讀取數(shù)據(jù)集平行,并提供一個高得多的吞吐量。此外,它是便宜的不止一個高端服務(wù)器。因此,這是背后使用Hadoop,它跨越集群和低成本的計算機上運行的第一個激勵因素。
Hadoop的運行跨計算機集群代碼。該方法包括的Hadoop執(zhí)行以下核心任務(wù):
Hadoop框架允許用戶快速地編寫和測試的分布式系統(tǒng)。它是有效的,并在機器和反過來它自動分發(fā)數(shù)據(jù)和工作,利用CPU內(nèi)核的基本平行度。
Hadoop的不依賴于硬件,以提供容錯和高可用性(FTHA),而Hadoop的庫本身已被設(shè)計成在應(yīng)用層檢測和處理故障。
服務(wù)器可以添加或從群集中動態(tài)刪除和Hadoop繼續(xù)運行而不中斷。
Hadoop的的另一大優(yōu)勢在于,除了是開源的,因為它是基于Java它是在所有的平臺兼容。
Hadoop是由GNU / Linux平臺和它的味道的支持。因此,我們必須安裝Linux操作系統(tǒng)的設(shè)置Hadoop的環(huán)境。如果你有比Linux等操作系統(tǒng),你可以在它安裝VirtualBox軟件,并讓Linux VirtualBox的內(nèi)部。
Hadoop的安裝到Linux環(huán)境之前,我們需要使用SSH(安全Shell)來設(shè)置Linux操作系統(tǒng)。按照有關(guān)設(shè)置Linux環(huán)境下面給出的步驟。
在開始的時候,建議創(chuàng)建一個單獨的用戶Hadoop的Hadoop的到文件系統(tǒng)從UNIX文件系統(tǒng)隔離開來。按照下面給出創(chuàng)建用戶的步驟:
打開Linux終端,然后鍵入以下命令來創(chuàng)建一個用戶。
$ su password: # useradd hadoop # passwd hadoop New passwd: Retype new passwd
SSH設(shè)置必須在集群上做不同的操作,如啟動,停止,分布式守護shell操作。來驗證的Hadoop不同的用戶,它需要一個Hadoop的用戶提供公共/私有密鑰對,并與不同的用戶共享。
下面的命令是用于生成使用SSH的鍵值對。復(fù)制公鑰形成id_rsa.pub authorized_keys的到,并提供業(yè)主與讀取和寫入權(quán)限分別authorized_keys文件。
$ ssh-keygen -t rsa $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 0600 ~/.ssh/authorized_keys
Java是Hadoop的主要先決條件。首先,你應(yīng)該使用命令“java -version”驗證java的存在在你的系統(tǒng)。 Java版本命令的語法如下。
$ java -version
如果一切正常,它會給你下面的輸出。
java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b13) Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
如果Java是沒有安裝在您的系統(tǒng),然后按照安裝Java下面給出的步驟。
下載Java(JDK <最新版本> - X64.tar.gz)通過訪問以下鏈接http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads1880260.html。
隨后的jdk-7u71-Linux的x64.tar.gz將被下載到您的系統(tǒng)。
通常你會發(fā)現(xiàn)在下載文件夾中下載的Java文件。驗證它,并使用以下命令解壓的jdk-7u71-Linux的x64.gz文件。
$ cd Downloads/ $ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz $ ls jdk1.7.0_71 jdk-7u71-linux-x64.gz
使Java提供給所有用戶,你必須將它移動到的位置“的/ usr /本地/”。打開根目錄,鍵入以下命令。
$ su password: # mv jdk1.7.0_71 /usr/local/ # exit
有關(guān)設(shè)置PATH和JAVA_HOME變量,添加下面的命令?/ .bashrc文件。
export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=PATH:$JAVA_HOME/bin
現(xiàn)在從終端驗證java -version命令如上述說明。
下載并使用下面的命令,從Apache Software Foundation的Hadoop的提取2.4.1。
$ su password: # cd /usr/local # wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/ hadoop-2.4.1.tar.gz # tar xzf hadoop-2.4.1.tar.gz # mv hadoop-2.4.1/* to hadoop/ # exit
一旦你已經(jīng)下載的Hadoop,你可以在三種支持的模式之一Hadoop集群:
本地/獨立模式 :在您的系統(tǒng)下載的Hadoop,默認情況下之后,它在獨立模式下配置,可運行作為一個單一的java程序。
偽分布式模式 :這是一個機器上的分布式仿真。每個Hadoop的后臺程序,如HDFS,紗,MapReduce的等,都將作為一個獨立的Java進程運行。這種模式是發(fā)展非常有用。
完全分布式的模式 :此模式與最少兩臺或多臺計算機作為群集完全分布式的。我們將詳細接下來的章節(jié)中碰到過這種模式。
在這里,我們將討論的Hadoop 2.4.1在獨立模式下安裝。
沒有運行守護程序和一切運行在單個JVM。獨立模式是適合發(fā)展的過程中運行MapReduce程序,因為它很容易測試和調(diào)試。
您可以通過附加下面的命令來的?/ .bashrc文件中設(shè)置的Hadoop環(huán)境變量。
export HADOOP_HOME=/usr/local/hadoop
在進一步討論之前,你需要確保Hadoop是工作的罰款。只需發(fā)出以下命令:
$ hadoop version
如果一切正常您的設(shè)置,那么你應(yīng)該看到以下結(jié)果:
Hadoop 2.4.1 Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768 Compiled by hortonmu on 2013-10-07T06:28Z Compiled with protoc 2.5.0 From source with checksum 79e53ce7994d1628b240f09af91e1af4
這意味著你的Hadoop的獨立模式的設(shè)置工作正常。缺省情況下,Hadoop的被配置為在非分布式模式的單個機器上運行。
讓我們來看看Hadoop的一個簡單的例子。 Hadoop的安裝提供了以下示例的MapReduce jar文件,它提供的MapReduce的基本功能,并可以用于在文件等的一個給定列表計算,像皮值,字計數(shù)
$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar
讓我們有一個輸入目錄,我們將推動幾個文件和我們的要求是計算單詞的那些文件的總數(shù)。要計算單詞總數(shù),我們不需要寫我們的MapReduce,提供的.jar文件包含字數(shù)實施。您可以使用相同的.jar文件嘗試其他的例子;剛剛發(fā)出以下命令通過Hadoop的MapReduce的例子-2.2.0.jar文件,檢查支持的MapReduce功能的方案。
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduceexamples-2.2.0.jar
創(chuàng)建輸入目錄中的臨時文件的內(nèi)容。您可以創(chuàng)建這個目錄輸入任何你想工作。
$ mkdir input $ cp $HADOOP_HOME/*.txt input $ ls -l input
它會給你輸入目錄下面的文件:
total 24 -rw-r--r-- 1 root root 15164 Feb 21 10:14 LICENSE.txt -rw-r--r-- 1 root root 101 Feb 21 10:14 NOTICE.txt -rw-r--r-- 1 root root 1366 Feb 21 10:14 README.txt
這些文件已經(jīng)從Hadoop的安裝主目錄復(fù)制。對于您的實驗,可以有不同的大型文件集。
讓我們開始Hadoop的過程中在全體輸入目錄中提供的文件中單詞的總數(shù),具體如下:
$ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduceexamples-2.2.0.jar wordcount input output
步驟2將做必要的處理和保存輸出/部分r00000文件的輸出,你可以使用查詢:
$cat output/*
它會列出了所有的單詞,他們都在輸入目錄中可用的文件中提供總計數(shù)一起。
"AS 4 "Contribution" 1 "Contributor" 1 "Derivative 1 "Legal 1 "License" 1 "License"); 1 "Licensor" 1 "NOTICE” 1 "Not 1 "Object" 1 "Source” 1 "Work” 1 "You" 1 "Your") 1 "[]" 1 "control" 1 "printed 1 "submitted" 1 (50%) 1 (BIS), 1 (C) 1 (Don't) 1 (ECCN) 1 (INCLUDING 2 (INCLUDING, 2 .............
請參閱下面的偽分布式模式下安裝Hadoop的2.4.1的步驟。
您可以通過附加下面的命令來的?/ .bashrc文件中設(shè)置的Hadoop環(huán)境變量。
export HADOOP_HOME=/usr/local/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export HADOOP_INSTALL=$HADOOP_HOME
現(xiàn)在,應(yīng)用所有更改到當(dāng)前正在運行的系統(tǒng)。
$ source ~/.bashrc
你可以找到所有的位置“$ HADOOP_HOME的/ etc / Hadoop的”Hadoop的配置文件。這是需要根據(jù)您的Hadoop基礎(chǔ)架構(gòu),使這些配置文件中的變化。
$ cd $HADOOP_HOME/etc/hadoop
為了用Java開發(fā)的Hadoop程序,你必須用java在你的系統(tǒng)中的位置替換JAVA_HOME值重置hadoop-env.sh文件中的Java環(huán)境變量。
export JAVA_HOME=/usr/local/jdk1.7.0_71
以下是你必須編輯配置Hadoop的文件列表。
核心的site.xml
芯- site.xml文件中包含的信息,如讀/寫緩沖器的用于的Hadoop實例的端口號,分配給文件系統(tǒng)存儲,存儲器限制,用于存儲數(shù)據(jù),和大小。
打開核心site.xml中,并在<配置>,</配置>標記之間添加以下屬性。
<configuration> <property> <name>fs.default.name </name> <value> hdfs://localhost:9000 </value> </property> </configuration>
HDFS-site.xml中
HDFS的-site.xml文件中包含的信息,如復(fù)制數(shù)據(jù)的價值,名稱節(jié)點路徑,您的本地文件系統(tǒng)的數(shù)據(jù)節(jié)點的路徑。這意味著要存儲在Hadoop基礎(chǔ)設(shè)施的地方。
讓我們假設(shè)以下數(shù)據(jù)。
dfs.replication (data replication value) = 1 (In the below given path /hadoop/ is the user name. hadoopinfra/hdfs/namenode is the directory created by hdfs file system.) namenode path = //home/hadoop/hadoopinfra/hdfs/namenode (hadoopinfra/hdfs/datanode is the directory created by hdfs file system.) datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
打開此文件并在此文件中的<configuration>之間添加以下屬性</配置>標記。
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.name.dir</name> <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value> </property> <property> <name>dfs.data.dir</name> <value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value> </property> </configuration>
注意:在上面的文件,所有的屬性值是用戶定義的,你可以根據(jù)自己的Hadoop基礎(chǔ)架構(gòu)進行更改。
紗的site.xml
此文件用于配置紗線進Hadoop的。打開紗線site.xml文件,并在<配置>之間</配置>標簽在此文件中添加以下屬性。
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
mapred-site.xml中
此文件用于指定我們正在使用的MapReduce框架。默認情況下,Hadoop的含有紗-site.xml中的一個模板。首先,需要將文件從mapred現(xiàn)場,xml.template使用以下命令mapred-site.xml文件復(fù)制。
$ cp mapred-site.xml.template mapred-site.xml
打開mapred-site.xml文件,并在<配置>之間</配置>標簽在此文件中添加以下屬性。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
下面的步驟被用來驗證在Hadoop安裝。
使用命令“HDFS的NameNode -format”如下設(shè)置名稱節(jié)點。
$ cd ~ $ hdfs namenode -format
預(yù)期的結(jié)果如下。
10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = localhost/192.168.1.11 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 2.4.1 ... ... 10/24/14 21:30:56 INFO common.Storage: Storage directory /home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted. 10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0 10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11 ************************************************************/
下面的命令用來啟動DFS。執(zhí)行該命令將啟動您的Hadoop文件系統(tǒng)。
$ start-dfs.sh
期望的輸出如下所示:
10/24/14 21:37:56 Starting namenodes on [localhost] localhost: starting namenode, logging to /home/hadoop/hadoop 2.4.1/logs/hadoop-hadoop-namenode-localhost.out localhost: starting datanode, logging to /home/hadoop/hadoop 2.4.1/logs/hadoop-hadoop-datanode-localhost.out Starting secondary namenodes [0.0.0.0]
下面的命令被用于啟動紗線腳本。執(zhí)行該命令將啟動紗守護進程。
$ start-yarn.sh
期望的輸出如下:
starting yarn daemons starting resourcemanager, logging to /home/hadoop/hadoop 2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out localhost: starting nodemanager, logging to /home/hadoop/hadoop 2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
訪問Hadoop的默認端口號是50070.使用以下網(wǎng)址獲得瀏覽器的Hadoop的服務(wù)。
http://localhost:50070/
訪問集群中的所有應(yīng)用程序的默認端口號為8088。使用下列URL訪問該服務(wù)。
http://localhost:8088/
Hadoop的文件系統(tǒng)使用分布式文件系統(tǒng)的設(shè)計開發(fā)。它在商用硬件上運行。不像其他的分布式系統(tǒng),HDFS是高度容錯和使用低成本的硬件設(shè)計。
HDFS擁有非常龐大的數(shù)據(jù)量,并提供更容易獲得。為了存儲這些龐大的數(shù)據(jù),這些文件都存儲在多臺機器。這些文件存儲在冗余方式營救從可能的數(shù)據(jù)損失系統(tǒng)中發(fā)生故障的情況下。 HDFS也使得可用于并行處理的應(yīng)用程序。
給出下面是在Hadoop文件系統(tǒng)的體系結(jié)構(gòu)。
HDFS遵循主從架構(gòu),它具有以下元素。
NameNode的是包含GNU / Linux的操作系統(tǒng)和軟件名稱節(jié)點商品硬件。它是一個可以在商用硬件上運行軟件。具有名稱節(jié)點系統(tǒng)作為主服務(wù)器,并執(zhí)行以下任務(wù):
該Datanode的是具有GNU / Linux的操作系統(tǒng)和軟件Datanode的商品硬件。對于集群中的每個節(jié)點(商品硬件/系統(tǒng)),會有一個Datanode的。這些節(jié)點管理其系統(tǒng)的數(shù)據(jù)的存儲。
一般用戶數(shù)據(jù)存儲在HDFS的文件。在一個文件系統(tǒng)中的文件將被劃分為一個或多個分段和/或存儲在個人數(shù)據(jù)的節(jié)點。這些文件段被稱為塊。換句話說,即HDFS可以讀或?qū)憯?shù)據(jù)的最小量被稱為塊。缺省塊大小為64MB,但它可以增加按需要在HDFS配置來改變。
故障檢測和恢復(fù) :由于HDFS包括大量的商品硬件,部件故障頻繁。因此HDFS應(yīng)該具有快速和自動故障檢測和恢復(fù)機制。
龐大的數(shù)據(jù)集 :HDFS應(yīng)該有幾百個群集節(jié)點的管理有著極大的數(shù)據(jù)集的應(yīng)用程序。
在硬件數(shù)據(jù) :請求的任務(wù),可以有效地進行,當(dāng)計算需要數(shù)據(jù)近的地方。特別是在大的數(shù)據(jù)集都參與,它減少了網(wǎng)絡(luò)通信量,并增加了吞吐量。
首先,您必須格式化配置的HDFS文件系統(tǒng),開放式的NameNode(HDFS服務(wù)器),然后執(zhí)行以下命令。
$ hadoop namenode -format
格式化HDFS后,啟動分布式文件系統(tǒng)。以下命令將啟動名稱節(jié)點,以及為群集數(shù)據(jù)節(jié)點。
$ start-dfs.sh
裝載在服務(wù)器中的信息后,我們可以發(fā)現(xiàn)文件列表中的目錄,文件的狀態(tài),使用'ls'的。下面給出的是可以傳遞給目錄或文件名作為參數(shù)LS的語法。
$ $HADOOP_HOME/bin/hadoop fs -ls <args>
假設(shè)我們有在本地系統(tǒng),它是所謂file.txt的文件中的數(shù)據(jù)應(yīng)當(dāng)被保存在HDFS文件系統(tǒng)。按照下面給出插入在Hadoop文件系統(tǒng)所需的文件的步驟。
你必須創(chuàng)建一個輸入目錄。
$ $HADOOP_HOME/bin/hadoop fs -mkdir /user/input
轉(zhuǎn)讓和使用put命令的本地系統(tǒng),在Hadoop文件系統(tǒng)存儲數(shù)據(jù)文件。
$ $HADOOP_HOME/bin/hadoop fs -put /home/file.txt /user/input
您可以使用ls命令驗證文件。
$ $HADOOP_HOME/bin/hadoop fs -ls /user/input
假設(shè)我們在HDFS文件名為OUTFILE。下面給出的是從檢索在Hadoop文件系統(tǒng)所需的文件,一個簡單的演示。
最初,查看使用cat命令從HDFS的數(shù)據(jù)。
$ $HADOOP_HOME/bin/hadoop fs -cat /user/output/outfile
得到HDFS文件使用GET命令在本地文件系統(tǒng)。
$ $HADOOP_HOME/bin/hadoop fs -get /user/output/ /home/hadoop_tp/
您可以通過使用以下命令關(guān)閉HDFS。
$ stop-dfs.sh
還有在“$ HADOOP_HOME /斌/ Hadoop的FS”,比在這里展示更多的命令,盡管這些基本的操作都將讓你開始。沒有額外的參數(shù)運行./bin/hadoop DFS將列出可與FsShell系統(tǒng)運行的所有命令。此外,$ HADOOP_HOME /斌/ Hadoop的FS -help的CommandName將顯示有問題的操作很短的使用摘要,如果你被卡住。
所有的操作的表如下所示。下列約定用于參數(shù):
"<path>" means any file or directory name. "<path>..." means one or more file or directory names. "<file>" means any filename. "<src>" and "<dest>" are path names in a directed operation. "<localSrc>" and "<localDest>" are paths as above, but on the local file system.
所有其他文件和路徑名稱是指內(nèi)部HDFS的對象。
命令 | 描述 |
---|---|
-ls <路徑> | 列出路徑指定的目錄中的內(nèi)容,示出了名稱,權(quán)限,擁有者,大小和修改日期為每個條目。 |
-lsr <路徑> | 行為類似-ls,但遞歸顯示路徑的所有子目錄項。 |
-du <路徑> | 顯示磁盤使用情況,以字節(jié)為單位,對于所有的文件,這些文件匹配路徑;文件名報告與全HDFS協(xié)議前綴。 |
-dus <路徑> | -du一樣,但打印路徑中的所有文件/目錄的磁盤使用情況的摘要。 |
-mv <來源> <目標> | 移動由src表示的文件或目錄 |
到dest,在HDFS。 | |
-cp <來源> <目標> | 副本由src標識的文件或目錄什特內(nèi)HDFS。 |
-rm <路徑> | 刪除文件或路徑標識空目錄。 |
-rmr <路徑> | 刪除路徑標識的文件或目錄。遞歸刪除所有子條目(例如,文件或路徑的子目錄)。 |
-put <localSrc> <目標> | 從localSrc標識的本地文件系統(tǒng)中的文件或目錄復(fù)制到DFS內(nèi)什特。 |
-copyFromLocal <localSrc> <目標> | 相同-put |
-moveFromLocal <localSrc> <目標> | 從localSrc標識的本地文件系統(tǒng)中的文件或目錄復(fù)制到HDFS內(nèi)什特,然后刪除成功的本地副本。 |
-get [-CRC] <來源> <localDest> | 份在由src確定由localDest標識的本地文件系統(tǒng)路徑HDFS的文件或目錄。 |
-getmerge <來源> <localDest> | 檢索到由localDest確定的本地文件系統(tǒng)中的單一,合并后的文件的路徑SRC在HDFS匹配的所有文件,并復(fù)制它們。 |
-cat <filen-AME> | 顯示在標準輸出文件名的內(nèi)容。 |
-copyToLocal <來源> <localDest> | 相同-GET |
-moveToLocal <來源> <localDest> | 工程就像-get,但刪除HDFS上的成功復(fù)制。 |
-mkdir <路徑> | 在創(chuàng)建一個HDFS命名的目錄路徑。 |
創(chuàng)建路徑中的任何父目錄的缺失(例如,MKDIR -p在Linux中)。 | |
-setrep [-R] [-w]代表<路徑> | 設(shè)置路徑標識來代表文件的目標文件復(fù)制因子。 (實際的復(fù)制因子會朝著目標隨著時間的推移移動) |
-touchz <路徑> | 創(chuàng)建在路徑包含當(dāng)前時間作為時間戳的文件。如果失敗的文件已經(jīng)存在路徑,除非文件已經(jīng)是大小為0。 |
- 測試 - [EZD] <路徑> | 返回1,如果路徑存在;長度為零;或者是一個目錄,否則為0。 |
-stat [格式] <路徑> | 輸出關(guān)于路徑信息。格式是接受在塊文件大?。ǎ)中,文件名(%N),塊大?。ā耄?,復(fù)制(%R),和修改日期(%Y,%Y)的字符串。 |
-tail [-f] <file2name> | 顯示在標準輸出文件的最后1KB。 |
-chmod [-R]模式,模式,... <路徑> ... | 更改與路徑標識的一個或多個對象相關(guān)聯(lián)的文件權(quán)限....與R模式遞歸執(zhí)行的變化是一個3位八進制模式,或{} augo +/- {} rwxX。如果沒有指定范圍,不適用的假設(shè)的umask。 |
-chown [-R] [車主] [:[組] <路徑> ... | 設(shè)置由路徑標識的文件或目錄所屬的用戶和/或組....如果指定-R遞歸集所有者。 |
chgrp命令[-R]組<路徑> ... | 設(shè)置由路徑標識的文件或目錄所屬組....如果指定-R遞歸設(shè)置組。 |
-help <CMD-名稱> | 返回上面列出的命令之一使用信息。在cmd中人物 - 你必須省略開頭的''。 |
MapReduce的是使用它我們可以編寫應(yīng)用程序來處理大量的數(shù)據(jù),同時,在一個可靠的方式的商品硬件的大型集群的框架。
MapReduce的是一種處理技術(shù)和基于Java的分布式計算程序的模型。 MapReduce的算法中包含兩個重要的任務(wù),即Map和Reduce。地圖采用了一組數(shù)據(jù),并將其轉(zhuǎn)換成另一組數(shù)據(jù),其中,各個元件被分解成元組(鍵/值對)的。其次,減少任務(wù),這需要輸出從地圖作為輸入并組合那些數(shù)據(jù)元組到一個較小的元組的集合。作為MapReduce的暗示的名稱的序列中,減少任務(wù)總是在地圖作業(yè)之后進行。
MapReduce的主要優(yōu)點是,它是在多個計算節(jié)點易于大規(guī)模數(shù)據(jù)處理。下MapReduce的模型中,數(shù)據(jù)處理的原語被稱為映射器和減速器。分解數(shù)據(jù)處理應(yīng)用到映射器和減速器有時是平凡的。但是,一旦我們譜寫的MapReduce形式的應(yīng)用程序,擴展到運行在幾百,幾千,或數(shù)千臺機器甚至幾十集群中的應(yīng)用僅僅是一個配置更改。這個簡單的可擴展性是吸引了眾多程序員使用的MapReduce模型。
一般來說MapReduce的范例是基于發(fā)送計算機數(shù)據(jù)所在!
MapReduce的程序執(zhí)行在三個階段,即映射階段,洗牌階段,并降低的階段。
地圖階段 :地圖或映射器的任務(wù)是處理輸入數(shù)據(jù)。一般輸入數(shù)據(jù)是在文件或目錄的形式,并且被存儲在Hadoop的文件系統(tǒng)(HDFS)。輸入文件被傳遞到由線映射器功能線路。映射器處理該數(shù)據(jù),并創(chuàng)建數(shù)據(jù)的幾個小塊。
減少階段 :這一階段是洗牌階段的組合和減少階段。減速機的工作是處理來自映射器中的數(shù)據(jù)。處理之后,它產(chǎn)生一組新的輸出,這將被存儲在HDFS。
在一個MapReduce工作,Hadoop的發(fā)送Map和Reduce任務(wù)到集群中的相應(yīng)的服務(wù)器。
框架管理數(shù)據(jù)傳遞例如發(fā)出任務(wù)的節(jié)點之間的簇周圍的所有細節(jié),驗證任務(wù)完成,和復(fù)制數(shù)據(jù)。
大部分的計算的需要與對減少網(wǎng)絡(luò)流量本地磁盤上的數(shù)據(jù)的節(jié)點處。
的給定的任務(wù)完成后,將群集收集并降低了數(shù)據(jù),以形成一個適當(dāng)?shù)慕Y(jié)果,并且將其發(fā)送回Hadoop的服務(wù)器。
MapReduce框架上的<鍵,值>對工作,也就是說,框架的輸入看工作作為一組<鍵,值>對,并產(chǎn)生一組<鍵,值>對作為作業(yè)的輸出,可以想象不同的類型。
鍵和值類應(yīng)該由框架是序列化的方式,因此,需要實現(xiàn)可寫的接口。此外,key類必須實現(xiàn)可寫可比接口,方便框架執(zhí)行排序。輸入和輸出類型MapReduce的工作:(輸入)<K1,V1> - >地圖 - > <K2,V2> - >減少 - > <K3,V3>(輸出)。
輸入 | 產(chǎn)量 | |
---|---|---|
地圖 | <K1,V1> | 列表(<K2,V2>) |
減少 | <K2,列表(V2)> | 列表(<K3,V3>) |
有效負載 -應(yīng)用程序?qū)崿F(xiàn)地圖和減少功能,形成工作的核心。
映射 -映射INPUT鍵/值對映射到一組中間鍵/值對。
NamedNode -節(jié)點,管理Hadoop分布式文件系統(tǒng)(HDFS)。
DataNode會 -節(jié)點,在數(shù)據(jù)被提前給出任何處理發(fā)生之前。
MasterNode -節(jié)點,在運行的JobTracker和接受來自客戶端作業(yè)請求。
SlaveNode -節(jié)點,在Map和Reduce程序運行。
JobTracker的 -調(diào)度作業(yè)并跟蹤工作指派給任務(wù)跟蹤器。
任務(wù)追蹤 -跟蹤任務(wù)和報告狀態(tài)的JobTracker。
招聘 -程序是跨數(shù)據(jù)集的映射和減速的執(zhí)行。
任務(wù) -一個映射的執(zhí)行或數(shù)據(jù)的切片一個減速。
任務(wù)嘗試 -試圖在SlaveNode執(zhí)行任務(wù)的特定實例。
給出下面是關(guān)于一個組織的電力消耗的數(shù)據(jù)。它包含每月的電力消耗,年均各種年。
一月 | 二月 | 損傷 | 四月 | 可能 | 君 | 七月 | 八月 | 九月 | 十月 | 十一月 | 十二月 | 平均 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1979年 | 23 | 23 | 2 | 43 | 24 | 25 | 26 | 26 | 26 | 26 | 25 | 26 | 25 |
1980年 | 26 | 27 | 28 | 28 | 28 | 三十 | 31 | 31 | 31 | 三十 | 三十 | 三十 | 29 |
1981年 | 31 | 32 | 32 | 32 | 33 | 34 | 35 | 36 | 36 | 34 | 34 | 34 | 34 |
1984年 | 39 | 38 | 39 | 39 | 39 | 41 | 42 | 43 | 40 | 39 | 38 | 38 | 40 |
1985年 | 38 | 39 | 39 | 39 | 39 | 41 | 41 | 41 | 00 | 40 | 39 | 39 | 45 |
如果上述數(shù)據(jù)作為輸入,我們必須編寫應(yīng)用程序來處理它而產(chǎn)生的結(jié)果,如發(fā)現(xiàn)最大使用量,最低使用年限的一年,依此類推。這對于有限數(shù)目的記錄程序員輕易獲勝。他們會簡單地寫,以產(chǎn)生所需的輸出的邏輯和數(shù)據(jù)傳遞給寫入的應(yīng)用程序。
但是,認為代表一個特定國家的一切大規(guī)模產(chǎn)業(yè)的電力消耗數(shù)據(jù),因為它的形成。
當(dāng)我們編寫應(yīng)用程序來處理這樣的大量數(shù)據(jù),
要解決這些問題,我們有MapReduce框架。
上述數(shù)據(jù)保存為sample.txt的和作為輸入給出。輸入文件看起來如下所示。
1979 23 23 2 43 24 25 26 26 26 26 25 26 25 1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34 1984 39 38 39 39 39 41 42 43 40 39 38 38 40 1985 38 39 39 39 39 41 41 41 00 40 39 39 45
下面給出的是程序使用MapReduce框架樣本數(shù)據(jù)。
package hadoop; import java.util.*; import java.io.IOException; import java.io.IOException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; public class ProcessUnits { //Mapper class public static class E_EMapper extends MapReduceBase implements Mapper<LongWritable ,/*Input key Type */ Text, /*Input value Type*/ Text, /*Output key Type*/ IntWritable> /*Output value Type*/ { //Map function public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.toString(); String lasttoken = null; StringTokenizer s = new StringTokenizer(line," "); String year = s.nextToken(); while(s.hasMoreTokens()){lasttoken=s.nextToken();} int avgprice = Integer.parseInt(lasttoken); output.collect(new Text(year), new IntWritable(avgprice)); } } //Reducer class public static class E_EReduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable > { //Reduce function public void reduce( Text key, Iterator <IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { int maxavg=30; int val=Integer.MIN_VALUE; while (values.hasNext()) { if((val=values.next().get())>maxavg) { output.collect(key, new IntWritable(val)); } } } } //Main function public static void main(String args[])throws Exception { JobConf conf = new JobConf(Eleunits.class); conf.setJobName("max_eletricityunits"); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); conf.setMapperClass(E_EMapper.class); conf.setCombinerClass(E_EReduce.class); conf.setReducerClass(E_EReduce.class); conf.setInputFormat(TextInputFormat.class); conf.setOutputFormat(TextOutputFormat.class); FileInputFormat.setInputPaths(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); JobClient.runJob(conf); } }
保存上述程序作為ProcessUnits.java。匯編和程序的執(zhí)行進行說明。
讓我們假設(shè)我們是在一個Hadoop的用戶(例如/家庭/ Hadoop的)的主目錄。
按照下面給出的編譯和執(zhí)行上述程序的步驟。
下面的命令是創(chuàng)建一個目錄來存儲編譯的Java類。
$ mkdir units
下載Hadoop的芯1.2.1.jar,其用于編譯和執(zhí)行的MapReduce程序。訪問以下鏈接http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/1.2.1下載JAR。讓我們假設(shè)下載的文件夾是/ home / Hadoop的/。
下面的命令用于編譯ProcessUnits.java程序,并為該程序創(chuàng)建一個罐子。
$ javac -classpath hadoop-core-1.2.1.jar -d units ProcessUnits.java $ jar -cvf units.jar -C units/ .
下面的命令用于創(chuàng)建HDFS中輸入目錄。
$HADOOP_HOME/bin/hadoop fs -mkdir input_dir
下面的命令用于復(fù)制名為SAMPLE.TXT在HDFS中的輸入目錄中的輸入文件。
$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/sample.txt input_dir
下面的命令被用來驗證在輸入目錄中的文件。
$HADOOP_HOME/bin/hadoop fs -ls input_dir/
下面的命令被用于通過從輸入目錄取輸入文件來運行Eleunit_max應(yīng)用。
$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir
直到執(zhí)行文件,稍等片刻。執(zhí)行之后,如下所示,輸出將包含輸入分割的,數(shù)量,地圖的任務(wù)數(shù),減速器任務(wù)的數(shù)量等。
INFO mapreduce.Job: Job job_1414748220717_0002 completed successfully 14/10/31 06:02:52 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=61 FILE: Number of bytes written=279400 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=546 HDFS: Number of bytes written=40 HDFS: Number of read operations=9 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=2 Launched reduce tasks=1 Data-local map tasks=2 Total time spent by all maps in occupied slots (ms)=146137 Total time spent by all reduces in occupied slots (ms)=441 Total time spent by all map tasks (ms)=14613 Total time spent by all reduce tasks (ms)=44120 Total vcore-seconds taken by all map tasks=146137 Total vcore-seconds taken by all reduce tasks=44120 Total megabyte-seconds taken by all map tasks=149644288 Total megabyte-seconds taken by all reduce tasks=45178880 Map-Reduce Framework Map input records=5 Map output records=5 Map output bytes=45 Map output materialized bytes=67 Input split bytes=208 Combine input records=5 Combine output records=5 Reduce input groups=5 Reduce shuffle bytes=6 Reduce input records=5 Reduce output records=5 Spilled Records=10 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=948 CPU time spent (ms)=5160 Physical memory (bytes) snapshot=47749120 Virtual memory (bytes) snapshot=2899349504 Total committed heap usage (bytes)=277684224 File Output Format Counters Bytes Written=40
下面的命令被用來驗證在輸出文件夾的結(jié)果文件。
$HADOOP_HOME/bin/hadoop fs -ls output_dir/
下面的命令來查看部分-00000的文件輸出。此文件由HDFS產(chǎn)生。
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000
下面是由MapReduce的程序所產(chǎn)生的輸出。
1981 34 1984 40 1985 45
下面的命令用于從HDFS輸出文件夾復(fù)制到本地文件系統(tǒng)的分析。
$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000/bin/hadoop dfs get output_dir /home/hadoop
所有的Hadoop命令由$ HADOOP_HOME /斌/ Hadoop的命令調(diào)用。不帶任何參數(shù)運行的Hadoop腳本會打印所有命令的描述。
用法 :hadoop的[--config confdir]命令
下表列出了可用的選項及其說明。
選項 | 描述 |
---|---|
NameNode的-format | 格式化DFS文件系統(tǒng)。 |
secondarynamenode | 運行DFS二次名稱節(jié)點。 |
名稱節(jié)點 | 運行DFS名稱節(jié)點。 |
數(shù)據(jù)節(jié)點 | 運行一個DFS的Datanode。 |
dfsadmin | 運行DFS管理客戶端。 |
mradmin | 運行地圖,減少管理客戶端。 |
fsck的 | 運行DFS文件系統(tǒng)檢查工具。 |
FS | 運行一個通用的文件系統(tǒng)的用戶客戶端。 |
平衡器 | 運行的集群平衡工具。 |
OIV | 適用于離線的FsImage觀眾的的FsImage。 |
fetchdt | 獲取來自NameNode的一個代表團令牌。 |
的JobTracker | 運行MapReduce工作跟蹤節(jié)點。 |
管道 | 運行一個管道的工作。 |
的TaskTracker | 運行MapReduce的任務(wù)跟蹤節(jié)點。 |
historyserver | 運行作業(yè)歷史記錄服務(wù)器作為一個獨立的守護進程。 |
工作 | 操縱MapReduce工作。 |
隊列 | 獲取有關(guān)JobQueues信息。 |
版 | 打印版本。 |
罐子<瓶> | 運行一個jar文件。 |
DistCp使用<srcurl> <desturl> | 復(fù)制文件或目錄的遞歸。 |
distcp2 <srcurl> <desturl> | DistCp使用第2版。 |
歸檔-archiveName名-p | 創(chuàng)建一個Hadoop的歸檔。 |
<父路徑> <來源> * <目標> | |
類路徑 | 打印得到Hadoop的罐子和所需要的庫所需的類路徑。 |
daemonlog | 獲取/設(shè)置日志級別,每個守護進程 |
用法:Hadoop的工作[GENERIC_OPTIONS]
以下是在Hadoop作業(yè)的可用通用的選項。
GENERIC_OPTIONS | 描述 |
---|---|
-submit <作業(yè)文件> | 提交作業(yè)。 |
狀態(tài)<作業(yè)ID> | 打印地圖和減少完工百分比且所有作業(yè)計數(shù)器。 |
反<作業(yè)ID> <組名> <countername> | 打印的計數(shù)器值。 |
-kill <作業(yè)ID> | 殺死作業(yè)。 |
-events <作業(yè)ID> <fromevent - #> <# - 的事件> | 通過打印為JobTracker的給定范圍內(nèi)收到的事件“的詳細信息。 |
-history [全部] <jobOutputDir> - 歷史<jobOutputDir> | 打印作業(yè)的詳細信息,沒打死尖的細節(jié)。有關(guān)作業(yè),如每個任務(wù)取得成功的任務(wù)和任務(wù)嘗試更多的細節(jié)可以通過指定[全部]選項查看。 |
-list [全部] | 顯示所有作業(yè)。那還-list只顯示作業(yè)完成。 |
-kill任務(wù)<任務(wù)ID> | 殺死任務(wù)。打死任務(wù)不會計入失敗的嘗試。 |
-fail任務(wù)<任務(wù)ID> | 失敗的任務(wù)。失敗的任務(wù)計入 |
失敗的嘗試。 | |
設(shè)置優(yōu)先級<作業(yè)ID> <優(yōu)先級> | 改變作業(yè)的優(yōu)先級。允許的優(yōu)先級值是VERY_HIGH,高,中,低,VERY_LOW |
$ $HADOOP_HOME/bin/hadoop job -status <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -status job_201310191043_0004
$ $HADOOP_HOME/bin/hadoop job -history <DIR-NAME> e.g. $ $HADOOP_HOME/bin/hadoop job -history /user/expert/output
$ $HADOOP_HOME/bin/hadoop job -kill <JOB-ID> e.g. $ $HADOOP_HOME/bin/hadoop job -kill job_201310191043_0004
Hadoop的數(shù)據(jù)流是自帶的Hadoop發(fā)行的實用程序。此實用程序允許您創(chuàng)建和運行地圖/任何可執(zhí)行文件或腳本映射器和/或減速Reduce作業(yè)。
對于Hadoop的數(shù)據(jù)流,我們所考慮的字計數(shù)問題。 Hadoop中的任何作業(yè)必須有兩個階段:映射器和減速。我們已經(jīng)編寫代碼映射器和python腳本減速到Hadoop的下運行它。一個也可以寫在Perl和Ruby相同。
!/usr/bin/python import sys # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Break the line into words words = myline.split() # Iterate the words list for myword in words: # Write the results to standard output print '%s %s' % (myword, 1)
請確保此文件具有執(zhí)行權(quán)限(使用chmod + X /家庭/專家/ Hadoop的1.2.1 / mapper.py)。
#!/usr/bin/python from operator import itemgetter import sys current_word = "" current_count = 0 word = "" # Input takes from standard input for myline in sys.stdin: # Remove whitespace either side myline = myline.strip() # Split the input we got from mapper.py word, count = myline.split(' ', 1) # Convert count variable to integer try: count = int(count) except ValueError: # Count was not a number, so silently ignore this line continue if current_word == word: current_count += count else: if current_word: # Write result to standard output print '%s %s' % (current_word, current_count) current_count = count current_word = word # Do not forget to output the last word if needed! if current_word == word: print '%s %s' % (current_word, current_count)
保存在Hadoop的主目錄mapper.py和reducer.py映射器和減速機代碼。確保這些文件具有執(zhí)行權(quán)限(搭配chmod + X mapper.py和chmod + X reducer.py)。由于蟒蛇是壓痕敏感,因此相同的代碼可以從以下鏈接下載。
$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1. 2.1.jar -input input_dirs -output output_dir -mapper <path/mapper.py -reducer <path/reducer.py
其中,“”用于續(xù)行清晰易讀。
./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py
在上面的例子中,無論是映射器和減速是從標準輸入讀取的輸入,并發(fā)射輸出到標準輸出Python腳本。該實用程序?qū)?chuàng)建一個Map / Reduce作業(yè),作業(yè)提交到一個合適的集群,并監(jiān)視作業(yè)的進度,直到它完成。
當(dāng)映射器指定的腳本,每個映射任務(wù)將啟動腳本作為一個單獨的進程時,映射被初始化。作為mapper任務(wù)運行時,它的輸入轉(zhuǎn)換成線和進料線,該方法的標準輸入(STDIN)。在此期間,映射器收集來自該方法的標準輸出(stdout)的面向行的輸出和各線轉(zhuǎn)換成鍵/值對,其被收集作為映射器的輸出。默認情況下,行至第一個制表符的前綴是關(guān)鍵,該行(不包括制表符)的其余部分將是價值。如果在該行沒有制表符,則整個行被視為鍵和值為null。然而,這可以被定制,因為每一需求。
當(dāng)減速指定的腳本,每次減速任務(wù)將啟動腳本作為一個單獨的進程,然后減速被初始化。作為減速器任務(wù)運行時,將其轉(zhuǎn)換其輸入的鍵/值對入線和饋送線的過程中的標準輸入(STDIN)。在此期間,該減速器收集來自該方法的標準輸出(stdout)的面向行的輸出,每行轉(zhuǎn)換成鍵/值對,其被收集作為減速機的輸出。默認情況下,行至第一個制表符的前綴是關(guān)鍵,該行(不包括制表符)的其余部分的價值。然而,這可以被定制為每具體要求。
參數(shù) | 選項 | 描述 |
---|---|---|
-input目錄/文件名 | 需要 | 輸入位置映射器。 |
- 輸出目錄名 | 需要 | 為減速機的輸出位置。 |
-mapper可執(zhí)行文件或腳本或JavaClassName | 需要 | 映射器可執(zhí)行文件。 |
-reducer可執(zhí)行文件或腳本或JavaClassName | 需要 | 減速機可執(zhí)行文件。 |
-file文件名 | 可選的 | 使得當(dāng)?shù)噩F(xiàn)有的計算節(jié)點上的映射器,減速器,或組合的可執(zhí)行文件。 |
-inputformat JavaClassName | 可選的 | 您提供一流的應(yīng)該返回文本類的鍵/值對。如果沒有指定,是的TextInputFormat用作默認。 |
-outputformat JavaClassName | 可選的 | 您提供一流的應(yīng)該采取文字類的鍵/值對。如果沒有指定,TextOutputformat用作默認。 |
-partitioner JavaClassName | 可選的 | 類,確定哪個減少一個密鑰發(fā)送到。 |
-combiner streamingCommand或JavaClassName | 可選的 | 合可執(zhí)行地圖輸出。 |
-cmdenv名稱=值 | 可選的 | 傳遞環(huán)境變量流的命令。 |
-inputreader | 可選的 | 對于向后兼容性:指定記錄讀取器類(而不是輸入格式類)。 |
-verbose | 可選的 | 詳細輸出。 |
-lazyOutput | 可選的 | 創(chuàng)建懶洋洋地輸出。例如,如果輸出格式是基于FileOutputFormat,僅在第一次調(diào)用output.collect(或Context.write)創(chuàng)建的輸出文件。 |
-numReduceTasks | 可選的 | 指定減速器的數(shù)目。 |
-mapdebug | 可選的 | 當(dāng)map任務(wù)失敗時調(diào)用的腳本。 |
-reducedebug | 可選的 | 腳本調(diào)用時降低任務(wù)失敗。 |
本章介紹了在分布式環(huán)境Hadoop的多節(jié)點集群的設(shè)置。
由于整個群集無法證明,我們解釋使用三個系統(tǒng)(一個主站和兩個奴隸)的Hadoop集群環(huán)境;下面給出的是它們的IP地址。
按照下面給出的Hadoop具有多節(jié)點集群設(shè)置的步驟。
Java是Hadoop的主要先決條件。首先,您應(yīng)該驗證java的存在使用“Java的版本”您的系統(tǒng)。 Java版本命令的語法如下。
$ java -version
如果一切正常,它會給你下面的輸出。
java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b13) Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
如果Java是沒有安裝在您的系統(tǒng),然后按照安裝Java給定的步驟。
下載Java(JDK - X64.tar.gz)通過訪問以下鏈接http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
隨后的jdk-7u71-Linux的x64.tar.gz將被下載到您的系統(tǒng)。
通常你會發(fā)現(xiàn)在下載文件夾中下載的Java文件。驗證它,并使用以下命令解壓的jdk-7u71-Linux的x64.gz文件。
$ cd Downloads/ $ ls jdk-7u71-Linux-x64.gz $ tar zxf jdk-7u71-Linux-x64.gz $ ls jdk1.7.0_71 jdk-7u71-Linux-x64.gz
使Java提供給所有用戶,你必須將它移動到的位置“的/ usr /本地/”。打開根目錄,鍵入以下命令。
$ su password: # mv jdk1.7.0_71 /usr/local/ # exit
有關(guān)設(shè)置PATH和JAVA_HOME變量,添加下面的命令?/ .bashrc文件。
export JAVA_HOME=/usr/local/jdk1.7.0_71 export PATH=PATH:$JAVA_HOME/bin
現(xiàn)在從終端驗證java -version命令如上述說明。按照上面的過程,并在所有群集節(jié)點安裝Java。
在主機和從機系統(tǒng)創(chuàng)建一個系統(tǒng)用戶帳戶使用Hadoop的安裝。
# useradd hadoop # passwd hadoop
你必須編輯hosts文件中的所有節(jié)點上在/ etc /文件夾,指定每個系統(tǒng)后面的主機名的IP地址。
# vi /etc/hosts enter the following lines in the /etc/hosts file. 192.168.1.109 hadoop-master 192.168.1.145 hadoop-slave-1 192.168.56.1 hadoop-slave-2
設(shè)置的ssh中的每個節(jié)點,使得它們可在沒有任何提示密碼彼此通信。
# su hadoop $ ssh-keygen -t rsa $ ssh-copy-id -i ~/.ssh/id_rsa.pub tutorialspoint@hadoop-master $ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp1@hadoop-slave-1 $ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop_tp2@hadoop-slave-2 $ chmod 0600 ~/.ssh/authorized_keys $ exit
在主服務(wù)器上,下載并使用以下命令安裝Hadoop的。
# mkdir /opt/hadoop # cd /opt/hadoop/ # wget http://apache.mesi.com.ar/hadoop/common/hadoop-1.2.1/hadoop-1.2.0.tar.gz # tar -xzf hadoop-1.2.0.tar.gz # mv hadoop-1.2.0 hadoop # chown -R hadoop /opt/hadoop # cd /opt/hadoop/hadoop/
您可以通過如下給出做以下修改來配置Hadoop的服務(wù)器。
打開核心site.xml文件,并進行修改,如下圖所示。
<configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop-master:9000/</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
打開HDFS-site.xml文件,并進行修改,如下圖所示。
<configuration> <property> <name>dfs.data.dir</name> <value>/opt/hadoop/hadoop/dfs/name/data</value> <final>true</final> </property> <property> <name>dfs.name.dir</name> <value>/opt/hadoop/hadoop/dfs/name</value> <final>true</final> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
打開mapred-site.xml文件,并進行修改,如下圖所示。
<configuration> <property> <name>mapred.job.tracker</name> <value>hadoop-master:9001</value> </property> </configuration>
打開hadoop-env.sh文件,如下圖所示編輯JAVA_HOME,HADOOP_CONF_DIR和HADOOP_OPTS。
注意:設(shè)置JAVA_HOME根據(jù)您的系統(tǒng)配置。
export JAVA_HOME=/opt/jdk1.7.0_17 export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true export HADOOP_CONF_DIR=/opt/hadoop/hadoop/conf
按照給定的命令,所有從服務(wù)器上安裝的Hadoop。
# su hadoop $ cd /opt/hadoop $ scp -r hadoop hadoop-slave-1:/opt/hadoop $ scp -r hadoop hadoop-slave-2:/opt/hadoop
打開主服務(wù)器,并按照給定的命令進行配置。
# su hadoop $ cd /opt/hadoop/hadoop
$ vi etc/hadoop/masters hadoop-master
$ vi etc/hadoop/slaves hadoop-slave-1 hadoop-slave-2
# su hadoop $ cd /opt/hadoop/hadoop $ bin/hadoop namenode –format
11/10/14 10:58:07 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = hadoop-master/192.168.1.109 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.2.0 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1479473; compiled by 'hortonfo' on Mon May 6 06:59:37 UTC 2013 STARTUP_MSG: java = 1.7.0_71 ************************************************************/ 11/10/14 10:58:08 INFO util.GSet: Computing capacity for map BlocksMap editlog=/opt/hadoop/hadoop/dfs/name/current/edits …………………………………………………. …………………………………………………. …………………………………………………. 11/10/14 10:58:08 INFO common.Storage: Storage directory /opt/hadoop/hadoop/dfs/name has been successfully formatted. 11/10/14 10:58:08 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at hadoop-master/192.168.1.15 ************************************************************/
下面的命令來啟動所有的Hadoop的主Hadoop的服務(wù)。
$ cd $HADOOP_HOME/sbin $ start-all.sh
下面給出要遵循用于添加新節(jié)點Hadoop集群的步驟。
添加新節(jié)點用一些適當(dāng)?shù)木W(wǎng)絡(luò)配置現(xiàn)有的Hadoop集群。假設(shè)以下網(wǎng)絡(luò)配置。
對于新節(jié)點配置:
IP address : 192.168.1.103 netmask : 255.255.255.0 hostname : slave3.in
在新的節(jié)點上,通過使用以下命令添加要“Hadoop的”用戶和Hadoop用戶“hadoop123”或任何的設(shè)置密碼。
useradd hadoop passwd hadoop
設(shè)置密碼較少連接由主到新的從屬。
mkdir -p $HOME/.ssh chmod 700 $HOME/.ssh ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys chmod 644 $HOME/.ssh/authorized_keys Copy the public key to new slave node in hadoop user $HOME directory scp $HOME/.ssh/id_rsa.pub hadoop@192.168.1.103:/home/hadoop/
登錄到Hadoop的。如果不是這樣,登錄到Hadoop的用戶。
su hadoop ssh -X hadoop@192.168.1.103
公共密鑰的內(nèi)容復(fù)制到文件“$ HOME /的.ssh / authorized_keys文件”,然后通過執(zhí)行以下命令更改相同的權(quán)限。
cd $HOME mkdir -p $HOME/.ssh chmod 700 $HOME/.ssh cat id_rsa.pub >>$HOME/.ssh/authorized_keys chmod 644 $HOME/.ssh/authorized_keys
從主計算機檢查ssh登錄。現(xiàn)在,請檢查您是否可以ssh到新的節(jié)點,而從主的密碼。
ssh hadoop@192.168.1.103 or hadoop@slave3
您可以在文件/ etc / sysconfig / network中設(shè)置的主機名
On new slave3 machine NETWORKING=yes HOSTNAME=slave3.in
為了使更改生效,請重新啟動計算機或運行hostname命令到新的計算機與相應(yīng)的主機名(重啟是一個不錯的選擇)。
在slave3節(jié)點機:
主機名slave3.in
更新/ etc /與以下行所有群集機的主機 :
192.168.1.102 slave3.in slave3
現(xiàn)在嘗試ping本機與主機名稱檢查是否解析為IP或沒有。
在新的節(jié)點機:
ping master.in
使用$ HADOOP_HOME /斌/ hadoop-daemon.sh腳本手動啟動的Datanode守護進程。它會自動聯(lián)系主(NameNode的),并加入集群。我們還應(yīng)該將新節(jié)點添加到主服務(wù)器通過conf /奴隸文件?;谀_本的命令將識別新的節(jié)點。
su hadoop or ssh -X hadoop@192.168.1.103
./bin/hadoop-daemon.sh start datanode
$ jps 7141 DataNode 10312 Jps
我們可以從動態(tài)集群中刪除節(jié)點,在運行時,不會丟失任何數(shù)據(jù)。 HDFS提供一個退役特性,從而確保除去一個節(jié)點被安全地執(zhí)行。要使用它,請按照下列步驟給出:
登錄掌握。
登錄掌握在安裝Hadoop的計算機用戶。
$ su hadoop
更改群集配置。
排除文件必須在啟動群集之前進行配置。一個名為關(guān)鍵dfs.hosts.exclude添加到我們的$ HADOOP_HOME的/ etc / Hadoop的/ HDFS-site.xml文件。與此鍵關(guān)聯(lián)的值提供的完整路徑,其中包含未允許連接到HDFS的機器列表NameNode的本地文件系統(tǒng)上的文件。
例如,添加這些行等/ Hadoop的/ HDFS-site.xml文件。
<property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt</value> <description>DFS exclude</description> </property>
確定主機退役。
要退役每臺機器應(yīng)添加到由每行的hdfs_exclude.txt,一個域名標識的文件。這將阻止他們連接到NameNode的。在“/home/hadoop/hadoop-1.2.1/hdfs_exclude.txt”文件的內(nèi)容如下所示,如果你想刪除DataNode2。
slave2.in
強制配置重裝。
運行命令“$ HADOOP_HOME /斌/ Hadoop的dfsadmin -refreshNodes”不帶引號。
$ $HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes
這將迫使NameNode會重新讀取它的配置,其中包括最近更新的'排除'文件。它將停止使用節(jié)點在一段時間,讓時間為每個節(jié)點的塊被復(fù)制到其上被調(diào)度到保持活躍的機器。
在slave2.in,檢查JPS命令的輸出。一段時間后,你會看到的DataNode過程是自動關(guān)機。
關(guān)閉節(jié)點。
的退役過程已經(jīng)完成后,將退役硬件可以安全地關(guān)閉以進行維護。運行報告命令dfsadmin檢查退役的狀態(tài)。以下命令將描述退役節(jié)點的狀態(tài)以及群集連接的節(jié)點。
$ $HADOOP_HOME/bin/hadoop dfsadmin -report
編輯排除再次文件。
一旦機器已經(jīng)退役,他們可以從“不包括'文件中刪除。運行“$ HADOOP_HOME /斌/ Hadoop的dfsadmin -refreshNodes”再次將讀取文件排除放回NameNode的;允許的DataNodes重新加入集群維修已經(jīng)完成之后,或在集群中再次需要額外容量等
特別注意:如果上述過程之后和向TaskTracker處理的節(jié)點上仍在運行,它需要被關(guān)閉。一種方法是我們在上面的步驟做斷開機器。法師會自動識別過程將宣告為死亡。沒有必要遵循相同的過程去除的TaskTracker因為它不是相比的DataNode盡可能多的關(guān)鍵。 DataNode會包含要在不丟失任何數(shù)據(jù)安全地刪除數(shù)據(jù)。
向TaskTracker可以在任何時間點上運行通過以下命令飛/關(guān)機。
$ $HADOOP_HOME/bin/hadoop-daemon.sh stop tasktracker $HADOOP_HOME/bin/hadoop-daemon.sh start tasktracker
更多建議: