hadoop streaming 使用 C++中文分词工具

2017-12-06  本文已影响104人  bidai541

最近在公司要做一些文本数据的建模分析,分词肯定是第一步,这记录一下中间的几个坑。这并不是写怎么用C++实现中文分词,而是怎么在hadoop集群上通过已有的C++分词工具对大量文本进行分词。

基于python,java的开源分词工具(spark)

python是现在数据建模分析用的最广泛的一种语言,大部分开源分词工具都是基于python以及java的,选用了3种分词方法作为对比,分别是Ansj,HanLp,Jieba。比较好的地方是这三种方法都有基于java版本的实现,所以用scala中可以很方便的实现spark下的大规模文本分词(可能有的没有继承序列化,酌情处理)。


maven 配置项

还可以对其他的分词工具,开源的应该也不会有效果更好的了,当然开源的基于深度神经网络的分词算法效果还是很赞的,缺点是慢,跟hadoop以及spark兼容性不是很好,在这也考虑过,可行的方案是把基于LSTM+crf的分词算法封装成服务,然后在集群中访问服务,但是公司集群并不能访问外部节点,gg......

基于C++ 的分词(hadoop streaming)

公司还是有很不错的技术积累,像分词这么基础性的工具肯定也是有的,并且效果很赞,速度非常快,所以肯定尝试着怎么在hadoop中使用这款分词工具。老大提示说可以用streaming,用C++写mapreduce过程,然后在mapreduce过程中调用基于C++的分词工具。
问题是: 分词工具还依赖了其他的第三方库,比如正则匹配库pcre,在stackoverflow上找到了一个解决方案是这样的



把需要的第三方库以及C++ 写的脚本先上传到HDFS上,然后通过-cacheFile参数缓存到节点,并且建立一个符号链接,最后在节点上把符号链接添加到LD_LIBRARY_PATH。可惜这种方法我始终没有成功,Hadoop Streaming 按照这种方式提交依然不能成功执行。
这时候老大又给了点关键意见,把Streaming中的map 或者reduce过程用shell脚本实现,比如mapper.sh,然后在这个文件里边,再调用C++ 实现的map过程。这个过程就可以通过streaming的-file把所有需要的文件都同步到每个节点中,其中包括第三方库(.so文件)以及mapper.sh,然后在sh脚本中修改LD库路径就可以了。

果然这种方式是尝试了很多种唯一成功的一种,差点都要放弃。

这件事总结下:事是一件小事,但是赶巧了有一些因素增加了难度,比如C++并不是非常熟悉,平时python,java, scala都用,唯独不怎么用C++,其次新的环境还没有摸清楚。继续回来说遇到事情该怎么解决,会有很多种,有聪明的方式,一眼能看出来问题所在,喝杯咖啡的功夫就搞定了,这种方法适用于少数人,还有一种方法是对每个人都有效的,那就是穷举,把所有可能的方案都尝试一遍,总有一种会适合你,正所谓皇天不负有心人~

上一篇下一篇

猜你喜欢

热点阅读