Spark安裝,使用docker

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章