如何在Hadoop集群运行JNI程序
来源:互联网 发布:plc编程之电工基础 编辑:程序博客网 时间:2024/06/16 15:03
如何在Hadoop集群运行JNI程序
hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力。 阿里巴巴内部使用的分词软件(用c++实现的,以下简称WS包)是日常工作中最基本的软件包,通过java的jni机制,笔者将WS包成功的运行在hadoop上,深受很多部门的欢迎。下面借这个例子介绍hadoop上jni程序的开发过程。
首先,简单介绍一下WS包中的调用接口和基本结构。 WS包包括词典文件A.dict,对外提供静态链接库文件libWS.a。WS.h如下:
Class WS{
int
init(
const
char
* name);
int
segment(
char
* dest,
char
* src,
int
len,
int
kind);
}
我们的方案是首先生成jni的原型定义,然后根据原型定义,来包装WS类的接口,最后生成可在tasknode上运行的jni程序包。结构如下图所示
第一步,我们先使用java的jni技术,生成C的原型接口(prototype),然后编写Wsjni.java 文件,这是为云梯程序提供的类文件,其中libwsjni.so 就是wrapper类的动态链接库:
Class Wsjni{
Public Native
int
init(String conf);
Public Native String segment(String src,
int
kind);
Public Native
void
close();
//用于显示的释放内存
Static{
System.LoadLibrary(“libwsjni.so”);
// load 链接库
}
}
javac -d class Wsjni.java
//
产生class文件
javah -classpath .
/class
ws.Wsjni
//
这样就可以生成C的原型接口头文件Wsjni.h
Wsjni.h里面的有函数的原型声明,例如:
JNIEXPORT jint JNICALL Java_ws_Wsjni_ws_1init__Ljava_lang_String_2(JNIEnv *, jobject, jstring);
第二步,根据Wsjni.h实现wrapper类。需要阅读sun公司编写的jni的规范来实现应用,具体不在这里赘述。在Makefile中链接静态库libWs.a,从而生成一个动态的链接库libwsjni.so ,
g++ -g -o .
/class/libwsjni
.so -fPIC -shared -Wl,-soname,.
/class/libWsjni
.so ws_Wsjni.cpp –I.
/include
-Wl,-Bstatic –lWs –L.
/lib/
-Wl,-Bdynamic
我们的wrapper类就写好了。我们可以通过java的程序来测试验证jni是否正确。
Import Wsjni;
Class Test{
Public
static
void
main(){
Wsjni ws=
new
Wsjni();
Ws.init(“taobao.conf”);
Ws.segment(“你好淘宝”,
1
);
Ws.close();
}
}
运行命令是
java –
cp
.
/class
–D java.liabray.path=.
/class
Test
为了在hadoop上运行Ws包,需要制作两个jar包,一个是wsjni.jar, 通过-libjar选项提供class文件; 一个用于hadoop集群运行,ws.jar里面放了Ws包运行时需要的资源文件,包括链接库和词典文件。
Wsjni.jar中的文件是:
./ Wsjni.class
Ws.jar 中的文件是:
./A.dict
./libwsjni.so
第三步,在hadoop上调用Wsjni。hadoop有很特殊的文件系统,这里笔者针对性介绍一下DistributeCache的机制。Hadoop可以将HDFS的一些文件分发到运行的某台机器的工作目录下,并按照一定的逻辑解压。通过以下API实现:
DistributedCache.addCacheArchive(“hdfs:
//file_path/ws.jar#ws”,conf);
上面的API将ws.jar分发到tasknode上,并解压到工作目录的link目录下。Ws.jar包含ws相关的资源文件。在tasknode上,每个task工作目录下的文件是:
Jars/
Jars/yourJob.cass
ws/
ws/A.dict
ws/libwsjni.so
这样的目录结构,使得程序访问文件的路径一目了然,当调用者需要调用WS的接口时,词典A.dict和libwsjni.so 都在./ws 目录下。
因此,调用者的代码如下:
Mapper(){
Wsjni wsjni=
new
Wsjni();
Public
void
configure( ){
Wsjni.init("./ws/taobao.conf”,
1
);
}
Public mapper(){
Wsjni.segment(sentence,
2
);
}
Public close(){
Wsjni.close();
}
}
Run(){
Jobconf.set(“java.library.path”,”./ws”);
DistributedCache.addCacheArchive(“hdfs:
//file_path/ws.jar#ws”,conf);
}
需要设置 lava.library.path的原因是,java虚拟机需要找到libwsjni.so存放的路径。有必要通过ldd 命令看看so依赖哪些库,保证这些库和hadoop集群的tasknode中的库的版本一致。
罗嗦了这么多,都是细节问题,还得各位手动再做一遍,hadoop的程序不太方便调试,但是遇到的困难越多,收获的越多。呵呵。
欢迎各位不吝赐教。
- 如何在Hadoop集群运行JNI程序
- 如何在Hadoop集群运行JNI程序
- Hadoop集群运行JNI程序
- 在eclipse将mapreduce程序运行在hadoop集群中
- 创建MapReduce程序,并在hadoop集群中运行
- 如何在eclipse中编写好程序,然后打包成jar文件,在hadoop分布式集群上运行
- hadoop集群,如何运行Java jar包---如何运行mapreduce程序
- 如何在eclipse下开发和运行hadoop程序。
- hadoop 集群运行WordCount示例程序
- hadoop集群运行小程序wordCount记录
- 在Docker中运行Hadoop+Spark集群
- 搭建Hadoop并在集群中运行
- 在centos6.6上安装hadoop完全分布式集群并运行第一个程序
- 在JAVA应用中远程提交MapReduce程序至Hadoop集群运行
- 在云主机构建的hadoop集群上运行程序(接上一篇博文)
- 如何让你的作业在Hadoop集群中真正实现分布式运行?
- 如何让你的作业在 Hadoop集群中真正实现分布式运行
- 如何在不影响hadoop集群正常运行的情况下迁移主控节点[namenode]
- The Defining Decade-Why Your Twenties Matter--And How to Make the Most of Them Now
- hdu 1548
- ubuntu12.04编译Android 4.0.3 Source+Kernel记
- cocos2d-x onEnter方法介绍
- 黑马程序员---javaBean & introspector(内省)
- 如何在Hadoop集群运行JNI程序
- 树莓派(raspberry pi)学习4: 更改键盘布局
- 启动和关闭HANA服务器 (Stopping and Starting the HANA Server)
- LaTex初学者模板
- HANA 创建Triggers在SAP HANA Studio
- dyndns.org, which provides free Dynamic DNS forwarding Service!
- Hibernate 插入(更新)不了数据(或者插入(更新)失败)
- sudo出现sudo:must be setuid root问题的解决方法
- dwz框架下刷新页面和表单