美文网首页
Apache Zeppelin 0.9 版本升级之问题记录

Apache Zeppelin 0.9 版本升级之问题记录

作者: 六层楼那么高 | 来源:发表于2021-09-26 16:00 被阅读0次

    0. 旧版本问题

    当前公司内部的 Zeppelin 0.7.2 的版本用了有 3 年多,累计了一些无法问题,亟待解决:

    1. 不支持 spark 2.2 以上的版本,spark 2.2 存在执行结束不释放 yarn 资源的严重 bug
    2. 不支持 yarn cluster 模式,导致所有 driver 都在 server 节点,可能出现资源瓶颈 [ZEPPELIN-2898]
    3. 笔记本(notebook)多了之后(5000+),Server 启动速度很慢,长达数分钟,笔记本加载也偶现卡顿问题r
    4. Server 存在单点故障问题,不支持高可用
    5. 当前代码编辑自动补全不够友好,不支持 TAB 补全 [ZEPPELIN-277]
    6. 前端容易卡住
    7. 每次更新 interpreter ,整个 interpreter 都需要重启,在多租户场景下不够友好,直观感受就是用一段时间查询就很慢(时间耗在了第一次启动 interperter 上面)。 [ZEPPELIN-1770]

    通过一番调研,以上大部分问题在 0.9 版本得以解决,除此之外 0.9 还支持了很多新的特性,例如:

    1. shell 解释器 支持 terminal 交互式模式,也就是 web terminal ,用户体验大大提升
    2. 新增多种解释器包括:Groovy Interpreter [ZEPPELIN-2176]
    3. notebook 重构,性能优化,存储支持 MongoDB 等存储引擎

    下载源码,编译打包(参考之前的文章),部署之后遇到了很多问题,记录如下:

    1. 开启 kerberos 找不到 tgt 问题

    对于开启 kerberos 的环境,启动 interperter 前,已经 kinit 认证过了,再提交任务,还是报错找不到 tgt,这种方式再 0.7.2 版本都是可行的,目前不清楚升级之后找不到的原因。由于之前遇到过类似的问题,这里通过配置的方式解决:zeppeiln-env.sh 增加以下 Java 参数配置,支持从本地缓存获取 kerberos ticket :
    -Djavax.security.auth.useSubjectCredsOnly=false
    这个参数的解释官网文档

    2. 新版本 hive jdbc proxyuser 配置的变化

    对于非开启 kerberos 的环境, hive jdbc interperter 需要配置代理用户,旧版本的配置方式已经不适用了,新版本的配置,可以参考官网文档,配置 hive.server2.proxy.user

    Name Value
    default.driver org.apache.hive.jdbc.HiveDriver
    default.url jdbc:hive2://localhost:10000
    default.user hive_user
    default.password hive_password
    default.proxy.user.property hive.server2.proxy.user

    3. notebook 迁移

    3.1 旧数据迁移过程

    新版 Zeppelin 提供了 notebook 的迁移脚本 (bin 目录下的 upgrade-note.sh 脚本),迁移主要依赖于此脚本,另外此次也将本地存储换成了 mongoDB:

    1. 拷贝 conf 下的和 notebook 下的所有笔记到新版本的对应目录
    2. 通过脚本清理 2019 年以前以及超大存储的 note
    3. 执行升级 note 命令 bin/upgrade-note.sh -d (由于0.9版本对 note 结构和命令有修改)
    4. 删除异常的 note 文件类型,不然会导致 notebook server 运行时异常,rm notebook/_*
    5. 通过 python 脚本更新 notebook-authorization.json (0.8 版本对权限做了变更,新增了 runner 角色)
    6. 停止 zeppelin-server,修改 conf/zeppelin-env.sh , 配置存储为 mongodb
    7. MongoDB 中新增库 :use xxdb
    8. 重启 zeppelin server 后 会自动交本地的 notebook 迁移至 MongoDB

    3.2 升级 notebook 权限问题

    Zeppelin 0.8.x 版本笔记本的权限模块做了一些重构,新增了 runner 角色,导致新版本迁移过去不兼容,参考官网 issue 的解决方案

    所以 conf/notebook-authorization.json 里面需要新增 runners,不然无法识别权限。

    通过一段 python 脚本可以更新解决

    import json
    
    note_auth_json_file = 'PATH_TO_ZEPPELIN/conf/notebook-authorization.json'
    
    f = open(note_auth_json_file, 'r')
    note_auth_json = json.loads(f.read())
    f.close()
    
    for note_id in note_auth_json['authInfo']:
        print(note_id)
        if 'writers' in note_auth_json['authInfo'][note_id] \
            and 'runners' not in note_auth_json['authInfo'][note_id]:
            note_auth_json['authInfo'][note_id]['runners'] = note_auth_json['authInfo'][note_id]['writers']
            print(note_auth_json['authInfo'][note_id]['runners'])
    
    f = open(note_auth_json_file, 'w')
    f.write(json.dumps(note_auth_json))
    f.close()
    

    3.3 note 默认绑定解释器丢失问题

    每个 notebook 都有默认的 interperter ,例如创建一个 spark 类型的笔记本后,默认解释器就是 spark,写代码无需在第一行通过 %spark 的方式手动指定。迁移新版后后用户默认的绑定器解释器丢失,全部都变成了 spark,导致非 spark 类的 note 不能按照预期正常运行。

    找到了官方 issue : https://issues.apache.org/jira/browse/ZEPPELIN-5309 但是没人解决,这里我写了个 python 脚本修复这个问题,也提交给了官方。

    首先获取老版本的映射关系,遍历所有笔记更新 json 文件,然后将默认的解释器绑定写到新的 note json 里面。

    # -*- coding: utf-8 -*-
    import json
    import os
    import subprocess
    
    old_interpreter_file = './interpreter.json'
    
    f = open(old_interpreter_file, 'r')
    int_json = json.loads(f.read())
    f.close()
    
    dict = {}
    for interpreter_id in int_json['interpreterSettings']:
        dict[interpreter_id] = int_json['interpreterSettings'][interpreter_id]['name']
    
    for note_id in int_json['interpreterBindings']:
        path = "./notebook/*_" + note_id + ".zpln"
    
        process = subprocess.Popen("find ./notebook -type f -name \"*" + note_id +".zpln\"", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
        stdout, stderr = process.communicate()
        exit_code = process.wait()
        file=stdout.decode("utf-8").strip()
    
        if file:
          print("find file: " + file)
          print("note_id:" + note_id + " default binding interpreter is: " + dict[int_json['interpreterBindings'][note_id][0]])
          nf = open(file, 'r')
    
          note_json = json.loads(nf.read())
          note_json["defaultInterpreterGroup"] = dict[int_json['interpreterBindings'][note_id][0]]
          nf.close()
              
          f = open(file, 'w')
          f.write(json.dumps(note_json,indent=4))
          f.close()
    

    4. shiro 新增配置导致自动登录失败问题

    目前 shiro 配置是除了 api/version 之外的所有的请求都要走认证

    /api/version = anon
    /** = authc
    

    而 /api/cluster/address 是新版本新增的一个接口,这个请求比自动登录要早,走认证会自动跳转到 /api/login 这个导致自动登录失败

    shiro.ini 新增以下配置解决

    /api/cluster/address = anon

    相关文章

      网友评论

          本文标题:Apache Zeppelin 0.9 版本升级之问题记录

          本文链接:https://www.haomeiwen.com/subject/kvwqnltx.html