hadoop/hive分布式缓存处理超大字典文件的替代解决方案?

swvgeqrz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(380)

我们正在hadoop和hive上创建一个类似字典的应用程序。一般的过程是根据一个大的固定字典(大约100g,就像一个多语言wordnet字典)批量扫描十亿个日志数据(例如单词)。
我们已经有了一个单机版的java应用程序(我们称之为“singleapp”)来查询这个字典。我们目前既不能修改这个java应用程序,也不能修改字典文件,因此我们不能重新设计和重新编写一个全新的mapreduce应用程序。我们需要使用这个单机版java应用程序作为构建块,将其扩展到mapreduce版本。
目前,我们可以通过调用这个“singleapp”来创建mapreduce应用程序,并使用分布式缓存传递字典的子集(例如1g字典)。然而,如果我们使用完整的字典(100g),应用程序启动起来会非常慢。此外,我们确实希望将这些字典安装到hadoop集群中,而不必每次使用-file或分布式缓存选项调用它。
我们试图将字典文件直接复制到从属节点的本地磁盘中,并将java应用程序指向它,但它找不到字典。如果我们想对这种方法进行更多的调试,有什么需要做的文档吗?
对于我们处理这种情况(非常大的字典文件,并且更喜欢一直安装字典文件)的最佳实践/流程,有什么建议吗?

wtlkbnrh

wtlkbnrh1#

对于100gb的数据,不需要使用hadoop。您也可以将分布式缓存用作处理平台。
将分布式缓存视为内存中的数据网格。
试试tayzgrid一个开源的内存数据网格和mapreduce用例,比如你的。

public class ProductAnalysisMapper implements 
                             com.alachisoft.tayzgrid.runtime.mapreduce.Mapper {

    @Override
    public void map(Object ikey, Object ivalue, OutputMap omap) 
    {
          //This line emits value count to the map.
          omap.emit(ivalue, 1);
    }
}

public class ProductAnalysisReducer implements
                      com.alachisoft.tayzgrid.runtime.mapreduce.Reducer {

    public ProductAnalysisReducer(Object k) { /* ... */ }

    @Override
    public void reduce(Object iv) { /* ... */ }

    @Override
    public void finishReduce(KeyValuePair kvp) { /* ... */ }
}

相关问题