Hadoop:只设置一次像hashSet这样的变量,以便在每个map任务中可以多次使用它

2019年2月7日 9点热度 0条评论

嗨,我有一个HashSet,需要在hadoop中的每个 map task 中使用。我不想多次初始化。我听说可以通过在configure函数中设置变量来实现。欢迎任何建议。

解决方案如下:

看来您还不太了解Hadoop的执行策略。

如果处于分布式模式,则不能在多个 map task 中共享一个集合(HashSet)。这是因为任务是在自己的JVM中执行的,并且不是确定性的,即使没有jvm重用,重置jvm后您的集合仍将存在。

您可以做的是,可以在计算开始时为每个任务设置一个HashSet

因此,您可以覆盖setup(Context ctx)方法。这将在调用map方法之前被调用。

但是,您需要足够的内存来在每个任务中存储HashSet

如果您没有此功能,则应考虑使用分布式缓存解决方案,但这会产生开销,因为每个查询都必须进行序列化和反序列化。而且也不保证数据在本地可用,因此这可能比任务中的收集花费更长的时间。