我们正在Hadoop和Hive上创建一个类似字典的应用程序。一般的过程是针对一个大的固定字典(大约100G,类似于多语言WordNet字典)批量扫描数十亿的日志数据(例如单词)。
我们已经有了java应用程序的单机版本(让我们称之为"singleApp")来查询这个字典。我们目前既不能修改这个MapReduce应用程序,也不能修改字典文件,因此我们不能重新设计和重新编写一个全新的java应用程序。我们需要使用这个单机版本的Java Application作为构建块,将其扩展到MapReduce版本。
目前,我们可以通过调用这个"singleApp“来创建MapReduce应用程序,并使用分布式缓存传递字典的子集(例如1G字典)。然而,如果我们使用完整的字典(100G),应用程序启动起来非常非常慢。此外,我们真的希望将这些字典安装到Hadoop集群中,而不是每次都使用-file或分布式缓存选项调用它。
我们尝试将字典文件直接复制到从节点的本地磁盘中,并将java应用程序指向它,但它找不到字典。如果我们想要调试更多关于这种方法的东西,有什么文档需要做吗?
对于我们处理这种情况(非常大的字典文件,并且更喜欢一直安装字典文件)的最佳实践/流程,有什么建议吗?
发布于 2015-09-21 14:34:17
对于100‘t的数据,您不需要使用Hadoop。您也可以将分布式缓存用作处理平台。
将分布式缓存视为内存中的数据网格。
尝试使用您的MapReduce用例对Open Source In-Memory DataGrid执行TayzGrid操作。
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) { /* ... */ }
}https://stackoverflow.com/questions/32569778
复制相似问题