当前位置: 首页 > 知识库问答 >
问题:

在HBase MapReduce任务中加载本机共享库

高嘉树
2023-03-14
    public class VideoFeature{
        // JNI Code Begin
        public native static  float Match(byte[] testFileBytes, byte[] tempFileBytes);
        static {
            System.loadLibrary("JVideoFeatureMatch");
        }
        // JNI Code End
    }
    //  MapReduce
        Configuration conf = HBaseConfiguration.create();

    //  DistributedCache shared library
        DistributedCache.createSymlink(conf);
    //  Both following ways seem work.
    //  DistributedCache.addCacheFile(new URI("/home/danayan/Desktop/libJVideoFeatureMatch.so#JVideoFeatureMatch"), conf);
        DistributedCache.addCacheFile(new URI("hdfs://danayan-pc:9000/lib/libJVideoFeatureMatch.so#libJVideoFeatureMatch.so"), conf);
 public  static class MatchMapper extends TableMapper<Text, IntWritable> {

        @Override
        public void map(ImmutableBytesWritable key, Result values, Context context) throws IOException, InterruptedException {

        // Other codes
        Path[] localFiles = DistributedCache.getLocalCacheFiles(context.getConfiguration());
        for(Path temp:localFiles) {
            String path = temp.toString();
            if(path.contains("JVideoFeatureMatch")) {
                 System.out.println("JVideoFeatureMatch  found !");
            }
        }
}

换句话说,我似乎成功地“分发缓存”了我的共享库,但我不能在Map函数中加载它。

 public  static class MatchMapper extends TableMapper<Text, IntWritable> {

    @Override
    public void map(ImmutableBytesWritable key, Result values, Context context) throws IOException, InterruptedException {
    // Other codes
    int score = (int)VideoFeature.Match(testBytes, tempBytes);
}

当我试图调用JNI类中的静态函数时,会抛出一个'java.lang.Exception':

java.lang.UnsatisfiedLinkError: no libJVideoFeatureMatch in java.library.path.

我还尝试了'system.load()'。并且我考虑过在Linux系统中使用前缀'lib'和后缀'.so'。

  -Djava.library.path=/usr/local/hadoop/lib/native/Linux-amd64-64

本机库指南在hadoop reducer中加载本机库?

我不知道我说得是否清楚,如果不清楚,请告诉我。

共有1个答案

锺离锦
2023-03-14

>

  • 首先将库复制到HDFS:

    bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1  
    

    工作启动程序应包含以下内容:

    DistributedCache.createSymlink(conf);   
    DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so.1#mylib.so", conf);  
    

    MapReduce任务可以包含:

    System.load((new File("mylib.so")).getAbsolutePath());
    

  •  类似资料:
    • 我有一个CMACE项目,它的下一个结构是: 输出树为: 如果我在linux下编译程序,所有的工作都很完美,但是当我在Windows下做的时候,编译很好,但是app.exe不执行;我得到下一个错误: 我怀疑不要链接internal.cpp,因为当我将它的过程移到internal.h中时,就可以很好地工作。 有什么需要帮忙的吗? 以下是文件:root::cmakelists.txt app::cmak

    • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

    • 问题内容: 我以为我了解文档,但也许我听不懂。我的印象是该标志是双向的。如果我们在容器中有文件或目录,它们将被镜像到主机上,从而为我们提供了一种保留目录和文件的方法,即使在删除了Docker容器之后也是如此。 在官方的MySQL docker镜像中,这可行。所述可以被绑定到主机和生存重启和替换容器的同时维持在主机上的数据。 我为sphinxsearch-2.2.9写了一个docker文件,作为一种

    • PHP 非常流行,很少有服务器没有安装 PHP 的,因而有很多共享主机,不过需要注意服务器上的 PHP 是否是最新 版本。共享主机允许多个开发者把自己的网站部署在同一台服务器上面,这样的好处是费用非常便宜,坏处是你不知道将和哪些 网站共享主机,因此需要仔细考虑机器负载和安全问题。如果项目预算允许的话,避免使用共享主机是上策。

    • 问题内容: 当我尝试打开Eclipse时,弹出对话框指出: 无法加载JNI共享库“ C:/JDK/bin/client/jvm.dll”。 此后,Eclipse强制关闭。 我想提出几点: 我检查了该路径是否存在任何东西。它确实存在。 我的Eclipse和Java SE开发套件都是64位的。我检查了系统,它可以处理64位。 我已经在Google和Stack Overflow上搜索了此问题,发现的唯一

    • 问题内容: 我正在做centos。我在系统上安装了1.45.0 Boost版本。程序已正确编译,但是每当我键入命令以查看输出时,就会出现以下错误: ./a.out:加载共享库时出错:libboost_thread.so.1.45.0:无法打开共享库文件:没有此类文件或目录 问题答案: 您是如何安装Boost库的? 您可能遇到的问题是链接器找不到库,并且在构建程序时,必须手动指定其他库路径来搜索库。