MapR Filesystem Inaccessible - UnsatisfiedLinkError: com.mapr.fs.jni.MapRClient

Symptoms

When starting up a Datameer environment that is configured to connect to a MapR filesystem, the filesystem is inaccessible. Furthermore, the following error is observed in the conductor.log file:

system ERROR 00:00 (ConnectionInjector.java:73) - Failed to configure upload data store.
datameer.dap.sdk.util.ExceptionUtil$WrappedThreadException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at datameer.dap.sdk.util.ExceptionUtil.wrapInThreadException(ExceptionUtil.java:271)
at datameer.dap.sdk.util.HadoopUtil.executeTimeRestrictedCall(HadoopUtil.java:154)
at datameer.dap.sdk.util.HadoopUtil.getFileSystem(HadoopUtil.java:88)
at datameer.dap.sdk.util.HadoopUtil.getFileSystem(HadoopUtil.java:72)
at datameer.mapr.MaprGridMode.getFileSystem(MaprGridMode.java:43)
at datameer.dap.common.entity.properties.HadoopConfiguration.getStorageFileSystem(HadoopConfiguration.java:868)
at datameer.dap.conductor.util.spring.deploy.impl.ConnectionInjector.injectUploadDataStore(ConnectionInjector.java:71)
at datameer.dap.conductor.util.spring.deploy.impl.ConnectionInjector.injectData(ConnectionInjector.java:48)
at datameer.dap.conductor.util.spring.deploy.DataInjectorService.injectData(DataInjectorService.java:68)
at datameer.dap.conductor.util.spring.deploy.DataInjectorService.runInjectors(DataInjectorService.java:58)
at datameer.dap.conductor.util.spring.deploy.DataInjectorService.access$100(DataInjectorService.java:28)
at datameer.dap.conductor.util.spring.deploy.DataInjectorService$1.run(DataInjectorService.java:50)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at datameer.dap.conductor.webapp.security.DatameerSecurityService.runAsUser(DatameerSecurityService.java:124)
at datameer.dap.conductor.webapp.security.DatameerSecurityService.runAsUser(DatameerSecurityService.java:139)
at datameer.dap.conductor.util.spring.deploy.DataInjectorService.inject(DataInjectorService.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:340)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:293)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:393)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1415)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at datameer.dap.conductor.webapp.ContextListener.contextInitialized(ContextListener.java:83)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.xml.XmlConfiguration.main(XmlConfiguration.java:985)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.mortbay.start.Main.invokeMain(Main.java:194)
at org.mortbay.start.Main.start(Main.java:534)
at org.mortbay.start.Main.start(Main.java:441)
at org.mortbay.start.Main.main(Main.java:119)
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1501)
at org.apache.hadoop.fs.FileSystem.access$100(FileSystem.java:69)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:1536)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1518)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:235)
at datameer.dap.sdk.util.HadoopUtil$1.call(HadoopUtil.java:91)
at datameer.dap.sdk.util.HadoopUtil$1.call(HadoopUtil.java:88)
at datameer.dap.sdk.util.HadoopUtil$TimeoutThread.run(HadoopUtil.java:127)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:113)
... 8 more
Caused by: java.lang.UnsatisfiedLinkError: com.mapr.fs.jni.MapRClient.GetUserInfo(Lcom/mapr/fs/jni/MapRUserInfo;)I 
at com.mapr.fs.jni.MapRClient.GetUserInfo(Native Method)
at com.mapr.fs.MapRFileSystem.InitializeUserInfo(MapRFileSystem.java:108)
at com.mapr.fs.MapRFileSystem.<init>(MapRFileSystem.java:118)
... 13 more

In a couple environments, this was observed following a Datameer library change after a recent upgrade from MapR filesystem 2.1 to MapR filesystem 3.0.

Cause

The MapR Filesystem library files are being loaded improperly without any added JAVA_OPTIONS.

Resolution

 To resolve this issue, add the following parameter to the active JAVA_OPTIONS (in the etc/das-env.sh file for example):

-Dmapr.library.flatclass

Note that this parameter is included by default in Datameer 4.0 and later when shipped with the MapR 3.0 libraries.