zeppelin安装部署配置

首先,我们来了解一下这款工具的背景及用途。Zeppelin 目前已托管于 Apache 基金会,但并未列为顶级项目,可以在其公布的 官网访问。它提供了一个非常友好的 WebUI 界面,操作相关指令。它可以用于做数据分析和可视化。其后面可以接入不同的数据处理引擎。包括 Flink,Spark,Hive 等。支持原生的 Scala,Shell,Markdown 等。


对于 Zeppelin 而言,并不依赖 Hadoop 集群环境,我们可以部署到单独的节点上进行使用。首先我们使用以下地址获取安装包:

http://zeppelin.apache.org/download.html

这里,有2种选择,

其一,可以下载原文件,自行编译安装。


其二,直接下载二进制文件进行安装。这里,为了方便,笔者直接使用二进制文件进行安装使用。

这里有些参数需要进行配置,为了保证系统正常启动,

确保的 zeppelin.server.port 属性的端口不被占用,默认是8080,其他属性大家可按需配置即可。


在完成上述步骤后,启动对应的进程。定位到 Zeppelin 安装目录的bin文件夹下,使用以下命令启动进程:

./zeppelin-daemon.sh start

  若需要停止,可以使用以下命令停止进程:

./zeppelin-daemon.sh stop

  另外,通过阅读 zeppelin-daemon.sh 脚本的内容,可以发现,我们还可以使用相关重启,查看状态等命令。内容如下:

复制代码

case "${1}" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  reload)
    stop
    start
    ;;
  restart)
    stop
    start
    ;;
  status)
    find_zeppelin_process
    ;;  *)    echo ${USAGE}

复制代码

在启动相关进程后,可以使用以下地址在浏览器中访问:

http://<Your_<IP/Host>:Port>

  启动之后的界面如下所示:

  该界面罗列出插件绑定项。如图中的 spark,md,sh 等。那我如何使用这些来完成一些工作。在使用一些数据引擎时,如 Flink,Spark,Hive 等,是需要配置对应的连接信息的。在 Interpreter 栏处进行配置。这里给大家列举一些配置示例:

3.1 Flink

  可以找到 Flink 的配置项,如下图所示:

 

  然后指定对应的 IP 和地址即可。

3.2 Hive

  这里 Hive 配置需要指向其 Thrift 服务地址,如下图所示:

  另外,其他的插件,如 Spark,Kylin,phoenix等配置类似,配置完成后,记得点击 “restart” 按钮。


3.3 Use md and sh

  下面,我们可以创建一个 Notebook 来使用,我们拿最简单的 Shell 和 Markdown 来演示,如下图所示:

3.4 SQL

  当然,我们的目的并不是仅仅使用 Shell 和 Markdown,我们需要能够使用 SQL 来获取我们想要的结果。

3.4.1 Spark SQL

  下面,我们使用 Spark SQL 去获取想要的结果。如下图所示:

  这里,可以将结果以不同的形式来可视化,量化,趋势,一目了然。

3.4.2 Hive SQL

  另外,可以使用动态格式来查询分区数据,以"${partition_col=20160101,20160102|20160103|20160104|20160105|20160106}"的格式进行表示。如下图所示:

3.5 Video Guide

  另外,官方也给出了一个快速指导的入门视频,观看地址:[入口]

4.总结

  在使用的过程当中,有些地方需要注意,必须在编写 Hive SQL 时,%hql 需要替换为 %hive.sql 的格式;另外,在运行 Scala 代码时,如果出现以下异常,如下图所示:

  解决方案,在 zeppelin-env.sh 文件中添加以下内容:

export ZEPPELIN_MEM=-Xmx4g

  该 BUG 在 0.5.6 版本得到修复,参考码:[ZEPPELIN-305]


编译和启动完Zeppelin相关的进程之后,我们就可以来使用Zeppelin了。我们进入到页面,我们可以在页面上直接操作Zeppelin,依次选择Notebook->Create new note,然后会弹出一个对话框,我们在Note Name里面随便输入一个名字,这里我输入blog,然后点击Create Note就可以创建一个新的Notebook了。我们可以在新建的Notebook里面输入相关的代码进行测试:


