終于開始學(xué)習(xí) hadoop
了,雖然是學(xué)校開課了才開始跟著學(xué)校的課程學(xué),至少也是開始了。
首先要做的就是搭建好一個 hadoop
的環(huán)境,需要三臺主機,配置一個 master
兩個 slave
的架構(gòu)。
老師讓我們用 vbox
來做,但是個人覺得虛擬機太慢了,而且還要開三個,太虧。剛好最近開始接觸 docker
,準備就在 docker
的環(huán)境下搭建 hadoop
環(huán)境。
可以考慮使用國內(nèi)的加速鏡像 daocloud.io 注冊后可以看到如何使用
由于我已經(jīng)通過官網(wǎng)的方法安裝了,這里就只記錄下我的操作:
curl -fsSL https://get.docker.com/ | sh
這個過程會很漫長,誰讓我作死去官網(wǎng)下呢 (-_-)
腳本執(zhí)行完后就能發(fā)現(xiàn) docker
已經(jīng)安裝好了,而且還添加了一個用戶組 docker
,可以把自己常用的用戶加入到這個組,方便使用。
可以使用 docker version
查看一下版本
$ docker versionClient: Version: 1.11.1 API version: 1.23 Go version: go1.5.4 Git commit: 5604cbe Built: Tue Apr 26 23:43:49 2016 OS/Arch: linux/amd64Server: Version: 1.11.1 API version: 1.23 Go version: go1.5.4 Git commit: 5604cbe Built: Tue Apr 26 23:43:49 2016 OS/Arch: linux/amd64
docker
和 git
的命令有些相像,可以使用 pull
命令拉取遠程倉庫,不過 git
拉取的往往是代碼,而 docker
拉取的是鏡像
daocloud
拉取鏡像docker pull daocloud.io/library/centos:centos7
daocloud.io/library/centos
表示鏡像的名字
centos7
表示鏡像的版本,默認是 latest
,表示最新版
我們可以使用 docker images
命令查看本地鏡像列表,選擇啟動哪一個鏡像
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdaocloud.io/library/centos centos7 96eecaf1019a 6 days ago 196.7 MBdaocloud.io/library/centos latest 96eecaf1019a 6 days ago 196.7 MB44mfwmrx.mirror.aliyuncs.com/library/redis latest ad6e7427198c 2 weeks ago 184.9 MBdaocloud.io/library/ubuntu latest c5f1cf30c96b 2 weeks ago 120.8 MBhello-world latest 94df4f0ce8a4 3 weeks ago 967 Bdaocloud.io/library/ubuntu trusty-20160424 8fa7f61732d6 4 weeks ago 188 MBdaocloud.io/daocloud/daocloud-toolset latest 1ab33797d8a1 4 weeks ago 150.2 MB$ docker run -h master --dns=61.139.2.69 -it daocloud.io/library/centos:centos7
這個命令啟動一個容器,參數(shù)解釋如下
參數(shù)名 | 參數(shù)值 | 參數(shù)含義 |
---|---|---|
-h | master | 指定 hostname |
--dns | 61.139.2.69 | 指定 DNS ,默認的是 8.8.8.8 ,國內(nèi)環(huán)境... |
-it | 以交互模式啟動 |
具體的含義可以使用 docker run --help
查看,這里就不贅述了。
wget
等$ sudo yum install -y wget vim openssh-server openssh-clients net-tools
拉取到本地的鏡像是盡可能小的,所以很多命令都沒有安裝:
openssh-server
: 安裝 sshd
服務(wù)openssh-clients
: 安裝 ssh
命令net-tools
: 安裝 netstat
, ifconfig
等命令但是安裝完后并不會啟動 sshd
服務(wù),容器是被 docker
管理的,無法使用一些系統(tǒng)命令,要啟動 sshd
需要執(zhí)行如下命令
/usr/sbin/sshd -D &
后臺啟動 sshd
服務(wù),之后就可以使用 ssh
命令登錄容器了。
因為 ssh
是 hadoop
必需的服務(wù),所以我們要在容器啟動是就開啟,所以把這條命令寫到一個腳本里
$ vim /root/run.sh$ chmod 750 /root/run.sh$ cat /root/run.sh!/bin/bash/usr/sbin/sshd -D
這里不讓其后臺運行是為了保證容器不退出,只要容器在后臺運行,我們就可以在宿主機上連接容器。
本來是要開始下載 jdk
的,但是發(fā)現(xiàn)不能上網(wǎng),測試了一下發(fā)現(xiàn)是 dns
的問題。
不怕折騰的我怎么能夠忍受每啟動一個容器都要帶上 --dns
參數(shù)呢,一定可以改的。
結(jié)果是折騰了半天(真的是半天?。业搅讼旅娴慕鉀Q方案。
dns
/etc/default/docker
...DOCKER_NETWORK_OPTIONS="--dns=61.139.2.69"...
/lib/systemd/system/docker.service
...[Service]EnviornmentFile=-/etc/default/dockerExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \ $DOCKER_NETWORK_OPTIONS...
這里的設(shè)置是按照官網(wǎng)的說明來配置的,百度到的東西都不能使參數(shù)生效,不知道為什么
官網(wǎng)文檔 : http://docs.master.dockerproject.org/engine/admin/systemd/
然后重啟 docker
systemctl daemon-reloadsystemctl restart docker.service#使用這個命令可以查看 docker 的啟動命令是否生效$ ps -ef | grep dockerroot *** 1 0 5月25 ? 00:02:23 /usr/bin/docker daemon -H fd:// --dns=61.139.2.69 --registry-mirror=***
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.tar.gzsudo mkdir /usr/javasudo tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/javasudo echo "export JAVA_HOME=/usr/java/jdk1.8.0_91" >> /etc/bashrcsudo "export PATH=$PATH:$JAVA_HOME/bin" >> /etc/bashrcsudo echo "export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/bashrcsource /etc/bashrc
wget http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gzsudo mkdir /usr/local/hadoopsudo tar zxf hadoop-2.7.2.tar.gz -C /usr/local/hadoopsudo echo "export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.2" >> /etc/bashrcsudo echo "export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop" >> /etc/bashrcsudo echo "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" >> /etc/bashrcsource /etc/bashrc
對于 hadoop
,我還是個初學(xué)者,下面的配置是在網(wǎng)上借鑒的別人的文章
首先在 HADOOP_HOME
目錄下創(chuàng)建如下目錄
tmp
:臨時目錄namenode
:NameNode 存放目錄datanode
:DataNode 存放目錄切換到 HADOOP_CONFIG_HOME
目錄
cp mapred-site.xml.template mapred-site.xml
core-site.xml
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/hadoop-2.7.2/tmp</value> <description>A base for other temporary dirctories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> <final>true</final> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implemntation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implemnetation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description> </property></configuration>
這里指定了緩存目錄 $HADOOP_HOME/tmp
和默認文件系統(tǒng)
hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>2</value> <final>true</final> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time. </description> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/hadoop-2.7.2/namenode</value> <final>true</final> </property> <property> <name>dfs.datenode.data.dir</name> <value>/usr/local/hadoop/hadoop-2.7.2/datanode</value> <final>true</final> </property></configuration>
這里指定了備份的數(shù)目、 namenode
和 datanode
的目錄
mapred-site.xml
<configuration> <property> <name>maperd.job.tracker</name> <value>master:9001</value> <description>The host and port that the MapReduce job tracker runs at. IF "local", then jobs are run in-process as a single map and reduce task</description> </property></configuration>
這里指定了 MapReduce
作業(yè)調(diào)度程序的工作主機和端口。
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsacd ~/.ssh#獲取宿主機的公鑰,方便宿主機登錄scp melo@172.17.0.1:~/.ssh/id_rsa.pub authorized_keyscat id_rsa.pub >> authorized_keyschmod 600 authorized_keys
還有一個細節(jié),因為后面運行時,如果每次都從鏡像啟動,那都是全新的環(huán)境,使用 ssh
登錄時是需要確認的。
為了避免不必要的麻煩,特意查了資料,找到解決辦法。
想要達到連接新主機時不用確認的效果,就需要修改客戶端的 ssh
配置的StrictHostKeyChecking
。該參數(shù)默認為 ask
,修改為 no
Host * StrictHostKeyChecking no
感謝@GotGit的文章 http://www.worldhello.net/2010/04/08/1026.html
docker commit -m "hadoop installed" <container id|container name> centos:hadoop
#啟動 Hadoop
一開始沒有理清 hadoop
的網(wǎng)絡(luò)模型,以為需要每個節(jié)點都需要知道其他所有節(jié)點的地址,一直在配置固定 IP
。
但認真想一下, hadoop
并沒有這樣的需求,它只需要 master
知道其他節(jié)點在哪里就行了, slave
之間根本不需要通信。
所以上面創(chuàng)建的鏡像已經(jīng)可以使用了。
$ docker run -d --name slave1 centos:hadoop /root/run.sh$ docker run -d --name slave2 centos:hadoop /root/run.sh$ docker run -d --name master -h master -P --link slave1:slave1 --link slave2:slave2 centos:hadoop /root/run.sh
我將以上三個命令寫到了一個啟動腳本里,直接就可以啟動了,然后在用 ssh
登錄到 master
上啟動 hadoop
因為使用的是 docker
的默認網(wǎng)絡(luò),所有可以算出 master
的 IP
地址,當然,也可以通過 docker netword inspect bridge
命令去獲取
切換到 $HADOOP_HOME
目錄,首先格式化 namenode
:
./bin/hadoop namenode -format
看到如下信息,說明格式化成功了。
然后就可以啟動 Hadoop
了
$ ./sbin/start-all.shThis script is Deprecated. Instead use start-dfs.sh and start-yarn.shStarting namenodes on [master]master: Warning: Permanently added 'master,172.17.0.4' (RSA) to the list of known hosts.master: starting namenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-namenode-master.outlocalhost: starting datanode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-datanode-master.outStarting secondary namenodes [0.0.0.0]0.0.0.0: Warning: Permanently added '0.0.0.0' (RSA) to the list of known hosts.0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-2.7.2/logs/hadoop-root-secondarynamenode-master.outstarting yarn daemonsstarting resourcemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-resourcemanager-master.outlocalhost: starting nodemanager, logging to /usr/local/hadoop/hadoop-2.7.2/logs/yarn-root-nodemanager-master.out#使用 jps 查看進程$ jps480 SecondaryNameNode640 ResourceManager737 NodeManager290 DataNode195 NameNode1192 Jps
使用瀏覽器查看 web
管理接口
聯(lián)系客服