WeBankFinTech / WeDataSphere

WeDataSphere is a financial grade, one-stop big data platform suite.
661 stars 162 forks source link

【有奖征文】DSS + Linkis 在aws emr6.1 场景下的部署 #22

Open RustRw opened 4 years ago

RustRw commented 4 years ago

痛苦中找出路

公司目前情况: 依托aws托管的大数据集群,基本上用的也都是aws提供的服务。aws起集群真实是方便,也带有一些工具,hue,jupyter notebook等。但是带来的问题也是明显的,比如服务一个个的起来,管理,安全,审核等各个带来等工作量压力就非常大了,业务需求为主,先用hue跑,hue满足不了装一个zepplin跑spark代码,实在不行等开console权限等等,这样下来一直忙于本命,却很容易被别人抓住问题不断等喷,所以选择一个合适的开源平台持续建设才能真正的让大数据工程方面得到长足的发展,DSS+Linkis就是这样一个相对较为完美的选择。

出路不代表平坦路

要想安装上Dss + Linkis 还真不是一件容易的事情,首先aws的各种包都是专有版本,替换包是肯定要的,各种一阵替换(这里就先略去啦,较为繁琐),还有就是发现maven公开地址上根本就没有aws的仓库,有个同事说去机器上下载,我去。。。这变个版本不累趴下啊,还好找到了解决方案: https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-artifact-repository.html, 对应的maven文件中添加,如下:

<repository>
            <id>emr</id>
            <name>EMR emr-6.1.0 Releases Repository</name>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <url>https://s3.ap-northeast-1.amazonaws.com/ap-northeast-1-emr-artifacts/emr-6.1.0/repos/maven/</url>
 </repository>

实际依赖的一些jar的版本,比如 spark,hive ,hadoop等最好都是和线上版本保持一直,并且要在配置文件中根据报错情况加入执行engine需要等lib包路径比如 native包,以及emr特有等一些包等路径等。

升级打怪还是要写代码

我们使用的emr使用的元数据是配置的Glue中来存储的元数据,没有mysql的实现,这块也要兼容起来,首先是要用aws-sdk-glue的包引进来,兼容实现了 hiveDao类似的功能,实现接口和填充数据结构,另外就是在hive引擎里也要对这里做一些修改,就初步解决问题了,如果还要接入Ranger或是hiveserver2里去拉取的话,实现的话还是较为麻烦,暂时没有实现按用户过滤不同数据的实现。

解决问题渐入佳境

但是在spark engine的启动上还是遇到了坑,spark engine在执行的时候一直错误,无法成功,日志也看不出什么问题,于是请请教了微众开源团队的 peacewang@WDS 同学,在peacewang@WDS热心的帮助下解决了问题,同时建议我提交了一个bug issue:https://github.com/WeBankFinTech/Linkis/issues/506, 解决了spark问题后就向前了一大步,可以使用spark3.0的特性了,spark-sql性能肯定有很大提升。

但是在测试pyspark的时候却发现一直遇到py4j gateway的安全性问题,创建不成功,在 peacewang@WDS的提醒下发现PYSPARK_ALLOW_INSECURE_GATEWAY=1并不好用了,绕不开安全策略了。 网上找到了一个办法:

private lazy val py4jToken: String = RandomStringUtils.randomAlphanumeric(256)

  private lazy val gwBuilder: GatewayServerBuilder = {
    val builder = new GatewayServerBuilder()
      .javaPort(0)
      .callbackClient(0, InetAddress.getByName(GatewayServer.DEFAULT_ADDRESS))
      .connectTimeout(GatewayServer.DEFAULT_CONNECT_TIMEOUT)
      .readTimeout(GatewayServer.DEFAULT_READ_TIMEOUT)
      .customCommands(null)

    try builder.authToken(py4jToken) catch {
      case err: Throwable => builder
    }
  }

然后在实例化的时候这样:

gatewayServer = gwBuilder.entryPoint(this).javaPort(port).build()

把对应的token传入到python文件中

cmd.addArgument(py4jToken, false)

在mix_pyspark.py文件中进行对应的处理的时候也加入token:

gateway = JavaGateway(client, auto_field = True, auto_convert = True,
                    gateway_parameters=GatewayParameters(port = int(sys.argv[1]), auto_convert = True, auth_token = sys.argv[3]))

这样就解决了pyspark执行的问题,具体pr:https://github.com/WeBankFinTech/Linkis/pull/512

lordk911 commented 3 years ago

请问是如何解决spark3的问题的?

Shlpeng commented 3 years ago

所以 links可以和aws无缝对接吧

RustRw commented 3 years ago

修改一下是可以的