[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. sc.version  

  2. sqlc  

  3.   

  4. res26: String = 1.5.2  

  5. res27: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@48806d6c  

和Spark Shell一样,Zeppelin会初始化好SparkContext和SQLContext对象,分别命名为sc和sqlc,我们可以直接在里面使用到它。接下来我们来在Zeppelin里面加载HDFS上面的数据,如下:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. sc.textFile("hdfs://ip/tmp/json").count  

  2.   

  3. res29: Long = 200  

  4. Took 0 seconds (outdated)  


我们再来使用sqlc对象读取上面的json文件来创建一个DataFrame

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. val profilesJsonRdd =sqlc.jsonFile("hdfs://www.iteblog.com/tmp/json")  

  2. val profileDF=profilesJsonRdd.toDF()  

  3. val iteblog = profileDF.selectExpr("_id""address""age""email")  

  4. iteblog.show()  

  5. profileDF.registerTempTable("profiles")  

  6.   

  7. profilesJsonRdd: org.apache.spark.sql.DataFrame = [_id: string, about: string, address: string, age: bigint, company: string, email: string, eyeColor: string, favoriteFruit: string, gender: string, name: string, phone: string, registered: string, tags: array<string>]  

  8. profileDF: org.apache.spark.sql.DataFrame = [_id: string, about: string, address: string, age: bigint, company: string, email: string, eyeColor: string, favoriteFruit: string, gender: string, name: string, phone: string, registered: string, tags: array<string>]  

  9. root  

  10.  |-- _id: string (nullable = true)  

  11.  |-- about: string (nullable = true)  

  12.  |-- address: string (nullable = true)  

  13.  |-- age: long (nullable = true)  

  14.  |-- company: string (nullable = true)  

  15.  |-- email: string (nullable = true)  

  16.  |-- eyeColor: string (nullable = true)  

  17.  |-- favoriteFruit: string (nullable = true)  

  18.  |-- gender: string (nullable = true)  

  19.  |-- name: string (nullable = true)  

  20.  |-- phone: string (nullable = true)  

  21.  |-- registered: string (nullable = true)  

  22.  |-- tags: array (nullable = true)  

  23.  |    |-- element: string (containsNull = true)  

  24.   

  25. iteblog: org.apache.spark.sql.DataFrame = [_id: string, address: string, age: bigint, email: string]  

  26. +--------------------+--------------------+---+--------------------+  

  27. |                 _id|             address|age|               email|  

  28. +--------------------+--------------------+---+--------------------+  

  29. |55578ccb0cc5b350d...|694 Oriental Cour...| 30|tracynguyen@endip...|  

  30. |55578ccb6975c4e2a...|267 Amber Street,...| 23|leannagarrett@war...|  

  31. |55578ccb33399a615...|243 Bridgewater S...| 24|blairwhite@imperi...|  

  32. |55578ccb0f1d5ab09...|647 Loring Avenue...| 24|andrearay@beadzza...|  

  33. |55578ccb591a45d4e...|721 Bijou Avenue,...| 27|penningtongilbert...|  

  34. |55578ccb9f0cd20c4...|694 Llama Court, ...| 21|shelleyburns@pyra...|  

  35. |55578ccb8d0accc28...|498 Perry Terrace...| 40|nicolefigueroa@ed...|  

  36. |55578ccbd682cca21...|243 Stillwell Ave...| 32|galealvarado@sing...|  

  37. |55578ccb0d9025ddd...|649 Beard Street,...| 36|melindaparker@fur...|  

  38. |55578ccb5be70de0d...|972 Marconi Place...| 36|byerscarson@digia...|  

  39. |55578ccbc5a1050a5...|483 Hanson Place,...| 31|kristiemckinney@a...|  

  40. |55578ccb07fa02369...|540 Woodpoint Roa...| 40|salazarburks@micr...|  

  41. |55578ccb809e55bf0...|442 Ainslie Stree...| 32|hopkinspatterson@...|  

  42. |55578ccb204ff8ee6...|444 Argyle Road, ...| 23|maysrosario@imkan...|  

  43. |55578ccb4b062fc61...|571 Sunnyside Ave...| 38|atkinshancock@hel...|  

  44. |55578ccba5ff361a9...|385 Meeker Avenue...| 40|edwinarobertson@s...|  

  45. |55578ccb386940ac3...|936 Cheever Place...| 37|elsienoel@fleetmi...|  

  46. |55578ccbfc41ff7fe...|406 Lake Place, M...| 36|mirandamarsh@even...|  

  47. |55578ccbfa6b6c300...|364 Metropolitan ...| 31|sharronmcconnell@...|  

  48. |55578ccbdd6650d81...|113 Applegate Cou...| 29|mcdowellwelch@eur...|  

  49. +--------------------+--------------------+---+--------------------+  

  50. only showing top 20 rows  

  51.   

  52. Took 1 seconds  

需要注意的是,因为Zeppelin会自动地初始化好SparkContext和SQLContext,所以我们不能再显示地创建SparkContext和SQLContext。如果你显示地创建了SQLContext,而且使用它来注册一张临时表,当你下一次使用这个临时表的时候将会出现以下的异常信息:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. no such table List ([blog])  

下面我们来使用上面注册的临时表,Zeppelin自带了SQL Interpreter,所以我们可以直接在上面编写SQL语句:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. %sql select eyeColor, count(eyeColor) as count from profiles where  

  2. gender='male' group by eyeColor  


运行上面的SQL我们就可以得到图形化显示的结果,而且我们可以根据自己的需要选择饼型、条型、表格,线型等方式展现我们需要的结果!上面的SQL已经我们已经将查询的gender写死成male了,其实我们可以将这个值设置成参数的形式,然后我们可以在页面上输入相关的查询参数:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. %sql select eyeColor, count(eyeColor) as count from profiles where  

  2. gender='male' group by eyeColor  

然后我们运行这个sql,我们可以看到下图的运行结果:


可以看出这里出现了一个文本框gender,我们可以输入需要查询的条件比如:male,然后再运行就可以得到上面sql一样的结果。大家可能看到了,文本框里面是没有输入限制的,我们可以随便输入数据,而且你也不清楚到底有几种值可以输入。值得高兴的是,我们可以将这个值设置成只固定可选的:


[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. %sql select eyeColor, count(eyeColor) as count from profiles where gender  

  2. ="${gender=male,male|female}" group by eyeColor  

这里限制了gender的值只能选择male和female,而且默认male是选中的,如下:


有时候我们需要在SQL中使用自定义的函数,我们可以直接在Zeppelin中定义函数,然后在SQL使用它,如下:


[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. def ageGroup(age: Long) = {  

  2.     val buckets = Array("0-10""11-20""20-30""31-40",  

  3.      "41-50""51-60""61-70""71-80""81-90""91-100"">100")  

  4.     buckets(math.min((age.toInt - 1) / 10, buckets.length - 1))  

  5. }  

  6.   

  7. ageGroup: (age: Long)String  

为了能够在Spark SQL中使用这个函数,我们必须先注册这个函数:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. sqlc.udf.register("ageGroup", (age:Long)=>ageGroup(age.toInt))  

  2.   

  3. res44: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,List())  

然后我们就可以在Spark SQL中使用这个自定义函数:

[python] view plain copy 在CODE上查看代码片派生到我的代码片

  1. %sql select ageGroup(age) as iteblogAgeGroup,  

  2. count(1) as total  

  3. from profiles  

  4. where gender='${gender=male,male|female}' group by ageGroup(age)  

  5. order by iteblogAgeGroup  

运行的结果如下:


2、 安装

版本: Zeppelin 0.6.0 + 自建Spark集群(1.6.1)

感觉Zeppelin还是不太成熟,并开箱就用,还需要不少人工调整才能正常工作

  1. 解压之后,首先需要从模板创建一个新的zeppelin-env.sh, 并设置SPARK_HOME. 比如:

    exportSPARK_HOME=/usr/lib/spark
    
  2. export  SPARK_MASTER_IP=127.0.0.1
    export  SPARK_LOCAL_IP=127.0.0.1
    export ZEPPELIN_MEM="-Xms1024m -Xmx16384m -XX:MaxPermSize=16384m"
    

    如果是基于Hadoop 或者 Mesos 搭建的Spark  集群,还需要进行另外的设置。

  3. 从模板创建一个新的zeppelin-site.xml,并将之前的8080端口改到比如8089,避免与Tomcat等端口冲突

    <property>

    <name>zeppelin.server.port</name>

    <value> 8089 </value>

    <description>Server port.</description>

    </property>

  4. 替换jackson相关类库

    1. jackson-annotations-2.4.4.jar

    2. jackson-core-2.4.4.jar

    3. jackson-databind-2.4.4.jar

    4. 默认自带的是2.5.*, 但是实际使用的时候指定的是2.4.4

    5. 并且可能2.4.4 与 2.5.* 并不完全兼容。

    6. 因此需要使用2.4.4 替换2.5.* , 有下面3个jar需要替换:

    7. 这真的是非常坑人的一个地方。。。

做完上诉几步之后,就可以启动啦:

启动/停止命令: bin/zeppelin-daemon.sh stop/start

启动之后,打开http://localhost:8089 就可以看到Zeppelin的主界面啦

3. 配置Spark解释器

Spark Interpreter的配置非常简单,可以直接参考下图的配置方式:

4. 几点使用经验

Zeppline自带比较详细的Tutorial, 各位看自带的notebook tutorial 可能效果更好。 但是我在第一次使用的时候,遇到了不少坑,在此记录下来,给大家做个参考:

(1) 任务提交之后不会自动停止

当Zeppelin 提交任务之后,可以看到Spark Master UI 上面,当前任务即使执行完成了,也不会自动退掉

这是因为,Zeppelin 默认就像人手工运行了spark-shell spark://master-ip:7077 一样, 除非手动关闭shell命令,否则会一直占用着资源

解决办法就是将spark 解释器(interpreter) 重启

手动的重启办法:

  1. 打开Interpreter界面,搜索到Spark部分并点击重启

  2. 推荐: 调用Restful API 进行重启。

    1. 可以通过Chrome的Network 监控看一下点击restart之后具体调用的API的情况。如下图:

    2. 这个ID(2BUDQXH2R)在各自的环境可能各不相同。另外这个API是PUT的方式,可以直接使用下面的python代码在UI上自动重启

      %python
       
       
      importrequests
       
      r = requests.put("http://IP:8089/api/interpreter/setting/restart/2BUDQXH2R")
       
      print r.text
      

(2) 异常提示:Cannot call methods on a stopped SparkContext

比如我们在Spark Master UI 上面将当前job kill 之后,在Zeppelin这边重启执行任务就会遇到这个异常信息。

解决办法很简单: 重启解析器

(3) 不要主动调用 sc.stop()

这是官方明确说明的:scala 的spark-shell 自动初始化了SparkContext / SqlContext 等等

不能自己调用sc.stop() 之后重启创建一个SparkContext

可能笔者水平原因,尝试自己创建新的sc 之后,各种奇奇怪怪的问题

(4) 关于python module

Python Interpreter可以使用当前Zeppelin所在机器的python 所有的model

同时支持python 2 与 python 3

这是一个很有用的功能,比如我使用spark将数据计算完成之后,生成了一个并不太大的csv文件。这个时候完全可以使用Pandas强大的处理能力来进行二次处理,并最终使用Zeppelin的自动绘图能力生成报表

与Tableau之类的BI工具相比功能差了一些,不过各有所长。Zeppelin 对程序员来说可以算是非常方便的一个工具了。 对日常的一些简单报表的工作量大大减小了

(5) 可以设置自动运行时间

在整个Note的最上端,可以设置当前notebook 定期执行。 而且注意: 还可以设置执行完成之后自动重启interpreter 参考下图:

X. 使用Zeppelin Hub 实现协作共赢

官方网址: http://help.zeppelinhub.com/


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值