I have a UDD which needs to load a Java class. I've defined it in part of the initialize() step.
localLibraryPath = "/home/my_udd_code/lib";
JAVA_LIBRARY_PATH = "java.library.path";
System.setProperty(JAVA_LIBRARY_PATH, localLibraryPath );
Field fieldSysPath = null;
try {
fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
} catch (NoSuchFieldException | IllegalAccessException e) {
System.out.println("Error setting local library");
}
// Load the JNI library
System.loadLibrary("myjavaclass");
This works perfectly when I run the process first time round. However, subsequent runs throw an error (below). I thought about ignoring the class load on subsequent runs, which is fine unless any other process uses the same UDD - then I get the same error.
java.lang.UnsatisfiedLinkError: Native Library /home/my_udd_code/lib/myjavaclass.so already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1907) ~[na:1.8.0_222]
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857) ~[na:1.8.0_222]
at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[na:1.8.0_222]
at java.lang.System.loadLibrary(System.java:1122) ~[na:1.8.0_222]
at org.example.directives.Anonymise.initialize(Anonymise.java:104) ~[1574081722252-0/:na]
at io.cdap.wrangler.parser.GrammarBasedParser.parse(GrammarBasedParser.java:120) ~[wrangler-core-4.0.0.jar:na]
at io.cdap.wrangler.executor.RecipePipelineExecutor.initialize(RecipePipelineExecutor.java:65) ~[wrangler-core-4.0.0.jar:na]
at io.cdap.wrangler.Wrangler.initialize(Wrangler.java:364) ~[1574081722257-0/:na]
at io.cdap.cdap.etl.common.plugin.WrappedTransform.lambda$initialize$3(WrappedTransform.java:72) ~[cdap-etl-core-6.0.0.jar:na]
at io.cdap.cdap.etl.common.plugin.Caller$1.call(Caller.java:30) ~[cdap-etl-core-6.0.0.jar:na]
at io.cdap.cdap.etl.common.plugin.StageLoggingCaller.call(StageLoggingCaller.java:40) ~[cdap-etl-core-6.0.0.jar:na]
at io.cdap.cdap.etl.common.plugin.WrappedTransform.initialize(WrappedTransform.java:71) ~[cdap-etl-core-6.0.0.jar:na]
at io.cdap.cdap.etl.common.plugin.WrappedTransform.initialize(WrappedTransform.java:34) ~[cdap-etl-core-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.MapReduceTransformExecutorFactory.getInitializedTransformation(MapReduceTransformExecutorFactory.java:319) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.MapReduceTransformExecutorFactory.getTransformation(MapReduceTransformExecutorFactory.java:189) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.MapReduceTransformExecutorFactory.getPipeStage(MapReduceTransformExecutorFactory.java:303) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.MapReduceTransformExecutorFactory.create(MapReduceTransformExecutorFactory.java:220) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.TransformRunner.<init>(TransformRunner.java:108) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.ETLMapReduce$ETLMapper.initialize(ETLMapReduce.java:224) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.etl.batch.mapreduce.ETLMapReduce$ETLMapper.initialize(ETLMapReduce.java:210) ~[cdap-etl-batch-6.0.0.jar:na]
at io.cdap.cdap.internal.app.runtime.batch.MapperWrapper.run(MapperWrapper.java:122) ~[na:na]
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787) ~[org.apache.hadoop.hadoop-mapreduce-client-core-2.8.0.jar:na]
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) ~[org.apache.hadoop.hadoop-mapreduce-client-core-2.8.0.jar:na]
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:270) ~[org.apache.hadoop.hadoop-mapreduce-client-common-2.8.0.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_222]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_222]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_222]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_222]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_222]