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

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