hadoophdfs源碼
⑴ hadoop yarn源碼怎麼進行修改
第一個階段:學習hadoop基本使用和基本原理,從應用角度對hadoop進行了解和學習
這是第一個階段,你開始嘗試使用hadoop,從應用層面,對hadoop有一定了解,比如你可以使用hadoop shell對hdfs進行操作,使用hdfs API編寫一些程序上傳,下載文件;使用MapRece API編寫一個數據處理程序。一旦你對hadoop的基本使用方法比較熟悉了,接下來可以嘗試了解它的內部原理,注意,不需要通過閱讀源代碼了解內部原理,只需看一些博客,書籍,比如《Hadoop權威指南》,對於HDFS而言,你應該知道它的基本架構以及各個模塊的功能;對於MapRece而言,你應該知道其具體的工作流程,知道partition,shuffle,sort等工作原理,可以自己在紙上完整個畫完maprece的流程,越詳細越好。
在這個階段,建議你多看一些知名博客,多讀讀《hadoop權威指南》(可選擇性看相關的幾章)。如果你有實際項目驅動,那是再好不過了,理論聯系實際是最好的hadoop學習方法;如果你沒有項目驅動,那建議你不要自己一個人悶頭學,多跟別人交流,多主動給別人講講,最好的學習方式還是「講給別人聽」。
============
第二個階段:從無到入門,開始閱讀hadoop源代碼
這個階段是最困苦和漫長的,尤其對於那些沒有任何分布式經驗的人。 很多人這個階段沒有走完,就放棄了,最後停留在hadoop應用層面。
這個階段,第一件要做的事情是,選擇一個hadoop組件。如果你對分布式存儲感興趣,那麼你可以選擇HDFS,如果你讀分布式計算感興趣,你可以選擇MapRece,如果你對資源管理系統感興趣,你可以選擇YARN。
選擇好系統後,接下來的經歷是最困苦的。當你把hadoop源代碼導入eclipse或intellij idea,沏上一杯茶,開始准備優哉游哉地看hadoop源代碼時,你懵逼了:你展開那數不盡的package和class,覺得無從下手,好不容易找到了入口點,然後你屁顛屁顛地通過eclipse的查找引用功能,順著類的調用關系一層層找下去,最後迷失在了代碼的海洋中,如同你在不盡的壓棧,最後棧溢出了,你忘記在最初的位置。很多人經歷過上面的過程,最後沒有順利逃出來,而放棄。
如果你正在經歷這個過程,我的經驗如下:首先,你要摸清hadoop的代碼模塊,知道client,master,slave各自對應的模塊(hadoop中核心系統都是master/slave架構,非常類似),並在閱讀源代碼過程中,時刻謹記你當前閱讀的代碼屬於哪一個模塊,會在哪個組件中執行;之後你需要摸清各個組件的交互協議,也就是分布式中的RPC,這是hadoop自己實現的,你需要對hadoop RPC的使用方式有所了解,然後看各模塊間的RPC protocol,到此,你把握了系統的骨架,這是接下來閱讀源代碼的基礎;接著,你要選擇一個模塊開始閱讀,我一般會選擇Client,這個模塊相對簡單些,會給自己增加信心,為了在閱讀代碼過程中,不至於迷失自己,建議在紙上畫出類的調用關系,邊看邊畫,我記得我閱讀hadoop源代碼時,花了一疊紙。注意,看源代碼過程中,很容易煩躁不安,建議經常起來走走,不要把自己逼得太緊。
在這個階段,建議大家多看一些源代碼分析博客和書籍,比如《Hadoop技術內幕》系列叢書(軒相關網站:Hadoop技術內幕)就是最好的參考資料。藉助這些博客和書籍,你可以在前人的幫助下,更快地學習hadoop源代碼,節省大量時間,注意,目前博客和書籍很多,建議大家廣泛收集資料,找出最適合自己的參考資料。
這個階段最終達到的目的,是對hadoop源代碼整體架構和局部的很多細節,有了一定的了解。比如你知道MapRece Scheler是怎樣實現的,MapRece shuffle過程中,map端做了哪些事情,rece端做了哪些事情,是如何實現的,等等。這個階段完成後,當你遇到問題或者困惑點時,可以迅速地在Hadoop源代碼中定位相關的類和具體的函數,通過閱讀源代碼解決問題,這時候,hadoop源代碼變成了你解決問題的參考書。
============
第三個階段:根據需求,修改源代碼。
這個階段,是驗證你閱讀源代碼成效的時候。你根據leader給你的需求,修改相關代碼完成功能模塊的開發。在修改源代碼過程中,你發現之前閱讀源代碼仍過於粗糙,這時候你再進一步深入閱讀相關代碼,彌補第二個階段中薄弱的部分。當然,很多人不需要經歷第三個階段,僅僅第二階段就夠了:一來能夠通過閱讀代碼解決自己長久以來的技術困惑,滿足自己的好奇心,二來從根源上解決解決自己遇到的各種問題。 這個階段,沒有太多的參考書籍或者博客,多跟周圍的同事交流,通過代碼review和測試,證明自己的正確性。
============
閱讀hadoop源代碼的目的不一定非是工作的需要,你可以把他看成一種修養,通過閱讀hadoop源代碼,加深自己對分布式系統的理解,培養自己踏實做事的心態。
⑵ 如何部署hadoop分布式文件系統
一、實戰環境
系統版本:CentOS 5.8x86_64
java版本:JDK-1.7.0_25
Hadoop版本:hadoop-2.2.0
192.168.149.128namenode (充當namenode、secondary namenode和ResourceManager角色)
192.168.149.129datanode1 (充當datanode、nodemanager角色)
192.168.149.130datanode2 (充當datanode、nodemanager角色)
二、系統准備
1、Hadoop可以從Apache官方網站直接下載最新版本Hadoop2.2。官方目前是提供了linux32位系統可執行文件,所以如果需要在64位系統上部署則需要單獨下載src 源碼自行編譯。(如果是真實線上環境,請下載64位hadoop版本,這樣可以避免很多問題,這里我實驗採用的是32位版本)
1234 Hadoop
Java
2、我們這里採用三台CnetOS伺服器來搭建Hadoop集群,分別的角色如上已經註明。
第一步:我們需要在三台伺服器的/etc/hosts裡面設置對應的主機名如下(真實環境可以使用內網DNS解析)
[root@node1 hadoop]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1localhost.localdomain localhost
192.168.149.128node1
192.168.149.129node2
192.168.149.130node3
(注* 我們需要在namenode、datanode三台伺服器上都配置hosts解析)
第二步:從namenode上無密碼登陸各台datanode伺服器,需要做如下配置:
在namenode 128上執行ssh-keygen,一路Enter回車即可。
然後把公鑰/root/.ssh/id_rsa.pub拷貝到datanode伺服器即可,拷貝方法如下:
ssh--id -i .ssh/id_rsa.pub [email protected]
ssh--id -i .ssh/id_rsa.pub [email protected]
三、Java安裝配置
tar -xvzf jdk-7u25-linux-x64.tar.gz &&mkdir -p /usr/java/ ; mv /jdk1.7.0_25 /usr/java/ 即可。
安裝完畢並配置java環境變數,在/etc/profile末尾添加如下代碼:
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVE_HOME/lib/dt.jar:$JAVE_HOME/lib/tools.jar:./
保存退出即可,然後執行source /etc/profile 生效。在命令行執行java -version 如下代表JAVA安裝成功。
[root@node1 ~]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
(注* 我們需要在namenode、datanode三台伺服器上都安裝Java JDK版本)
四、Hadoop版本安裝
官方下載的hadoop2.2.0版本,不用編譯直接解壓安裝就可以使用了,如下:
第一步解壓:
tar -xzvf hadoop-2.2.0.tar.gz &&mv hadoop-2.2.0/data/hadoop/
(注* 先在namenode伺服器上都安裝hadoop版本即可,datanode先不用安裝,待會修改完配置後統一安裝datanode)
第二步配置變數:
在/etc/profile末尾繼續添加如下代碼,並執行source /etc/profile生效。
export HADOOP_HOME=/data/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin/
export JAVA_LIBRARY_PATH=/data/hadoop/lib/native/
(注* 我們需要在namenode、datanode三台伺服器上都配置Hadoop相關變數)
五、配置Hadoop
在namenode上配置,我們需要修改如下幾個地方:
1、修改vi /data/hadoop/etc/hadoop/core-site.xml 內容為如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" Put site-specific property overrides inthisfile. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.149.128:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
<description>A base forother temporary directories.</description>
</property>
</configuration>
2、修改vi /data/hadoop/etc/hadoop/mapred-site.xml內容為如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" Put site-specific property overrides inthisfile. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.149.128:9001</value>
</property>
</configuration>
3、修改vi /data/hadoop/etc/hadoop/hdfs-site.xml內容為如下:
<?xml version="1.0"encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" /name>
<value>/data/hadoop/data_name1,/data/hadoop/data_name2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/hadoop/data_1,/data/hadoop/data_2</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
4、在/data/hadoop/etc/hadoop/hadoop-env.sh文件末尾追加JAV_HOME變數:
echo "export JAVA_HOME=/usr/java/jdk1.7.0_25/">> /data/hadoop/etc/hadoop/hadoop-env.sh
5、修改 vi /data/hadoop/etc/hadoop/masters文件內容為如下:
192.168.149.128
6、修改vi /data/hadoop/etc/hadoop/slaves文件內容為如下:
192.168.149.129
192.168.149.130
如上配置完畢,以上的配置具體含義在這里就不做過多的解釋了,搭建的時候不明白,可以查看一下相關的官方文檔。
如上namenode就基本搭建完畢,接下來我們需要部署datanode,部署datanode相對簡單,執行如下操作即可。
1 fori in`seq 129130` ; doscp -r /data/hadoop/ [email protected].$i:/data/ ; done
自此整個集群基本搭建完畢,接下來就是啟動hadoop集群了。
⑶ Hadoop源代碼用eclipse打開時就出現問題
關掉自動build,安裝maven。給分
⑷ 請問在Hadoop的HDFS中,是如何把文件分割後的block分散到一個個的datanode中,有源代碼的相關方法說明最好
不是一個一個的寫,是以流水線的方式同時寫數據副本的
⑸ hadoop單機模式和偽分布式模式的異同
一、相同點:
1、運行機器數相同
單機(非分布式)模式與偽分布式都是在一台單機上運行。
二、不同點:
1、分布式文件系統不同
1)、單機(非分布式)模式,沒有分布式文件系統,而是直接讀寫本地操作系統的文件系統。
2)、偽分布式用不同的Java進程模仿分布式運行中的各類結點: (NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode)。
2、啟動進程不同
1)、單機(非分布式)模式下,Hadoop不會啟動NameNode、DataNode、JobTracker、TaskTracker等守護進程,Map()和Rece()任務作為同一個進程的不同部分來執行的。
2)、偽分布式模式下,Hadoop啟動NameNode、DataNode、JobTracker、TaskTracker這些守護進程都在同一台機器上運行,是相互獨立的Java進程。
3、配置文件處理方式不同
1)、單機(非分布式)模式下,不對配置文件進行修改。
2)、偽分布式模式下,修改3個配置文件:core-site.xml(Hadoop集群的特性,作用於全部進程及客戶端)、hdfs-site.xml(配置HDFS集群的工作屬性)、mapred-site.xml(配置MapRece集群的屬性)。
參考資料
網路-Hadoop
⑹ CDH版的hadoop有沒有源碼提供
首先,不得不說,hadoop發展到現在這個階段,代碼已經變得非常龐大臃腫,如果你直接閱讀最新版本的源代碼,難度比較大,需要足夠的耐心和時間,所以,如果你覺得認真一次,認真閱讀一次hadoop源代碼,一定要有足夠的心理准備和時間預期。 其次,需要注意,閱讀Hadoop源代碼的效率,因人而異,如果你有足夠的分布式系統知識儲備,看過類似的系統,則能夠很快地讀它的源代碼進行通讀,並快速切入你最關注的局部細節,比如你之前看過某個分布式資料庫的源代碼,對分布式系統的網路通信模塊,調度模塊等有一定了解,這對閱讀hadoop源代碼有極大幫助;如果你是一個初學者,對hadoop一無所知,只了解一些java語法,那閱讀hadoop源代碼是極具挑戰的一件事情,尤其是從無到開始入門的過程,是極度煎熬和困惑的,這時候需要你在閱讀代碼過程中,不斷補充缺乏的相關知識(比如RPC,NIO,設計模式等),循序漸進,直到入門。 接下來進入主題,說一下閱讀源代碼的個人經驗。由於我也是從無到入門,再到修改源代碼,逐步過渡的,所以,對於很多人而言,具有借鑒意義。 ============ 第一個階段:學習hadoop基本使用和基本原理,從應用角度對hadoop進行了解和學習 這是第一個階段,你開始嘗試使用hadoop,從應用層面,對hadoop有一定了解,比如你可以使用hadoop shell對hdfs進行操作,使用hdfs API編寫一些程序上傳,下載文件;使用MapRece API編寫一個數據處理程序。一旦你對hadoop的基本使用方法比較熟悉了,接下來可以嘗試了解它的內部原理,注意,不需要通過閱讀源代碼了解內部原理,只需看一些博客,書籍,比如《Hadoop權威指南》,對於HDFS而言,你應該知道它的基本架構以及各個模塊的功能;對於MapRece而言,你應該知道其具體的工作流程,知道partition,shuffle,sort等工作原理,可以自己在紙上完整個畫完maprece的流程,越詳細越好。 在這個階段,建議你多看一些知名博客,多讀讀《hadoop權威指南》(可選擇性看相關的幾章)。如果你有實際項目驅動,那是再好不過了,理論聯系實際是最好的hadoop學習方法;如果你沒有項目驅動,那建議你不要自己一個人悶頭學,多跟別人交流,多主動給別人講講,最好的學習方式還是「講給別人聽」。 ============ 第二個階段:從無到入門,開始閱讀hadoop源代碼 這個階段是最困苦和漫長的,尤其對於那些沒有任何分布式經驗的人。 很多人這個階段沒有走完,就放棄了,最後停留在hadoop應用層面。 這個階段,第一件要做的事情是,選擇一個hadoop組件。如果你對分布式存儲感興趣,那麼你可以選擇HDFS,如果你讀分布式計算感興趣,你可以選擇MapRece,如果你對資源管理系統感興趣,你可以選擇YARN。 選擇好系統後,接下來的經歷是最困苦的。當你把hadoop源代碼導入eclipse或intellij idea,沏上一杯茶,開始准備優哉游哉地看hadoop源代碼時,你懵逼了:你展開那數不盡的package和class,覺得無從下手,好不容易找到了入口點,然後你屁顛屁顛地通過eclipse的查找引用功能,順著類的調用關系一層層找下去,最後迷失在了代碼的海洋中,如同你在不盡的壓棧,最後棧溢出了,你忘記在最初的位置。很多人經歷過上面的過程,最後沒有順利逃出來,而放棄。 如果你正在經歷這個過程,我的經驗如下:首先,你要摸清hadoop的代碼模塊,知道client,master,slave各自對應的模塊(hadoop中核心系統都是master/slave架構,非常類似),並在閱讀源代碼過程中,時刻謹記你當前閱讀的代碼屬於哪一個模塊,會在哪個組件中執行;之後你需要摸清各個組件的交互協議,也就是分布式中的RPC,這是hadoop自己實現的,你需要對hadoop RPC的使用方式有所了解,然後看各模塊間的RPC protocol,到此,你把握了系統的骨架,這是接下來閱讀源代碼的基礎;接著,你要選擇一個模塊開始閱讀,我一般會選擇Client,這個模塊相對簡單些,會給自己增加信心,為了在閱讀代碼過程中,不至於迷失自己,建議在紙上畫出類的調用關系,邊看邊畫,我記得我閱讀hadoop源代碼時,花了一疊紙。注意,看源代碼過程中,很容易煩躁不安,建議經常起來走走,不要把自己逼得太緊。 在這個階段,建議大家多看一些源代碼分析博客和書籍,比如《Hadoop技術內幕》系列叢書(軒相關網站:Hadoop技術內幕)就是最好的參考資料。藉助這些博客和書籍,你可以在前人的幫助下,更快地學習hadoop源代碼,節省大量時間,注意,目前博客和書籍很多,建議大家廣泛收集資料,找出最適合自己的參考資料。 這個階段最終達到的目的,是對hadoop源代碼整體架構和局部的很多細節,有了一定的了解。比如你知道MapRece Scheler是怎樣實現的,MapRece shuffle過程中,map端做了哪些事情,rece端做了哪些事情,是如何實現的,等等。這個階段完成後,當你遇到問題或者困惑點時,可以迅速地在Hadoop源代碼中定位相關的類和具體的函數,通過閱讀源代碼解決問題,這時候,hadoop源代碼變成了你解決問題的參考書
⑺ hadoop hdfs 源碼怎麼看
在使用Hadoop的過程中,很容易通過FileSystem類的API來讀取HDFS中的文件內容,讀取內容的過程是怎樣的呢?今天來分析客戶端讀取HDFS文件的過程,下面的一個小程序完成的功能是讀取HDFS中某個目錄下的文件內容,然後輸出到控制台,代碼如下:
[java] view plain
public class LoadDataFromHDFS {
public static void main(String[] args) throws IOException {
new LoadDataFromHDFS().loadFromHdfs("hdfs://localhost:9000/user/wordcount/");
}
public void loadFromHdfs(String hdfsPath) throws IOException {
Configuration conf = new Configuration();
Path hdfs = new Path(hdfsPath);
FileSystem in = FileSystem.get(conf);
//in = FileSystem.get(URI.create(hdfsPath), conf);//這兩行都會創建一個DistributedFileSystem對象
FileStatus[] status = in.listStatus(hdfs);
for(int i = 0; i < status.length; i++) {
byte[] buff = new byte[1024];
FSDataInputStream inputStream = in.open(status[i].getPath());
while(inputStream.read(buff) > 0) {
System.out.print(new String(buff));
}
inputStream.close();
}
}
}
FileSystem in = FileSystem.get(conf)這行代碼創建一個DistributedFileSystem,如果直接傳入一個Configuration類型的參數,那麼默認會讀取屬性fs.default.name的值,根據這個屬性的值創建對應的FileSystem子類對象,如果沒有配置fs.default.name屬性的值,那麼默認創建一個org.apache.hadoop.fs.LocalFileSystem類型的對象。但是這里是要讀取HDFS中的文件,所以在core-site.xml文件中配置fs.default.name屬性的值為hdfs://localhost:9000,這樣FileSystem.get(conf)返回的才是一個DistributedFileSystem類的對象。 還有一種創建DistributedFileSystem這種指定文件系統類型對像的方法是使用FileSystem.get(Configuration conf)的一個重載方法FileSystem.get(URI uri, Configuration),其實調用第一個方法時在FileSystem類中先讀取conf中的屬性fs.default.name的值,再調用的FileSystem.get(URI uri, Configuration)方法。