docker的使用越來越普遍了,大家不知道docker的還需要進一步學習一下。這次咱們使用docker去進行hadoop集群的構建。
使用docker構建的好處真的很多,一台電腦上可以學習安裝很多想做的東西,可以說是一個docker可以虛擬你想使用的任何環境。大家知道安裝hadoop需要很多機器和資源,但是現在一台電腦就可以搞定,是不是感覺技術很強大。
下面咱們這邊構建hadoop文章的梗概如下:
1. 介紹下docker的安裝配置及常用的命令。
2. 安裝過程所需要的工具。
3. 開始安裝步驟。
Docker在使用前需要提前安裝,不同的電腦安裝的方式不一樣,大家可以到官網上按照步驟進行安裝,我的電腦是MAC的,下載一個dmg文件安裝即可。很多同學安裝好了之后拉取進行很慢,這個和我之前遇到的問題非常類似,因為docker的鏡像庫是國外的,要從國外訪問並且拉取需要經歷非常長的網絡環境,這個時候就需要一些本地化的東西了。也就是找一些國內的鏡像站。
我本地的電腦配置了兩個,一個是阿里雲的鏡像加速站和國內鏡像加速站。大家不知道方法的可以搜索一下。
mac電腦可以點擊docker圖標,選擇 Preferences -> Daemon -> Registory mirrors(這個是舊版本的配置方式)。新版本選擇 Preferences -> Docker Engine, 里邊有一個Json內容個,把自己的國內鏡像加速配置成如下json。注意大家要用自己的鏡像加速id, 下面{your Id}要填寫你自己的申請的id。除了配置這個以外還配置了一個國內站
{ "debug": true, "registry-mirrors": [ "http://{your Id}.mirror.aliyuncs.com", "http://registry.docker-cn.com" ], "experimental": false }
配置的時候有個需要注意的地方,就是給到的地址是 https,我們需要改為“http”,否則會出現不能獲取cert文件。這個錯誤比較不容易發現,在使用的時候如果配置不正確的話,那么下載鏡像的時候還是很慢。
安裝好和配置好鏡像加速后,我們接下來看一些常用的Docker命令:
docker search ubuntu, 這個是從鏡像倉庫進行搜索一些鏡像,這個例子是搜索ubuntu的鏡像的。
docker pull ubuntu, 這個是從鏡像倉庫下載最新版本的ubuntu。當然也可以執行版本號,像ubuntu:16.04。
docker start/stop {image id}, 運行和停止一個指定的鏡像。
docker ps, 這個是查看當前正在運行的鏡像進程。在后邊加一個 -a,可以顯示所有鏡像進程,包括正在運行的以及已經結束的進程的。
docker attach {image id},進入正在運行的鏡像倉庫,輸入exit即可退出鏡像並且結束鏡像運行。如果想鏡像繼續運行的話,需要按快捷鍵 Ctrl + p + q 退出。
docker run ubuntu:16.04,即運行本地倉庫的ubuntu,版本號為16.04。如果本地倉庫沒有的話,那么就需要從遠程倉庫先pull到本地,然后再進行啟動。
docker commit -m "comment" {image id} ubuntu:hadoop, 將運行后的某個鏡像id保存成一個版本。也就是在即在鏡像里邊所做的修改都會保存起來。每次run的時候都是將原來的鏡像重新啟動,修改或操作的內容都不會保存。
docker images, 查看拉取下來的鏡像以及自己提交的鏡像都在里邊。
docker network create --driver=bridge haoop, 創建docker網絡,用於在同一個網絡中的機器可以訪問,模式為橋接模式,名稱為hadoop。
docker network ls,查看所創建的網路名稱。
基本的常用命令大概就是這些,咱們一起看一下目前搭建hadoop所使用的工具有哪些。
vim,文本編輯工具。
open-jdk1.8, hadoop使用, 當然同學們也可以使用oracle的jdk1.8。
net-tools, 網絡工具,用於機器之間的訪問時用。
openssh-server, openssh-cient ssh的服務器和客戶端,用於遠程免密訪問。
scala, 這個hadoop需要的。
基本工具就這些,接下來我們開始安裝Hadoop集群。集群的結構為一台master, 兩台slaver-slave1, slave2。
使用命令“docker pull ubuntu:16.04”,將下載16.04版本的操作系統。下載完成之后可以通過 docker images 查看下載的鏡像。
接下載我們需要進入到ubuntu里邊去,將ubuntu原有的源進行備份為sources_init.list,然后把apt的源改為阿里的源,這樣下載和安裝一些工具的話會比較快。
docker run ubuntu:16.04 /bin/bash cp /etc/apt/sources.list /etc/apt/sources_init.list echo "deb http://mirrors.aliyun.com/ubuntu/ xenial main deb-src http://mirrors.aliyun.com/ubuntu/ xenial main deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu/ xenial-security main deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe" > /etc/apt/sources.list
執行apt update,將系統更新一下。接下來安裝open-jdk1.8和scala。安裝完成后查看一下java和scala, 使用 java -version有輸出說明成功。執行scala進入scala環境,輸入“:q”或者按Ctrl+D即可退出scala環境。
apt update apt install openjdk-8-jdk apt install scala
接下來安裝編輯工具vim和網絡工具 net-tools。
apt install vim apt install net-tools
安裝ssh服務端和客戶端,用於遠程免密訪問。Hadoop采用使用指定機器名后,然后由腳本進行免密訪問后,直接執行相應的命令,比如啟動服務等,是不是很方便?
apt install openssh-server apt install openssh-client
進入當前用戶目錄,然后生成免密登錄的key。生成key的時候直接按回車即可。
cd ~ ssh-keygen -t rsa -P ""
這個時候會直接生成一個.ssh文件夾,通過ls -al進行查看。將生成的公鑰key追加到授權的key列表。啟動ssh服務,然后進行本機測試,如果能成功登陸,說明已經成功了
cat .ssh/id_rsa.put >> .ssh/authorized_keys service ssh start ssh 127.0.0.1
為了保證系統啟動的時候也啟動ssh服務,我們將啟動命令 “service ssh start” 放到bashrc文件末尾中。
vim ~/.bashrc
接下來我們開始下載hadoop,將文件進行解壓放到/usr/local/, 改名為hadoop。
wget https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local cd /usr/local mv hadoop-3.2.1 hadoop
通過命令“update-alternatives --config java” 查看一下java的安裝路徑。配置一下本地的JAVA和Hadoop環境。通過使用命令“vim /etc/profile”,然后放好內容保存后,執行“source /etc/profile”,讓配置的變量內容立即成生效。
#java export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH #hadoop export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_YARN_HOME=$HADOOP_HOME export HADOOP_INSTALL=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HDFS_DATANODE_USER=root export HDFS_DATANODE_SECURE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export HDFS_NAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
修改hadoop的環境變量,“vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh”,加入如下變量后保存。配置JAVA環境變量,各節點的用戶。
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
修改hadoop下的環境/usr/local/hadoop/conf下的core-site.xml。加入如下內容。fs.default.name 為默認的master節點。hadoop.tmp.dir為hadoop默認的文件路徑。如果本機沒有的話需要自己通過 mkdir 命令進行創建。
<configuration> <property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/root/hadoop/tmp</value> </property> </configuration>
修改同目錄conf下的hdfs-site.xml。dfs.replication即從節點的數量,2個從節點。dfs.namenode.name.dir為namenode的元數據存放的路徑,dfs.namenode.data.dir是數據鎖存放的路徑。
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/root/hadoop/hdfs/name</value> </property> <property> <name>dfs.namenode.data.dir</name> <value>/root/hadoop/hdfs/data</value> </property> </configuration>
修改同目錄conf下的mapred-site.xml。指定mapreduce執行框架設置為yarn。mapreduce.application.classpath 設置mapreduce的應用執行類路徑。
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.application.classpath</name> <value> /usr/local/hadoop/etc/hadoop, /usr/local/hadoop/share/hadoop/common/*, /usr/local/hadoop/share/hadoop/common/lib/*, /usr/local/hadoop/share/hadoop/hdfs/*, /usr/local/hadoop/share/hadoop/hdfs/lib/*, /usr/local/hadoop/share/hadoop/mapreduce/*, /usr/local/hadoop/share/hadoop/mapreduce/lib/*, /usr/local/hadoop/share/hadoop/yarn/*, /usr/local/hadoop/share/hadoop/yarn/lib/* </value> </property> </configuration>
修改yarn.xml。yarn.resourcemanager.hostname為yarn資源管理的主機名為master機器。 yarn.nodemanager.aux-services說明當前yarn采用mapreduce洗牌的方式進行處理。
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改conf/workers, 即告訴Hadoop worker的機器為哪些。刪除localhost,加入如下內容。
slave1
slave2
進入Hadoop的bin路徑下將namenode進行格式化。這樣hadoop才可以使用,否則無法使用。
./bin/hadoop namenode -format
Hadoop的基本配置文件和內容已經配置好,下一步我們退出鏡像,Ctrl+c 或者輸入exit即可退出。我們通過docker ps -a 查看這個進行的container id。接下來保存為 ubuntu:hadoop鏡像。
docker commit -m "hadoop install" {CONTAINER ID} ubuntu:hadoop
我們創建一個hadoop機器環境內所需要的網絡環境。同一個網絡環境下可以直接進行訪問。創建好了了之后通過第二個命令進行查看創建了哪些網絡環境。
docker network create --driver=bridge hadoop docker network ls
接下來我們開三個Terminal窗口,每個窗口分別執行一條命令。-h 指定主機名,有了主機名可以直接通過主機名訪問機器。 --name指定容器名。如果我們一會兒退出了之后,我們可以通過“docker restart master”進行master的啟動。-p為將容器里邊的端口暴露為外邊使用的端口。因為master可以通過如下兩個界面進行訪問,所以暴露出來兩個端口。
docker run -it --network hadoop -h "master" --name "master" -p 9870:9870 -p 8088:8088 ubuntu:hadoop /bin/bash docker run -it --network hadoop -h "slave1" --name "slave1" ubuntu:hadoop /bin/bash docker run -it --network hadoop -h "slave2" --name "slave2" ubuntu:hadoop /bin/bash
如果我們采用docker start master -d,這種守護進行啟動的,那么我們需要通過docker attach {image id}進入機器。我們在master的機器上啟動所有節點。我們不需要用再去slave1和slave2執行此命令,因為我們剛才的免密ssh已經在腳本里邊操作好了。
cd /usr/local/hadoop/sbin/ ./start-all.sh
如果一切啟動都正常的話,我們訪問本地 localhost:9870 和 localhost:8088 。
這說明就成功了。接下來咱們使用內置的wordcount程序執行以下,然后查看一下結果。
我們進入hadoop的bin目錄下,將上級的README.txt寫入到file.txt文件里邊。在HDFS創建一個input目錄,將文件上傳到input目錄里邊,然后看一下input目錄里邊是否有文件。然后就可以使用內容的wordcount進行調用。將結果集放到/output里邊。
cat ../README.txt > ../file.txt ./hadoop fs -mkdir /input ./hadoop fs -put ../file.txt /input ./hadoop fs -ls /input ./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /input /output
等執行完了也就出現了 map 100% reduce 100%。這個時候說明執行成功了,也就是講文件的單詞進行統計了。查看一下output文件目錄“./hadoop fs -ls /output”,里邊有兩個文件,_SUCCESS說明成功了,里邊的part-r-0000是結果集,通過命令“./hadoo fs -cat /output/part-r-0000”就可以查看結果集了。
Found 2 items -rw-r--r-- 2 root supergroup 0 2020-03-18 09:25 /output/_SUCCESS -rw-r--r-- 2 root supergroup 1301 2020-03-18 09:25 /output/part-r-00000
好了,完整的搭建過程就完成了。