libhdfs配置使用

系统 1842 0

libhdfs简介

libhdfs是hadoop为C/C++访问分布式文件系统提供的JNI接口。

配置环境:

linux:CentOS5.5

hadoop:hadoop-0.21.0

jdk:jdk1.6.0_26

libhdfs环境变量配置

把libhdfs需要的jar包加入CLASSPATH中。因为不知道所需的jar包是哪些,并且因为配置的hadoop版本也不同,因此肯定能跑的方法就是将全部jar包添加进CLASSPATH变量内。PS:直接将两个目录包进去好像是不行的,也不知道为什么。

使用root用户执行命令

        vim /etc/profile
      

打开profile文件,在文件尾部添加

        
          # #号开头的为注释,文件内是不需要的



#libhdfs所在的文件夹$HADOOP_HOME
        
        /hdfs/src/c++/
        
          libhdfs.PS:可能跟你的版本不一样

#java的头文件所在文件夹$JAVA_HOME
        
        /include:$JAVA_HOME/include/
        
          Linux,也就是jni所在文件夹

export C_INICLUDE_PATH
        
        =$HADOOP_HOME/hdfs/src/c++/libhdfs:$JAVA_HOME/include:$JAVA_HOME/include/
        
          Linux



#

export LD_LIBRARY_PATH
        
        =/usr/local/hadoop/hadoop-
        
          0.21
        
        .
        
          0
        
        /c++/Linux-i386-
        
          32
        
        /lib:/usr/java/jdk1.
        
          6
        
        .0_26/jre/lib/i386/
        
          server



