当前位置: 首页 > 面试题库 >

Java上的Spark-在所有worker上拥有静态对象的正确方法是什么

东郭源
2023-03-14
问题内容

我需要在Spark中所有执行程序的函数中使用不可序列化的第三方类,例如:

JavaRDD<String> resRdd = origRdd
    .flatMap(new FlatMapFunction<String, String>() {
        @Override
        public Iterable<String> call(String t) throws Exception {

        //A DynamoDB mapper I don't want to initialise every time
        DynamoDBMapper mapper = new DynamoDBMapper(new AmazonDynamoDBClient(credentials));

        Set<String> userFav = mapper.load(userDataDocument.class, userId).getFav();

        return userFav;
    }
});

我希望有一个静态变量DynamoDBMapper mapper,我可以为每个执行者初始化一次,并且可以一遍又一遍地使用它。

由于它不是可序列化的,因此无法在驱动器中对其进行一次初始化并进行广播。

注意:这是一个答案(在所有worker上拥有静态对象的正确方法是什么),但这仅适用于Scala。


问题答案:

您可以使用mapPartitionforeachPartition。这是从Learning
Spark
摘录的片段

通过使用基于分区的操作,我们可以与该数据库共享一个连接池,以避免建立许多连接,并重用我们的JSON解析器。如示例6-10至6-12所示,我们使用mapPartitions()函数,该函数为我们提供了对输入RDD的每个分区中的元素的迭代器,并期望我们返回结果的迭代器。

这使我们可以为每个执行程序初始化一个连接,然后根据需要迭代分区中的元素。这对于将数据保存到某些外部数据库或创建昂贵的可重用对象非常有用。

这是从链接的书中获取的一个简单的scala示例。如果需要,可以将其翻译为java。此处只是显示mapPartition和foreachPartition的简单用例。

ipAddressRequestCount.foreachRDD { rdd => rdd.foreachPartition { partition =>
    // Open connection to storage system (e.g. a database connection)
    partition.foreach { item =>
    // Use connection to push item to system
    }
    // Close connection
    } 
}

这是一个指向
Java示例的链接。



 类似资料:
  • 问题内容: 我一直在查看Spark的文档,其中提到了这一点: Spark的API在很大程度上依赖于在驱动程序中传递函数以在集群上运行。有两种推荐的方法可以做到这一点: 匿名函数语法,可用于简短的代码段。全局单例对象中的静态方法。例如,您可以定义对象MyFunctions,然后传递MyFunctions.func1,如下所示: 请注意,虽然也可以在类实例中传递对方法的引用(与单例对象相对),但这需要

  • 问题内容: 让我们假设在我的编码环境中强加了一条规则(或一条经验法则),该类上的任何不使用,修改或以其他方式需要任何实例变量来完成其工作的方法都应设为静态。是否有任何固有的编译时间,运行时或其他缺点? (为进一步澄清而编辑) 我知道这个问题有些悬而未决,因此我对此表示歉意。我的询问意图主要是在“辅助”方法的背景下进行的。实用程序类(带有私有CTOR,因此无法实例化)作为我们已经做过的静态方法的持有

  • 问题内容: 我刚开始学习Java,并编写了一个使用静态字段进行测试的类。一切正常,但是在Eclipse中,我看到一个图标,将其悬停时显示为:“应该以 静态方式访问 CarCounter类型的静态方法getCounter 。” 那么正确的方法是什么? 这是课程: 这是我尝试访问变量计数器的地方: 问题答案: 静态字段和方法不属于特定的对象,而是属于一个类,因此您应该从该类而不是对象中访问它们: 并不

  • 问题内容: 我正在进行代码审查,并遇到了一个使用所有静态方法的类。入口方法接受几个参数,然后开始调用其他静态方法,并传递入口方法接收到的所有或某些参数。 它不像具有大量不相关的实用程序功能的Math类。在我自己的常规编程中,我很少编写Resharper弹出并说“这可能是静态方法”的方法,而当我这样做时,它们往往是无用的实用方法。 这种模式有什么问题吗?如果类的状态保存在字段和属性中或使用参数在静态

  • 在请求中,用户可以发送值为的参数,我想确定这些参数是谁。 将这些值强制转换为模型,并将值赋予未与用户一起发送的空参数。 我正在尝试确定哪些参数保存值以防止它们在保存之前损坏我的整个数据记录。 谢谢!

  • 我是不是又被灌了五万秒?总之是为了缩短时间? 编辑备注: 在app.yaml中,我有这个处理程序: 我现在已尝试删除过期: 我在app.yaml的顶部添加了以下内容: 此外,删除文件不会使它们在我部署时消失。