准備
啟動一個centos容器
docker run -i -t --name hadoop centos /bin/bash
下載好需要的包
[root@CyzLearnCloud sparklearn]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
[root@CyzLearnCloud sparklearn]# wget http://distfiles.macports.org/scala2.12/scala-2.12.12.tgz
[root@CyzLearnCloud sparklearn]# wget https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
[root@CyzLearnCloud sparklearn]# wget https://mirror.bit.edu.cn/apache/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz
解壓 上傳
[root@CyzLearnCloud sparklearn]# docker cp hadoop-3.2.1 e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp jdk1.8.0_131 e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp scala-2.12.12 e9d7c:/opt
[root@CyzLearnCloud sparklearn]# docker cp spark-3.0.1-bin-hadoop3.2 e9d7c:/opt
配置jdk
設置java 環境變量,配置profile
vi /etc/profile
在文件末尾加上
JAVA_HOME=/opt/jdk1.8.0_131/
JAVA_BIN=/opt/jdk1.8.0_131/bin
JRE_HOME=/opt/jdk1.8.0_131/jre
CLASSPATH=/opt/jdk1.8.0_131/jre/lib:/opt/jdk1.8.0_131/lib:/opt/jdk1.8.0_131/jre/lib/charsets.jar
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使得配置立馬有效
source /etc/profile
配置 bashrc
vi ~/.bashrc
在文件末尾加上
export JAVA_HOME=/opt/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使得配置立馬有效
source ~/.bashrc
查看成功: java -version
配置scala
配置環境變量
vim /etc/profile
export SCALA_HOME=/opt/scala-2.12.12
export PATH=$PATH:$SCALA_HOME/bin
環境變量生效
source /etc/profile
查看scala版本
scala -version
配置Hadoop
在hadoop目錄下
vi etc/hadoop/hadoop-env.sh
在文件末尾添加jdk目錄(這里=后面添加的是你的jdk目錄)
export JAVA_HOME=/opt/jdk1.8.0_131
檢查安裝的hadoop是否可用 ./bin/hadoop version
(注意要在hadoop的安裝目錄下執行)
- 配置hadoop環境變量
前面在驗證hadoop命令的時候需要在hadoop的安裝目錄下執行./bin/hadoop,為了方便在任意地方執行hadoop命令,配置hadoop的全局環境變量,與java一樣,修改~/.bashrc文件
執行vi ~/.bashrc
添加內容
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
source ~/.bashrc
使環境變量生效
hadoop version
驗證變量生效
安裝ssh
yum install openssh-clients
yum install openssh-server
驗證ssh安裝
/usr/sbin/sshd
ssh localhost
可能會出現
Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
的錯誤,運行以下即可
#RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
#RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
#RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key
commit
docker commit -m "centos7 with hadoop and ssh" e9d7 centos7-hadoop-sshtest
編寫Dockerfile
這一步的主要目的是,讓容器啟動的時候自動運行ssh
mkdir centos7-hadoop-ssh
cd centos7-hadoop-ssh
vi Dockerfile
加入以下內容
# 選擇一個已有的os鏡像作為基礎r
FROM centos7-hadoop-sshtest
# 鏡像的作者
MAINTAINER cyz
# 啟動sshd服務並且暴露22端口
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
~
構建鏡像
docker build -t centos7-hadoop-ssh .
插曲
docker容器無法ping?因為沒有DNS
以下配置
我們可以在宿主機的 /etc/docker/daemon.json 文件中增加以下內容來設置全部容器的 DNS:
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
設置后,啟動容器的 DNS 會自動配置為 114.114.114.114 和 8.8.8.8。
配置完,需要重啟 docker 才能生效。
/etc/init.d/docker restart
然后啟動容器 ping www.badiu.com
就正常了
搭建hadoop分布式集群
集群規划
准備搭建一個具有三個節點的集群,一主兩從
主節點:hadoop0 ip:192.168.2.10
從節點1:hadoop1 ip:192.168.2.11
從節點2:hadoop2 ip:192.168.2.12
啟動容器
docker run --name hadoop0 --hostname hadoop0 --net hadoop --ip 192.168.2.10 -dit --privileged=true -P -p 50070:50070 -p 8088:8088 -p 9870:9870 centos7-hadoop-ssh
docker run --name hadoop1 --hostname hadoop1 --net hadoop --ip 192.168.2.11 -dit -P --privileged=true centos7-hadoop-ssh
docker run --name hadoop2 --hostname hadoop2 --net hadoop --ip 192.168.2.12 -dit -P --privileged=true centos7-hadoop-ssh
注意!后面不要跟/bin/bash
,不然Dockerfile文件中的CMD會被覆蓋,導致ssh沒有啟動
網上的教程使用的50070,我查了一下資料,50070是hadoop2的webUI端口,hadoop3的webUI端口是9870,我做到最后才發現的,在啟動的時候使用的是老命令
docker run --name hadoop0 --hostname hadoop0 --net hadoop --ip 192.168.2.10 -dit --privileged=true -P -p 50070:50070 -p 8088:8088 centos7-hadoop-ssh
但是正確的應該是正文寫的
固定IP
在宿主機上下載pipework
git clone https://github.com/jpetazzo/pipework.git
cp -rp pipework/pipework /usr/local/bin/
安裝bridge-utils
yum -y install bridge-utils
創建網絡
brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0
給容器設置固定ip
pipework br0 hadoop0 192.168.2.10/24
pipework br0 hadoop1 192.168.2.11/24
pipework br0 hadoop2 192.168.2.12/24
三台docker主機互ping一下,沒問題
但是這時候我兩個容器之間ping成功了,ssh卻提示no route to host
嘗試用docker network解決
docker network create --subnet=192.168.2.0/24 hadoop
配置hadoop集群
我們的目的只是為了搭建HDFS
對三台容器都進行設置
- 設置主機名與ip的映射,修改
vi /etc/hosts
添加下面配置
192.168.2.10 hadoop0
192.168.2.11 hadoop1
192.168.2.12 hadoop2
- 設置ssh免密碼登錄
cd ~
mkdir .ssh
cd .ssh
ssh-keygen -t rsa(一直按回車即可)
ssh-copy-id -i localhost
ssh-copy-id -i hadoop0
ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
hadoop0上配置hadoop
進入到/opt/hadoop-3.2.1/etc/hadoop
HDFS的配置文件:大多數默認是XML和TXT格式存在。配置文件默認存放在/etc/hadoop目錄下。
HDFS中6個重要的配置文件:
- core-site.xml:Hadoop全局的配置文件,也包含一些HDFS的宏觀配置。
- dfs-site.xml:HDFS配置文件。
- yarn-site.xml:YARN配置文件。
- mapred-sie.xml:MapReduce配置文件。
- slaves:從節點列表。
- hadoop-env.sh:與運行腳本的環境變量相關的配置文件。
-
core-site.xml
<configuration> <property><!--指定namenode的地址--> <name>fs.defaultFS</name> <value>hdfs://hadoop0:9000</value> </property> <property><!--用來指定使用hadoop時產生文件的存放目錄--> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-3.2.1/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
-
hdfs-site.xml
dfs-site.xml:HDFS的重要配置文件,其Namenode節點和Datanode節點相關的配置項不同。
Namenode主要有3個配置項:dfs.namenode.name.dir、dfs.blocksize、dfs.replication。
Datanode主要有1個配置項:dfs.datanode.data.dir。
<configuration> <property> <name>dfs.http.address</name> <value>hadoop0:9870</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/dfs/name</value> <description>namenode的目錄位置,對應的目錄需要存在value里面的路徑</description> </property> <property> <name>dfs.datanode.data.dir</name> <value>/opt/dfs/data</value> <!--datanode的目錄位置,對應的目錄需要存在value里面的路徑,可以是一個或多個用逗號分隔的本地路徑--> </property> <property> <name>dfs.replication</name> <value>1/value> <!--s系統的副本數量--> </property> </configuration>
-
yarn-site.xml
<configuration> <property> <description>The hostname of the RM.</description> <name>yarn.resourcemanager.hostname</name> <value>hadoop0</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> </configuration>
-
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
-
對於start-dfs.sh和stop-dfs.sh文件,添加下列參數:
#!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root
對於start-yarn.sh和stop-yarn.sh文件,添加下列參數:
#!/usr/bin/env bash YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root
重新開始start...就可以了。
-
修改hadoop0中hadoop的一個配置文件etc/hadoop/slaves
刪除原來的所有內容,修改為如下
hadoop1
hadoop2
- 在hadoop0中執行命令
scp -rq /opt/hadoop-3.2.1 hadoop1:/opt
scp -rq /opt/hadoop-3.2.1 hadoop2:/opt
- 格式化
進入到/usr/local/hadoop目錄下
bin/hdfs namenode -format
注意:在執行的時候會報錯,是因為缺少which命令,安裝即可
執行下面命令安裝
yum install -y which
啟動成功
啟動HDFS
在所有 NameNode 上啟動:
$HADOOP_HOME/bin/hdfs --daemon start namenode
在所有 DataNode 上啟動:
$HADOOP_HOME/bin/hdfs --daemon start datanode
jps
命令查看如下
NameNode(hadoop0):
DataNode(hadoop1/2):
驗證
VNC連接到宿主機,登錄到http://192.168.2.10:9870/
,查看成功
使用驗證
創建目錄
$ ./bin/hdfs dfs -mkdir -p /hello
上傳文件到HDFS
首先先新建一個本地文件,
$ vim ~/test.txt
hello world
fuck world
然后使用下面命令進行上傳,
$ ./bin/hdfs dfs -put ~/test.txt /hello
查看目錄和文件內容
$ ./bin/hdfs dfs -ls /hello
/hello/test.txt
$ ./bin/hdfs dfs -cat /hello/test.txt
hello world
fuck world
當然,在webUI中也可以看到
啟動Spark
先啟動好HDFS(如上)
master節點
在master節點(192.168.2.10)上,直接進入到spark目錄下,運行./sbin/start-master.sh
啟動成功后通過8080端口進行查看
記住這個URL
worker節點
在 worker 上啟動 worker 並連接(注冊)到 master 上:
./sbin/start-slave.sh <url>
成功啟動 worker 后,在 master 上刷新 localhost:8080 頁面,可以看到添加的 worker 信息。
以hadoop2為例,進入到spark目錄下,sbin/start-slave.sh spark://hadoop0:7077
這邊就有了
驗證
在worker節點(hadoop1)上跑一個spark給的demo程序
./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop0:7077 examples/jars/spark-examples_2.12-3.0.1.jar 100
參考
https://www.cnblogs.com/shiyiwen/p/5076561.html
https://blog.csdn.net/shenzhen_zsw/article/details/73927848
https://blog.csdn.net/chongchen1581/article/details/100862753
https://blog.51cto.com/13670314/2341236
https://www.cnblogs.com/Jing-Wang/p/10672609.html
https://blog.csdn.net/xu470438000/article/details/50512442