You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hadoop.apache.org by Julian Bui <ju...@gmail.com> on 2013/03/20 00:49:35 UTC
unable to find my native libraries on task node via JNA
Hi all,
I am hoping for someone with JNI or JNA experience on hadoop to help me.
JNA execution on the tasks nodes appears to fail because it cannot find
the native libraries. I can use the API to confirm that the native
libraries are in fact there.
I have set my jna.library.path to /user/bui/lib/ and I have set the
mapred.map.child.env to specify a jna.library.path in the children, and I
verified that my native libraries are in that directory and I have even put
my native library into the DistributedCache. However, when JNA tries to
find it, then it just fails with the runtime error "Error: Unable to load
library 'memfxns': libmemfxns.so: cannot open shared object file: No such
file or directory"
Some code is attached.
I am wondering if there is a permissions issue or something related to .so
files needing to be set w/ execute flag (I know this cannot be done on
hdfs).
Any help would be greatly appreciated.
-Julian
In my hadoop application main method:
job.getConfiguration().set("jna.library.path", "/user/bui/lib/");
job.getConfiguration().set("mapred.map.child.env",
"jna.library.path=/user/bui/lib");
DistributedCache.addCacheFile(new
Path("/user/bui/lib/libmemfxns.so").toUri(), job.getConfiguration());
if(fs.exists(new Path("/user/bui/lib/libmemfxns.so")))
{
System.out.println("/user/bui/lib/libmemfxns.so found in main"); // <--
this gets printed
}
========================================
In my hadoop application's reducer:
if(fs.exists(new Path("/user/bui/lib/libmemfxns.so")))
{
System.out.println("/user/bui/lib/libmemfxns.so found in reducer"); //
<-- this also gets printed
}
JnaTest.getBuf(); // <-- crashes here, when it tries to instantiate the
native library
========================================
Inside JnaTest.getBuf():
MemFxnsLibrary blah = MemFxnsLibrary.INSTANCE;
========================================
Inside MemFxnsLibrary:
public interface MemFxnsLibrary extends Library
{
MemFxnsLibrary INSTANCE = (MemFxnsLibrary)Native.loadLibrary("memfxns",
MemFxnsLibrary.class);
void getBuf(Pointer buf, Pointer length);
}
runtime error:
Error: Unable to load library 'memfxns': libmemfxns.so: cannot open shared
object file: No such file or directory