使用fabric解决百度BMR的spark集群各节点的部署问题
2017-10-31 19:47
573 查看
前言
和小伙伴的一起参加的人工智能比赛进入了决赛之后的一段时间里面,一直在构思将数据预处理过程和深度学习这个阶段合并起来。然而在合并这两部分代码的时候,遇到了一些问题,为此还特意写了脚本文件进行处理。现在比赛过去,我觉得应该把这部分的东西写出来,看看是否有其他朋友会遇到这方面问题,希望对他们有帮助。如有不对之处,请大家指正,谢谢!比赛遇到的集群各节点的部署痛点
一个前提
在初赛的时候,为了快捷提供数据接口给后面的深度学习模型建立使用,我们将数据预处理独立出来,使用了最为简单的Python操作。在此,考虑到的是,我们的代码需要移植到评委所用的电脑当中进行验证,可能存在没有import某些库的情况,最后导致程序运行失败。麻烦之处
在进入到决赛后,由于这两块的结合在一起的迫切需求,我们不得不又重新import我们库。然而在这块当中,如果我们只在Master节点,问题很简单,直接将库打包好,写个脚本就完事了。而在百度的BMR的spark集群里面,因为Slaves节点不能访问网络(如下图),因而我们要登录了Master节点之后,然后通过Master内网ssh到Slaves上,进而才能打开我们的脚本部署好我们的程序运行环境。提出
这样子来说,我们有没有一个很好的办法,能通过Master上运行一个脚本,达到了整个集群的所有节点都自动部署我们的程序运行环境呢?经过阅读书籍《spark最佳实践》,了解到了Python的第三方库fabric。fabric
首先请允许介绍一下fabric,具体使用方法可以查阅官方API Doc,在此我介绍一下我将使用到某一小部分。执行本地任务
fabric提供了一个local("shell")的接口,shell就是Linux上的shell命令。例如
from fabric.api import local local('ls /root/') #ls root文件夹下的文件列表
执行远程任务
fabric的强大之处,不是它在本地做到执行命令,本地执行的事儿可以用原生shell来解决,而是能在远程的服务器上执行命令,哪怕远程的服务器上没有安装fabric。它是通过ssh方式实现的,因而我们需要定义一下三个参数:env.hosts = ['ipaddress1', 'ipaddress2'] env.user = 'root' env.password = 'fuckyou.'
通过设置ip,用户名以及用户名密码,我们可以使用
run("shell"),达到在远程服务器上执行我们所需要执行的任务。例如
from fabric.api import run, env
env.hosts = ['ipaddress1', 'ipaddress2'] env.user = 'root' env.password = 'fuckyou.'
run('ls /root/') #ls root文件夹下的文件列表
打开某一个文件夹
有时候我们需要精准地打开某一个文件夹,之后执行该文件下的某一个脚本或者文件。这是,我们得使用以下两个接口:本地
with lcd('/root/local/'): local('cat local.txt') # cat 本地'/root/local/'下的local.txt文件
远程
with cd('/root/distance/'): run('cat distance.txt') # cat 远程'/root/distance/'下的distance.txt文件
执行fabric任务
我们可以通过命令行fab --fabfile=filename.py job_func # filename.py为使用fabric写的Python文件 # job_func 为带有fabric的函数,即主要执行的函数 # 以上两个名称都是可以自取,下面的介绍当中,我的为job.py 与 job
socket
为什么会用到socket呢?在上一篇文章当中,我提及到在百度BMR的集群中,他们设置集群Slaves都是通过slaves的hostname的,而不是通过ip。而因为在使用fabric设置环境中的hosts的时候需要用到ip,那我们得通过hostname,进而找到ip。你或许有疑问,为什么不直接设定Slaves的IP呢?但是百度BMR每次创建spark集群,它提供的内网IP都是不断在变动的,呈现出IP末端递增。
综上,还是使用hostname获取IP
gethostbyname接口
我们可以用过gethostbyname('hostname')接口,传入hostname,然后得到一个IPV4的ip地址。
使用fabric编写各节点自动部署脚本
获取Slaves的hostname
和上一篇文章说道的一样,我们Slaves的hostname是藏在了百度BMR的这里:'/opt/bmr/hadoop/etc/hadoop/slaves'
将hostname转化为ip,设置fabric的env参数
host_list = [] f = open(path, 'r') slaves_name = f.read().split('\n') for i in range(1, slaves_name.__len__()-1): temp_name = slaves_name[i] temp_ip = socket.gethostbyname(temp_name) ip_port = temp_ip + ":22" host_list.append(ip_port) del temp_name del temp_ip del ip_port env.user = 'root' env.password = '*gdut728' env.hosts = host_list
编写需要自动部署的job
在这里,我要自动部署的是:1 下载Python第三方库jieba
2 在本地解压下载好的jieba压缩包
3 在本地,进入到解压好的文件夹中,安装jieba
4 将下载好的压缩包传送到Slaves节点上
5 在远程端,解压下载好的jieba压缩包
6 在远程端,进入到解压好的文件夹中,安装jieba
将上面步骤转化为代码,即
def job(): local_command = "wget https://pypi.python.org/packages/71/46/c6f9179f73b818d5827202ad1c4a94e371a29473b7f043b736b4dab6b8cd/jieba-0.39.zip#md5=ca00c0c82bf5b8935e9c4dd52671a5a9" local(local_command) jieba_unzip = "unzip jieba-0.39.zip" jieba_path = "/root/jieba-0.39/" jieba_install = "python setup.py install" local(jieba_unzip) with lcd(jieba_path): local("ls") local(jieba_install) with lcd('/root/'): put("jieba-0.39.zip", '/root') run(jieba_unzip) with cd(jieba_path): run("ls") run(jieba_install)
结言
最后,在我上篇文章提到的shell脚本中,最前面加上yum -y install fabric && fab --fabfile=job.py job
输入
./start-hadoop-spark.sh,即可无忧无虑地部署好我要使用的程序运行环境。因为懒,因为麻烦,于是用Python外加shell写了自动部署的脚本。在这个过程中,学习到不少知识,也遇到不少麻烦,写下文章,希望可以减轻大家配置的烦恼~
结果如下:
Master:
Slaves1:
Slaves2:
参照
Fabric 中文文档 http://fabric-chs.readthedocs.io/zh_CN/chs/Python远程部署利器Fabric详解 http://python.jobbole.com/87241/
socket.gethostbyname() https://docs.python.org/2/library/socket.html#socket.gethostbyname
文章出自kwongtai’blog[]http://blog.csdn.net/weixin_36394852],转载请标明出处!
相关文章推荐
- 使用fabric解决百度BMR的spark集群各节点的部署问题
- 解决百度BMR的spark集群开启slaves结点的问题
- 解决百度BMR的spark集群开启slaves结点的问题
- spark程序打包集群运行方法及使用中的几个问题解决
- Spark、Shark集群安装部署及遇到的问题解决
- 使用redis分布式锁解决spring schedule集群部署重复执行问题
- spark history server集群配置与使用(解决执行spark任务之后没有显示的问题)
- 大数据 IMF 传奇 spark -history在分布式 集群 的安装部署 及问题解决
- jenkins-master-slave分布式搭建、使用和集群测试环境原理、部署及常见问题解决
- 转载:在部署时使用Excel .NET运行库导出Excel遇到问题及解决办法
- 使用AppFabric 承载WCF和WF服务【注意点和问题的解决方法】
- hadoop大集群实施--比较实用的思路(设备选型、是否使用虚拟机、快速部署安装、自动复制节点等)
- 解决通过spark-shell 连接集群产生的不能连接master问题
- 使用solr4.9部署到tomcat上出现Context [/solr] startup failed due to previous errors问题以及解决办法
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- activiti5.10解决分布式集群部署的主键问题
- openstack icehouse 3节点部署遇到的问题和解决方法 推荐
- java零碎要点---大型软件部署方案,磁盘阵列,raid提升硬盘性能,解决由于集群带来的文件共享问题
- 使用Apache Axis部署 Web服务时的常见问题及其解决方法
- IOS 使用百度社会化分享组件 个别问题解决方案