#将$HADOOP_HOME目录下的jar包全部添加


        
        
          for
        
         i 
        
          in
        
         $HADOOP_HOME/*
        
          .jar


        
        
          do
        
        
          

    CLASSPATH
        
        =
        
          $CLASSPATH:$i


        
        
          done
        
        
          



#将$HADOOP_HOME
        
        /
        
          lib目录下的jar全部添加


        
        
          for
        
         i 
        
          in
        
         $HADOOP_HOME/lib/*
        
          .jar


        
        
          do
        
        
          

     CLASSPATH
        
        =
        
          $CLASSPATH:$i


        
        
          done
        
        
          



export CLASSPATH
        
      

动态链接库的配置

      添加动态链接库到/etc/ld.so.conf.f中,使用root权限输入命令
    
        vim /etc/
        
          ld
        
        .so.conf.d/hdfs.conf
      
      
        java的动态链接库路径$JAVA_HOME/jre/lib/i386/server
      
    
      
        libhdfs的动态链接库路径$HADOOP_HOME/c++/Linux-i386-32/lib
      
    
      
        向里面添加
        
          java的动态链接库路径和
          
            libhdfs的动态链接库路径
          
        
      
    
        /usr/java/jdk1.
        
          6
        
        .0_26/jre/lib/
        
          i386
        
        /server
      
        /usr/local/hadoop/hadoop-
        
          0.21
        
        .
        
          0
        
        /c++/Linux-i386-
        
          32
        
        /lib
      

保存退出后,执行命令使其生效

        ldconfig -v
      

Makefile文件

linux下编过程序都知道,当多文件时,使用makefile文件是必不可少的。你也可以使用命令行,只不过繁琐一点而已。

        HADOOP_HOME=/usr/local/hadoop/hadoop-
        
          0.21
        
        .
        
          0
        
        
          

PLATFORM
        
        =Linux-i386-
        
          32
        
        
          

JAVA_HOME
        
        =/usr/java/jdk1.
        
          6
        
        
          .0_26

CPPFLAGS
        
        = -I$(HADOOP_INSTALL)/hdfs/src/c++/
        
          libhdfs

LIB 
        
        = -L$(HADOOP_HOME)/c++/Linux-i386-
        
          32
        
        /
        
          lib

libjvm
        
        =/usr/java/jdk1.
        
          6
        
        .0_26/jre/lib/i386/client/
        
          libjvm.so

LDFLAGS 
        
        += -
        
          lhdfs



hadoop: hadoop.c

    
        
        
          gcc
        
         hadoop.c  $(CPPFLAGS) $(LIB)  $(LDFLAGS)  $(libjvm)  -
        
          o hadoop



clean:

    
        
        
          rm
        
         hadoop
      

libhdfs测试代码

        #include 
        
          "
        
        
          hdfs.h
        
        
          "
        
        
          int
        
         main(
        
          int
        
         argc, 
        
          char
        
         **
        
          argv) {



    hdfsFS fs 
        
        = hdfsConnect(
        
          "
        
        
          192.168.1.147
        
        
          "
        
        , 
        
          9000
        
        );
        
          //
        
        
          default为本地文件系统,ip地址为HDFS系统
        
        

    const 
        
          char
        
        * writePath = 
        
          "
        
        
          /tmp/testfile.txt
        
        
          "
        
        ;
        
          //要
        
        
          事先创建一个测试文件
        
        

    hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 
        
          0
        
        , 
        
          0
        
        , 
        
          0
        
        
          );

    
        
        
          if
        
        (!
        
          writeFile) {

          fprintf(stderr, 
        
        
          "
        
        
          Failed to open %s for writing!\n
        
        
          "
        
        
          , writePath);

          exit(
        
        -
        
          1
        
        
          );

    }

    
        
        
          char
        
        * buffer = 
        
          "
        
        
          Hello, World!
        
        
          "
        
        
          ;

    tSize num_written_bytes 
        
        = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+
        
          1
        
        
          );

    
        
        
          if
        
        
           (hdfsFlush(fs, writeFile)) {

           fprintf(stderr, 
        
        
          "
        
        
          Failed to 'flush' %s\n
        
        
          "
        
        
          , writePath);

          exit(
        
        -
        
          1
        
        
          );

    }

   hdfsCloseFile(fs, writeFile);

}
        
      

执行并测试

在makefile文件的目录下执行命令

        
          第一条:make
        
      
        
          第二条:./hadoop
        
      

打开浏览器输入你的HDFS地址 http://192.168.1.147:50070

进入HDFS系统查看是否存在此文件。

      
        image
      
    
      点击Browse the filesystem进入
    
      
        image
      
    
      进入/tmp查看到文件testfile.txt。证明上传成功!
    
      
        image
      
    

常见错误

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------

问题:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/commons/configuration/Configuration……

解决方案:

        肯定是CLASSPATH路径没有设置正确,没有添加到所需的jar包,回到上文查看libhdfs环境变量配置即可。
      

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------

问题:error while loading shared libraries: libhdfs.so.0:cannot open shared object file: No such file or directory

解决方案:

        先将libhdfs.so.0删除rm ./libhdfs.so.0
        
重新创建一个链接 ln -s ./libhdfs.so.0.0.0 ./libhdfs.so.0  
在/etc/ld.so.conf中加入一行
        /usr/local/hadoop/hadoop-
        
          0.21
        
        .
        
          0
        
        /c++/Linux-i386-
        
          32
        
        /lib
      
保存退出后,执行ldconfig -v使其生效

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------

※问题:配置环境后,提示CLASSPATH=……:No such file or directory

解决方案:

        还是CLASSPATH配置错误。如循环添加hadoop的jar包,直接复制网上代码,从而导致出错。
      
        原因是网上代码与vim内字符集不同,CLASSPATH=$CLASSPATH:$i 前面的空格与vim内看似一样实则不一样,因此我一个下午就废在这里了。
      

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------

参考资料

http://www.cnblogs.com/amboyna/archive/2008/02/06/1065322.html

http://blog.sina.com.cn/s/blog_4e4ee8ed01010ezr.html

http://www.cnblogs.com/niocai/archive/2012/03/15/2398303.html

libhdfs配置使用


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论