专栏首页Spark学习技巧面试|大数据中无处不在的ServiceLoader

面试|大数据中无处不在的ServiceLoader

ServiceLoader是SPI的是一种实现,所谓SPI,即Service Provider Interface,用于一些服务提供给第三方实现或者扩展,可以增强框架的扩展或者替换一些组件。

要配置在相关项目的固定目录下:

resources/META-INF/services/接口全称。

这个在大数据的应用中颇为广泛,比如Spark2.3.1 的集群管理器插入:

private def getClusterManager(url: String): Option[ExternalClusterManager] = {
    val loader = Utils.getContextOrSparkClassLoader
    val serviceLoaders =
      ServiceLoader.load(classOf[ExternalClusterManager], loader).asScala.filter(_.canCreate(url))
    if (serviceLoaders.size > 1) {
      throw new SparkException(
        s"Multiple external cluster managers registered for the url $url: $serviceLoaders")
    }
    serviceLoaders.headOption
  }

配置是在

spark sql数据源的接入,新增数据源插入的时候可以采用这种方式,要实现的接口是DataSourceRegister。

简单测试

首先实现一个接口

package bigdata.spark.services;

public interface DoSomething {
    public String shortName(); //可以制定实现类名加载
    public void doSomeThing();
}

然后将接口配置在resources/META-INF/services/

实现该接口

package bigdata.spark.services;

public class SayHello implements DoSomething {
    @Override
    public String shortName() {
        return "SayHello";
    }

    @Override
    public void doSomeThing() {
        System.out.println("hello !!!");
    }
}

测试

package bigdata.spark.services;

import java.util.ServiceLoader;

public class test {
    static ServiceLoader<DoSomething> loader = ServiceLoader.load(DoSomething.class);
    public static void main(String[] args){
        for(DoSomething sayhello : loader){
         //要加载的类名称我们可以制定
            if(sayhello.shortName().equalsIgnoreCase("SayHello")){
                sayhello.doSomeThing();
            }
        }
    }
}

输出结果如下:

这个主要是为讲自定义数据源作准备。

欢迎订阅浪尖知识星球,跟450人一起学习。

本文分享自微信公众号 - Spark学习技巧(bigdatatip)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDK中几个错误的调用方式

    如果两个变量中间隔了比较长的其它代码,很可能会导致开发人员将两者混淆,导致逻辑认知错误,从而写出或改出有问题的代码。

    Spark学习技巧
  • 经过性能对比,我发现温少的FastJson真牛。

    JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。

    Spark学习技巧
  • 重要 : 优化flink的四种方式

    flink这个框架在逐步变为流处理的主流。本文,我们将针对flink性能调优讲四种不同的方法。

    Spark学习技巧
  • CVPR 2019 | PointConv:在点云上高效实现卷积操作

    在机器人、自动驾驶和虚拟/增强现实应用中,直接获取 3D 数据的传感器日趋普遍。由于深度信息可以消除 2D 图像中的大量分割不确定性(segmentation ...

    机器之心
  • 精选论文 | 三维视觉之点云识别【附PDF下载】

    最近,由于自动驾驶,机器人等的发展,3d视觉逐渐引起了研究人员和工程师的关注。今天,两位主讲嘉宾从自己的角度为大家精选了近期处理3d 点云数据的几个代表性方法,...

    马上科普尚尚
  • Java企业微信开发_02_通讯录同步

           登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通...

    shirayner
  • 使用简单工厂加接口加适配器模式来遵守开闭原则 顶

    我们在平时开发中遇到最多的问题,无异于实体类属性的变化,可能我们开发出来的接口跟前端要的字段很多不一样,或者需求变更,需要返回的很多内容不一样。

    算法之名
  • 快速学习JasperReport-数据填充

    我们介绍了如何使用JasperReport来生成简单的文本报表,正式企业开发中动态数据展示也是报表中最重要的一环,接下来我们共同研究的就是填充动态数据到PDF报...

    cwl_java
  • Android Volley扩展实现支持进度条的文件上传功能

    volley是一个轻量级的开源网络通信框架,开源的好处就是可以自由定制自己需要的jar包。volley里网络通信时android2.3以上用的HttpUrlCo...

    砸漏
  • 为什么要用空洞卷积?

    空洞卷积(atrous convolutions),又称扩张卷积(dilated convolutions),向卷积层引入了一个成为“扩张率(dilated r...

    智能算法

扫码关注云+社区

领取腾讯云代金券