让Spark如虎添翼的Zeppelin - 基础篇

zulo2012 8年前
   <p><strong>0. 简介</strong></p>    <p>Spark 是一个非常好的计算平台,支持多种语言,同时基于内存的计算速度也非常快。整个开源社区也很活跃。</p>    <p>但是Spark在易用性上面还是有一些美中不足。 对于刚接触的人来说,上手以及环境搭建还是有一些困难。 另外,如果希望将结果绘制成图表分享给别人,还需要很长一段路程。</p>    <p>目前已经有一些解决方案:</p>    <ul>     <li>【TBD】Jupyter Notebook      <ul>       <li>使用很广泛,但是看起来主要还是以前ipython-notebook的增强版。</li>       <li>目前笔者对其了解不多</li>      </ul> </li>     <li>Spark 母公司DataBricks提供的DataBricks Community Edition, 里面自带Spark集群 + Notebook。      <ul>       <li>易用性、功能性都很不错。缺点是集群架设在AWS之上,无法跟自己本地的Spark 集群连在一起</li>      </ul> </li>     <li><strong>Apache Zeppelin</strong>      <ul>       <li>这是一个刚刚从Incubation转正的项目</li>       <li>但是已经在各大公司均有采用,比如美团、微软等等</li>       <li>本文主要就是介绍如何在本地搭建一个Zeppelin 使得Spark更易用,同时可以很方便的将自己的工作成功展示给客户</li>      </ul> </li>    </ul>    <p>借用别人的一个效果图镇楼^_^</p>    <p><img src="https://simg.open-open.com/show/aa9613080b2f1b2ede700478bc557991.png"></p>    <p>注意:</p>    <ol>     <li>Zeppelin自带Spark实例,您无需自己构建一个Spark 集群就可以学习Zeppelin</li>     <li>Zeppelin 当前(2016年8月19日) <strong>最新版本0.6.1, 只兼容2.0+</strong>      <ol>       <li>如果您本地有Spark 集群并且版本是1.6.1 + Scala 2.10 , 请下载Zeppelin 0.6.0的版本</li>       <li>如果官网的速度比较慢,可以参考下面的方式到百度盘下载</li>       <li>链接: <a href="/misc/goto?guid=4959677015684248373" rel="nofollow,noindex">http://pan.baidu.com/s/1ctBBJo</a> 密码: e68g</li>      </ol> </li>    </ol>    <p><strong>1、 下载</strong></p>    <p>如果您需要的是0.6.0的版本,可以参考上面百度盘的下载链接。</p>    <p>如果您需要的是0.6.1+的版本,可以直接到官网下载, 里面的Mirror下载速度一般还不错</p>    <p><strong>2、 安装</strong></p>    <p>版本: Zeppelin 0.6.0 + 自建Spark集群(1.6.1)</p>    <p>感觉Zeppelin还是不太成熟,并开箱就用,还需要不少人工调整才能正常工作</p>    <ol>     <li>解压之后,首先需要从模板创建一个新的zeppelin-env.sh, 并设置SPARK_HOME. 比如: <pre>  exportSPARK_HOME=/usr/lib/spark  </pre> 如果是基于Hadoop 或者 Mesos 搭建的Spark  集群,还需要进行另外的设置。</li>     <li>从模板创建一个新的zeppelin-site.xml,并将之前的8080端口改到比如8089,避免与Tomcat等端口冲突 <p><property></p> <p><name>zeppelin.server.port</name></p> <p><value> <strong>8089</strong> </value></p> <p><description>Server port.</description></p> <p></property></p> </li>     <li><strong>替换jackson相关类库</strong>      <ol>       <li>默认自带的是2.5.*, 但是实际使用的时候指定的是2.4.4</li>       <li>并且可能2.4.4 与 2.5.* 并不完全兼容。</li>       <li>因此需要使用2.4.4 替换2.5.* , 有下面3个jar需要替换:        <ol>         <li>jackson-annotations-2.4.4.jar</li>         <li>jackson-core-2.4.4.jar</li>         <li>jackson-databind-2.4.4.jar</li>        </ol> </li>       <li>这真的是非常坑人的一个地方。。。</li>      </ol> </li>    </ol>    <p>做完上诉几步之后,就可以启动啦:</p>    <p>启动/停止命令: bin/zeppelin-daemon.sh stop/start</p>    <p>启动之后,打开http://localhost:8089 就可以看到Zeppelin的主界面啦</p>    <p><img src="https://simg.open-open.com/show/cc9cefa555227dff96ae6592967cc6d6.png"></p>    <p><strong>3. 配置Spark解释器</strong></p>    <p>Spark Interpreter的配置非常简单,可以直接参考下图的配置方式:</p>    <p><img src="https://simg.open-open.com/show/7934fe3d601f54e16ed978b034003da4.jpg"></p>    <p><strong>4. 几点使用经验</strong></p>    <p>Zeppline自带比较详细的Tutorial, 各位看自带的notebook tutorial 可能效果更好。 但是我在第一次使用的时候,遇到了不少坑,在此记录下来,给大家做个参考:</p>    <p>(1) 任务提交之后不会自动停止</p>    <p>当Zeppelin 提交任务之后,可以看到Spark Master UI 上面,当前任务即使执行完成了,也不会自动退掉</p>    <p>这是因为,Zeppelin 默认就像人手工运行了spark-shell spark://master-ip:7077 一样, 除非手动关闭shell命令,否则会一直占用着资源</p>    <p>解决办法就是将spark 解释器(interpreter) 重启</p>    <p>手动的重启办法:</p>    <ol>     <li>打开Interpreter界面,搜索到Spark部分并点击重启</li>     <li>推荐: 调用Restful API 进行重启。      <ol>       <li>可以通过Chrome的Network 监控看一下点击restart之后具体调用的API的情况。如下图:<br> <img src="https://simg.open-open.com/show/2516297a818b75542983ba6fe5a27c6f.jpg"></li>       <li>这个ID(2BUDQXH2R)在各自的环境可能各不相同。另外这个API是PUT的方式,可以直接使用下面的python代码在UI上自动重启 <pre>  %python        importrequests     r = requests.put("http://IP:8089/api/interpreter/setting/restart/2BUDQXH2R")     print r.text  </pre> </li>      </ol> </li>    </ol>    <p>(2) 异常提示:Cannot call methods on a stopped SparkContext</p>    <p>比如我们在Spark Master UI 上面将当前job kill 之后,在Zeppelin这边重启执行任务就会遇到这个异常信息。</p>    <p>解决办法很简单: 重启解析器</p>    <p>(3) 不要主动调用 sc.stop()</p>    <p>这是官方明确说明的:scala 的spark-shell 自动初始化了SparkContext / SqlContext 等等</p>    <p>不能自己调用sc.stop() 之后重启创建一个SparkContext</p>    <p>可能笔者水平原因,尝试自己创建新的sc 之后,各种奇奇怪怪的问题</p>    <p>(4) 关于python module</p>    <p>Python Interpreter可以使用当前Zeppelin所在机器的python 所有的model</p>    <p>同时支持python 2 与 python 3</p>    <p>这是一个很有用的功能,比如我使用spark将数据计算完成之后,生成了一个并不太大的csv文件。这个时候完全可以使用Pandas强大的处理能力来进行二次处理,并最终使用Zeppelin的自动绘图能力生成报表</p>    <p>与Tableau之类的BI工具相比功能差了一些,不过各有所长。Zeppelin 对程序员来说可以算是非常方便的一个工具了。 对日常的一些简单报表的工作量大大减小了</p>    <p>(5) 可以设置自动运行时间</p>    <p>在整个Note的最上端,可以设置当前notebook 定期执行。 而且注意: 还可以设置执行完成之后自动重启interpreter 参考下图:</p>    <p><img src="https://simg.open-open.com/show/f2ed4940679f1342c83c6752765eddaa.jpg"></p>    <p><strong>X. 使用Zeppelin Hub 实现协作共赢</strong></p>    <p>官方网址: <a href="/misc/goto?guid=4959677015778718193" rel="nofollow,noindex">http://help.zeppelinhub.com/</a></p>    <p>这一部分将在下一篇文章之中介绍。敬请期待</p>    <p> </p>    <p>来自:http://www.flyml.net/2016/08/19/reinforce-spark-with-zeppelin-basic/</p>    <p> </p>