同步發在:java
https://evergreen-tree.github.io/articles/2016-05/daily-hadoop-singleNode-setupnode
如下內容摘自網路:linux
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。 用戶能夠在不瞭解分佈式底層細節的狀況下,開發分佈式程序。充分利用集羣的威力進行高速運算和存儲。git
Hadoop實現了一個分佈式文件系統(
Hadoop Distributed File System
),簡稱HDFS
。HDFS
有高容錯性的特色,而且設計用來部署在低廉的(low-cost
)硬件上;並且它提供高吞吐量(high throughput
)來訪問應用程序的數據,適合那些有着超大數據集(large data set
)的應用程序。HDFS放寬了(relax)POSIX的要求,能夠以流的形式訪問(streaming access)文件系統中的數據。github
Hadoop的框架最核心的設計就是:
HDFS
和MapReduce
。HDFS爲海量的數據提供了存儲,則MapReduce爲海量的數據提供了計算。。正則表達式
從網絡上摘抄出來的內容看出來,hadoop的確已經徹底造成了本身的體系。apache
從準備開始學習hadoop到真正開始使用hadoop的過程當中感受本身走了不少彎路,其中最主要的一個就是一直以來把hadoop當成了一款開源軟件來進行學習,開源軟件學習的過程通常是經過閱讀tutorial(說明書)
來進行最初的設定,而且完成最基本的接入操做,而後逐步深刻,閱讀和使用分佈式的配置,閱讀和使用更多的feature。例如學習activeMQ,就能夠經過閱讀user guide來完成入門,而後經過閱讀配置部分加java的demo,基本完成對於activemq的設定和使用,但是這一招在面對hadoop的時候失效了。windows
爲何失效?這是個讓我很頭痛的問題,後來通過一系列的學習和分析終於對hadoop有所掌握以後發現hadoop實際上不是一款開源軟件,而是一個分佈式運算的體系或者平臺,咱們能夠把hadoop認爲是一種分佈式運算的操做系統
,提供了不少底層的API的定義,而後在hadoop這個體系的內部呢,有不少的開源軟件的實現,好比mapreduce,好比hdfs,好比yarn等等,這些軟件被集成在hadoop平臺內部,從而經過hadoop平臺的分配掉用來完成真正的工做。固然了上面的說法可能不盡準確,可是這樣進行思考可讓你更快的學會使用hadoop。網絡
經過上面的說法咱們能夠制定接下里的方向,操做系統咱們要學習的固然是命令了,就是hadoop基本的CLI的命令(具體的命令見附件部分)。經過這一系列的命令咱們能夠操做在hadoop這個系統中的文件,以及執行一些特定的操做,甚至於運行咱們本身編寫的軟件(如jar命令)。架構
學習完操做系統,接下來要想作事情就須要學習運行在操做系統上面的軟件了,好比咱們的硬盤存儲HDFS,好比咱們的資源管理和計算操做軟件YARN,經過學習逐漸的發覺,學習hadoop其實就是學習HDFS跟MAPREDUCE的過程,由於實際上啓動hadoop就是啓動hadoop的存儲並運行分佈式運算的過程。
扯了這麼多,咱們如今先回來感覺一把hadoop的魅力:
首先要說明一點的就是hadoop的更新實在太快了,因此網絡上面不少的文章已經不是特別的準確,若是須要閱讀相關的文檔,英文夠好的話建議直接閱讀發行包裏面的文檔,它就在你下載的發行包的
share/doc
底下。
另外不建議你們再windows下玩兒hadoop,有條件的最好安裝linux操做系統,或者使用虛擬機,沒有條件的也建議使用cygwin而不是在windows下使用bat進行操做。
hadoop下載完成以後並非說下載了操做系統,而後須要安裝軟件,它的軟件是集成在裏面的。好比咱們下載的2.6.4的髮型包裏面就是集成了HDFS跟YARN的。
hadoop下載完成以後,不須要任何的配置便可以單點方式運行,這時候hadoop並不會啓動hdfs跟yarn或者maprduce,而僅僅以單一的java進程來處理你的命令。
$ mkdir input $ cp etc/hadoop/*.xml input $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep input output 'dfs[a-z.]+' $ cat output/*
上面的命令可讓你體驗一下hadoop竟然是能夠運行的,惟一的前提條件是你要安裝過JAVA,而且配置了JAVA_HOME.
簡單介紹一下上面的命令所體現出來的內容:
運行cat以後的結果以下(看起來全部的文件中存在dfs[a-z.]+正則匹配的只是出現了一次,此次叫作dfsadmin)
1 dfsadmin
上面的啓動方式固然不夠炫酷,並且單機運行的時候實際上除了有個結果以外並無法讓你看到任何hadoop的痕跡,因此hadoop提供了第二種單機運行的方式,僞分佈式,在僞分佈式中,hadoop將會啓動兩個進程,一個爲hdfs進程,一個爲mapreduce的管理進程,若是已經配置了yarn的,那麼將會啓動的就是yarn的進程。
啓動一個分佈式的hadoop的過程其實就是分別啓動hadoop的四個基本元素的過程,即
其中,NameNode & DataNode在默認的發行版裏面是經過start-dfs來完成,即NameNode&DataNode是HDFS的組成部分,而ResourceManager&NodeManager發行版裏面有默認的實現以及yarn,鑑於官方的文檔也建議使用yarn來進行資源管理,咱們的配置也使用yarn進行配置。
依次更改下面的配置文件:
etc/hadoop/core-site.xml(基本配置,這個配置文件在集羣裏面全部的機器應該配置爲相同的): ```xml
fs.defaultFS hdfs://localhost:9000
etc/hadoop/hdfs-site.xml(在NameNode/DataNode不一樣的配置文件,咱們如今經過一臺機器進行模擬,因此不須要進行多餘的配置): ```xml <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
至此咱們沒有使用yarn進行mapreduce的操做,而是使用hadoop默認的mapreduce,若是須要使用其餘的mapreduce實現,那麼須要修改: etc/hadoop/mapred-site.xml
這個文件的修改咱們接下里會說。
完成上面兩個文件的修改以後,咱們就擁有了一個僞分佈式的環境,在這個環境裏面NameNode,DataNode,ResourceManger跟NodeManager都分別以獨立的進程來運行。
接下來咱們來運行咱們的hadoop操做系統。
由於hadoop是經過ssh來進行各個節點的啓動和中止操做的,因此須要ssh的支持,爲了簡單起見咱們能夠設置ssh免密碼登錄,具體的原理請參照https://evergreen-tree.github.io/articles/2016-05/daily-ssh-authorized-keys。
咱們本地須要設置的是對於localhost的免密碼登錄:
依次執行下面的命令便可
$ ssh localhost If you cannot ssh to localhost without a passphrase, execute the following commands: $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
bin/hdfs namenode -format
sbin/start-dfs.sh
bin/hdfs dfs -mkdir /user
- 建立工做目錄bin/hdfs dfs -mkdir /user/test
- 建立工做目錄,按照官方文檔,這裏面新建的目錄應該是當前linux系統登陸的用戶,爲了區別起見,咱們使用testbin/hdfs dfs -put etc/hadoop /user/test/input
- 將本地文件導入到hadoop系統中的HDFSbin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar grep /user/test/input output 'dfs[a-z.]+'
bin/hdfs dfs -cat output/*
/user/root/output
默認是linux的登錄用戶的用戶名。sbin/stop-dfs.sh
對上面的操做進行一些分析:
啓動dfs以後,其實在後臺啓動了NameNode跟SecondNameNode(secondNameNode是NameNode的容災)
root 24225 1 17 14:28 ? 00:00:07 /etc/alternatives/java_sdk/bin/java -Dproc_namenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-namenode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.NameNode root 24326 1 21 14:28 ? 00:00:08 /etc/alternatives/java_sdk/bin/java -Dproc_datanode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-datanode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -server -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=ERROR,RFAS -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.datanode.DataNode root 24529 1 17 14:28 ? 00:00:05 /etc/alternatives/java_sdk/bin/java -Dproc_secondarynamenode -Xmx1000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,console -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=hadoop-root-secondarynamenode-localhost.localdomain.log -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.id.str=root -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS -Dhdfs.audit.logger=INFO,NullAppender -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
進入tmp目錄會發現有下面的目錄結構:
[root@localhost tmp]# ll drwxr-xr-x. 3 root root 4096 May 25 14:28 hadoop-root -rw-r--r--. 1 root root 6 May 25 14:28 hadoop-root-datanode.pid -rw-r--r--. 1 root root 6 May 25 14:28 hadoop-root-namenode.pid -rw-r--r--. 1 root root 6 May 25 14:28 hadoop-root-secondarynamenode.pid drwxr-xr-x. 2 root root 4096 May 25 14:28 hsperfdata_root drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50070_hdfs____w2cu08 drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50075_datanode____hwtdwq drwxr-xr-x. 4 root root 4096 May 25 14:28 Jetty_0_0_0_0_50090_secondary____y6aanv
經過UI界面(http://10.132.65.77:50070/)(個人UI)咱們能夠看到如今機器上面已經啓動了一個datanode:
而後執行完全部的命令以後咱們看到的結果以下;
[root@localhost hadoop]# bin/hdfs dfs -cat output/* 16/05/25 14:34:35 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable cat: `output/output': No such file or directory 6 dfs.audit.logger 4 dfs.class 3 dfs.server.namenode. 2 dfs.period 2 dfs.audit.log.maxfilesize 2 dfs.audit.log.maxbackupindex 1 dfsmetrics.log 1 dfsadmin 1 dfs.servers 1 dfs.replication 1 dfs.file
至此咱們已經完成了經過一臺機器啓動NameNode & DataNode的過程,secondNameNode的啓動你們能夠暫時先忽略掉,咱們看到若是不想要使用特定的mapreduce方案,那麼只要啓動namenode跟datanode便可。
經過剛纔的設置,咱們已經搭建好一個基本的運行環境,若是你剛纔設置core-site.xml的時候綁定的是0.0.0.0那麼你如今已經能夠經過下面的java方法來遠程鏈接你的hdfs而且進行一些簡單的操做了!
package distributed.lock.hadoopJob; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.InputStream; import java.net.URI; public class HDFSTest { public static void main(String[] args) throws Exception { String uri = "hdfs://10.132.65.77:9000/"; Configuration config = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), config); FileStatus[] statuses = fs.listStatus(new Path("/user/root")); for (FileStatus status : statuses) { System.out.println(status); } FSDataOutputStream os = fs.create(new Path("/user/root/input/test.log")); os.write("Hello World!".getBytes()); os.flush(); os.close(); InputStream is = fs.open(new Path("/user/root/test.log")); IOUtils.copyBytes(is, System.out, 1024, true); } }
上面的類我在執行的時候發生了一些小問題,不過用來驗證能夠進行鏈接操做仍是蠻好的。不深究了。
在使用yarn以前,建議首先刪除掉原來的/tmp的全部文件而且從新format
依次修改下面的配置文件:
etc/hadoop/mapred-site.xml - 指定使用yarn做爲mapreduce的調度者
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
而後啓動yarn便可 sbin/start-yarn.sh
(上面的dfs須要重啓)
啓動yarn以後,會發覺多出來兩個進程(ResourceManager跟NodeManager):
root 29518 1 99 15:08 pts/2 00:00:09 /etc/alternatives/java_sdk/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dyarn.policy.file=hadoop-policy.xml -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-resourcemanager-localhost.localdomain.log -Dyarn.home.dir=/opt/hadoop-2.6.4 -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -classpath /opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/share/hadoop/common/lib/*:/opt/hadoop-2.6.4/share/hadoop/common/*:/opt/hadoop-2.6.4/share/hadoop/hdfs:/opt/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/opt/hadoop-2.6.4/share/hadoop/hdfs/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/*:/etc/alternatives/java_sdk/lib/tools.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/etc/hadoop/rm-config/log4j.properties org.apache.hadoop.yarn.server.resourcemanager.ResourceManager root 29623 1 99 15:08 ? 00:00:09 /etc/alternatives/java_sdk/bin/java -Dproc_nodemanager -Xmx1000m -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.home.dir= -Dyarn.id.str=root -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -Dyarn.policy.file=hadoop-policy.xml -server -Dhadoop.log.dir=/opt/hadoop-2.6.4/logs -Dyarn.log.dir=/opt/hadoop-2.6.4/logs -Dhadoop.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.log.file=yarn-root-nodemanager-localhost.localdomain.log -Dyarn.home.dir=/opt/hadoop-2.6.4 -Dhadoop.home.dir=/opt/hadoop-2.6.4 -Dhadoop.root.logger=INFO,RFA -Dyarn.root.logger=INFO,RFA -Djava.library.path=/opt/hadoop-2.6.4/lib/native -classpath /opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/etc/hadoop:/opt/hadoop-2.6.4/share/hadoop/common/lib/*:/opt/hadoop-2.6.4/share/hadoop/common/*:/opt/hadoop-2.6.4/share/hadoop/hdfs:/opt/hadoop-2.6.4/share/hadoop/hdfs/lib/*:/opt/hadoop-2.6.4/share/hadoop/hdfs/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/lib/*:/opt/hadoop-2.6.4/share/hadoop/mapreduce/*:/etc/alternatives/java_sdk/lib/tools.jar:/contrib/capacity-scheduler/*.jar:/contrib/capacity-scheduler/*.jar:/opt/hadoop-2.6.4/share/hadoop/yarn/*:/opt/hadoop-2.6.4/share/hadoop/yarn/lib/*:/opt/hadoop-2.6.4/etc/hadoop/nm-config/log4j.properties org.apache.hadoop.yarn.server.nodemanager.NodeManager
tmp下面也增長了相應的pid等文件:
drwxr-xr-x. 4 root root 4096 May 25 15:08 hadoop-root -rw-r--r--. 1 root root 6 May 25 15:07 hadoop-root-datanode.pid -rw-r--r--. 1 root root 6 May 25 15:07 hadoop-root-namenode.pid -rw-r--r--. 1 root root 6 May 25 15:07 hadoop-root-secondarynamenode.pid drwxr-xr-x. 2 root root 4096 May 25 15:08 hsperfdata_root drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50070_hdfs____w2cu08 drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50075_datanode____hwtdwq drwxr-xr-x. 4 root root 4096 May 25 15:07 Jetty_0_0_0_0_50090_secondary____y6aanv drwxr-xr-x. 5 root root 4096 May 25 15:08 Jetty_0_0_0_0_8042_node____19tj0x drwxr-xr-x. 5 root root 4096 May 25 15:08 Jetty_0_0_0_0_8088_cluster____u0rgz3 -rw-r--r--. 1 root root 6 May 25 15:08 yarn-root-nodemanager.pid -rw-r--r--. 1 root root 6 May 25 15:08 yarn-root-resourcemanager.pid