notice:看這篇要注意,暫時我能跑起來,web ui也能訪問,但是程序連的時候報rpc問題,不知道是不是內存不夠。
Docker的入門
啓動Docker服務:
systemctl start docker.service
我們可以拉一個Ubuntu鏡像,基於該鏡像我們搭建Spark集羣:
docker pull ubuntu
下載好鏡像到本地後,我們可以查看鏡像:
docker images
使用run命令,創建一個容器來運行鏡像:
docker run -it ubuntu
exit退出然後下面命令再次進入docker
docker exec -it <container_id> /bin/bash
網絡拓撲
搭建一個有意義的小規模集羣,我選擇了3臺服務器作爲Spark計算節點(Worker)。集羣中光有計算節點還不夠,這3臺服務器同時也作爲分佈式文件系統(HDFS)的數據節點(DataNode)。指定了哪些服務器用來計算,哪些用來存儲之後,我們還需要指定來管理計算和存儲的主節點。一個簡單方案:我們可以讓cloud1作爲管理計算節點的主節點(Master),同時它也作爲管理數據節點的主節點(NameNode)。
很容易看到簡單方案不夠完美:首先,要是cloud1作爲NameNode宕機,整個分佈式文件系統則無法工作。此時,我們應當採用基於HA的HDFS方案:由多個NameNode共同管理DataNode,但是隻有一個NameNode處於活動(Active)狀態,當活動的NameNode無法工作時,則需要其他NameNode候補。這裏至少涉及2個關鍵技術:
- 如何共享NameNode的信息(EditLog)?NameNode存儲的信息包括但不限於:數據在各DataNode上如何存儲,哪些DataNode是可用的。所以,當活動的NameNode無法工作時,應當將這些信息傳遞給下一個被選中的NameNode。與其傳遞,不如所有的NameNode共享這些信息。這些信息將被分佈式地存儲在JournalNode上。在本集羣中,我們使用所有3臺服務器都作爲JournalNode。cloud1和cloud2作爲NameNode。
- 如何確保只有一個NameNode是活動的?當活動的NameNode無法工作時,如何確定下一個活動的Namenode?Zookeeper可以解決這兩個問題,在本集羣中,3臺服務器都作爲Zkserver節點。
再者,選用cloud1作爲Master來管理計算(standalone)的方式對資源的利用率不比Yarn方式。所以,在本集羣中選用cloud1做爲ResourceManager,3臺服務器都作爲NodeManager)。
改進後的集羣描述如下:
節點 | Zkserver | NameNode | JournalNode | ResourceManager | NodeManager |
Master |
Worker |
cloud1 | √ | √ | √ | √ | √ | √ | √ |
cloud2 | √ | √ | √ | × | √ | × | √ |
cloud3 | √ | × | √ | × | √ | × | √ |
本機查看ip地址:
ip addr show
ip addr show docker0
docker裏面安裝ip, ipconfig
$ apt update
$ apt install wget
$ apt install vim
$ apt install net-tools # ifconfig
$ apt install iputils-ping # ping
docker裏面看ip:
ifconfig
在容器cloud1中通過apt工具來安裝ssh:
apt install ssh
SSH
裝好了以後,由於我們是 Docker
容器中運行,所以 SSH
服務不會自動啓動。需要我們在容器啓動以後,手動通過/usr/sbin/sshd
手動打開SSH
服務。未免有些麻煩,爲了方便,我們把這個命令加入到~/.bashrc
文件中。通過vim ~/.bashrc
編輯.bashrc
文件,
$ vim ~/.bashrc
在文件後追加下面內容:
#autorun
/usr/sbin/sshd
然後運行 source ~/.bashrc
使配置生效
$ source ~/.bashrc
此過程可能會報錯:Missing privilege separation directory: /var/run/sshd
需要自己創建這個目錄
$ mkdir /var/run/sshd
- 生成訪問密鑰
$ cd ~/
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cd .ssh
$ cat id_rsa.pub >> authorized_keys
注意: 這裏,我的思路是直接將密鑰生成後寫入鏡像,免得在買個容器裏面再單獨生成一次,還要相互拷貝公鑰,比較麻煩。當然這只是學習使用,實際操作時,應該不會這麼搞,因爲這樣所有容器的密鑰都是一樣的!!!
測試是否能連接成功:
ssh root@<ip>
到這裏,SSH
也算安裝配置完成了
安裝zookeeper
cd /root/
mkdir soft
cd soft
mkdir apache
mkdir scala #這個目錄是用來安裝 scala 的
cd apache
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz
wget https://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz
cd ../scala
wget https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.tgz
# JAVA
vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
vim ~/.profile
export PATH=$PATH:$JAVA_HOME/bin
# ZOOKEEPER
tar xvzf zookeeper-3.4.9.tar.gz
vim ~/.bashrc
export ZOOKEEPER_HOME=/root/soft/apache/zookeeper-3.4.9
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source ~/.bashrc #使環境變量生效
cd zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
dataDir=/root/soft/apache/zookeeper-3.4.9/tmp
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
../tmp/myid 文件中保存的數字代表本機的zkServer編號 在此設置master爲編號爲1的zkServer,之後生成slave1和slave2之後還需要分別修改此文件
cd ../
mkdir tmp
cd tmp
touch myid
echo 1 > myid
HADOOP
tar xvzf hadoop
vim ~/.bashrc
export HADOOP_HOME=/root/soft/apache/hadoop/hadoop-2.7.6
export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
# 保存退出 esc :wq!
source ~/.bashrc #使環境變量生效
cd $HADOOP_CONFIG_HOME/
vi core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/soft/apache/hadoop-2.7.6/tmp</value>
<description>A base for other temporary directories.</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 implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description>
</property>
</configuration>
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>slave1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>slave1:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ns1</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/root/soft/apache/hadoop-2.7.6/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
vi yarn-site.xml
# yarn.resourcemanager.hostname RescourceManager的地址,NodeManager的地址在slaves文件中定義
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<configuration>
<!-- 指定MapReduce框架爲yarn方式 -->
<property>
<name>
mapreduce.framework.name
</name>
<value>yarn</value>
</property>
</configuration>
vim slaves
master
slave1
slave2
Spark
cd /root/soft/apache/spark
vim ~/.bashrc
export SPARK_HOME=/root/soft/apache/spark-2.2.0-bin-hadoop2.7
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
# 保存退出 esc :wq!
source ~/.bashrc #使環境變量生效
cd /root/soft/apache/spark-2.2.0-bin-hadoop2.7/conf
cp spark-env.sh.template spark-env.sh
vim spark-env.sh
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=128m
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export SCALA_HOME=/root/soft/scala/scala-2.11.11 # scala我們後面會安裝它
export SPARK_HOME=/root/soft/apache/spark-2.2.0-bin-hadoop2.7
export HADOOP_CONF_DIR=/root/soft/apache/hadoop-2.7.6/etc/hadoop
export SPARK_LIBRARY_PATH=$SPARK_HOME/lib
export SCALA_LIBRARY_PATH=$SPARK_LIBRARY_PATH
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_MASTER_PORT=7077
vim slaves
#master 這個server不做worker也可以
#master
slave1
slave2
Scala
vim ~/.bashrc
export SCALA_HOME=/root/soft/scala/scala-2.11.11
export PATH=$PATH:$SCALA_HOME/bin
# 保存退出 esc :wq!
source ~/.bashrc #使環境變量生效
exit;
保存一個副本
docker commit -m "zookeeper hadoop spark scala install" 36d4a7d57222 ubuntu:spark
記得master綁定端口
首先,master 服務映射了好幾組端口到本地,分別功能爲: 4040:Spark 運行任務時候提供 web 界面觀測任務的具體執行狀況,包括執行到哪個階段、在哪個 executor 上執行; 8042:Hadoop 的節點管理界面; 7077:Spark 主節點的監聽端口,用戶可以提交應用到這個端口,worker 節點也可以通過這個端口連接到主節點構成集羣; 8080:Spark 的監控界面,可以看到所有的 worker、應用整體信息; * 8088:Hadoop 集羣的整體監控界面。
docker run -p 4040:4040 -p 8042:8042 -p 7077:7077 -p 8080:8080 -p 8088:8088 -ti -h master ubuntu:spark
ifconfig #172.17.0.2
container 6405cbdabf5d
docker start 6405cbdabf5d
docker exec -it blissful_edison /bin/bash
docker run -ti -h slave1 ubuntu:spark
docker start a46ded28e9a3
docker exec -it condescending_bhaskara /bin/bash
#172.17.0.3
docker run -ti -h slave2 ubuntu:spark
172.17.0.4
docker start 4507da0eb556
docker exec -it nervous_wozniak /bin/bash
啓動腳本
cd /root/soft
mkdir shell
cd shell
vim run_master.sh
#!/bin/bash
#清空hosts文件信息
echo> /etc/hosts
#配置主機的host
echo 172.17.0.1 host >> /etc/hosts
echo 172.17.0.2 master >> /etc/hosts
echo 172.17.0.3 slave1 >> /etc/hosts
echo 172.17.0.4 slave2 >> /etc/hosts
#配置 master 節點的 zookeeper 的 server id
echo 1 > /root/soft/apache/zookeeper-3.4.9/tmp/myid
zkServer.sh start
hadoop-daemons.sh start journalnode
hdfs namenode -format
hdfs zkfc -formatZK
start-dfs.sh
start-yarn.sh
start-all.sh
vim run_slave1.sh
#!/bin/bash
#清空hosts文件信息
echo> /etc/hosts
#配置主機的host
echo 172.17.0.1 host >> /etc/hosts
echo 172.17.0.2 master >> /etc/hosts
echo 172.17.0.3 slave1 >> /etc/hosts
echo 172.17.0.4 slave2 >> /etc/hosts
#配置 master 節點的 zookeeper 的 server id
echo 2 > /root/soft/apache/zookeeper-3.4.9/tmp/myid
zkServer.sh start
vim run_slave2.sh
#!/bin/bash
echo> /etc/hosts
echo 172.17.0.1 host >> /etc/hosts
echo 172.17.0.2 master >> /etc/hosts
echo 172.17.0.3 slave1 >> /etc/hosts
echo 172.17.0.4 slave2 >> /etc/hosts
echo 3 > /root/soft/apache/zookeeper-3.4.9/tmp/myid
zkServer.sh start
vim stop_master.sh
#!/bin/bash
zkServer.sh stop
hadoop-daemons.sh stop journalnode
stop-dfs.sh
stop-yarn.sh
stop-all.sh
chmod +x run_master.sh
chmod +x run_slave1.sh
chmod +x run_slave2.sh
chmod +x stop_master.sh
exit;
vim /etc/hosts
172.17.0.1 host
172.17.0.2 master
172.17.0.3 slave1
172.17.0.4 slave2
./root/soft/shell/run_slave1.sh
./root/soft/shell/run_slave2.sh
./root/soft/shell/run_master.sh
./root/soft/shell/stop_master.sh
不出意外的話,你應該能看到類似如下信息:
2081 QuorumPeerMain
3011 NodeManager
2900 ResourceManager
2165 JournalNode
2405 NameNode
3159 Master
2503 DataNode
3207 Jps
錯誤追蹤:
1)驗證zookeeper是否啓動成功:
然後,在各個節點輸入jps命令,會出現如下進程:
QuorumPeerMain
上面說的輸入jps命令,若顯示對應的進程,即表示啓動成功,同樣我們也可以輸入zk的狀態命令查看,命令如下:
bin/zkServer.sh status
2)hadoop-daemons.sh Java_home not set
vi /hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
寫錯了一個文件,結束的configuration少了個/
vi /root/soft/apache/hadoop-2.7.6/etc/hadoop/core-site.xml
3)every node need to ssh every node first, include yourself, otherwise run_master will cause error,他好似會直接說報錯,不會問你是否相信其rsa
curl http://localhost:8080
4)jps裏只是master不見了。那就是spark問題,如果是spark,那就是start-all.sh問題。他是start-master.sh和start-slaves.sh的結合,單開start-master.sh沒問題。那應該就是start-slaves.sh問題。好似後面單獨開spark就沒問題。
https://www.cnblogs.com/yourarebest/p/5296817.html
5)如果spark master死了(jps裏面沒有master),如果是內存問題:https://blog.csdn.net/weixin_32265569/article/details/84098412
6)if hadoop log said cluster not align then align then, then restart master, then press no during start
data-node:
vi /root/soft/apache/hadoop-2.7.6/tmp/dfs/data/current/VERSION
CID-771ec49c-61ab-4d1a-8367-112860e6a013
name-node:
vi /root/soft/apache/hadoop-2.7.6/journal/ns1/current/VERSION
CID-c08fc90b-9730-4485-9a96-10d908852b8a
the same: CID-c08fc90b-9730-4485-9a96-10d908852b8a