用gcc编译基于avro的c程序

在《Hadoop权威指南》第4章有一个用avro来实现不同语言间的数据交换(互操作)(见该书的4.4.4节)。在这个过程中,会通过Python来生成一个avro文件,然后再用c语言来读取该文件的内容。下面分别介绍这两方面的内容。

一、用Python来生成一个avro文件

   具体操作步骤如下:

   (1)下载 http://apache.fayea.com/avro/stable/py/avro-1.7.7.tar.gz

   (2) 将avro-1.7.7.tar.gz传到linux下,用下面的命令解压:

       tar zxvf avro-1.7.7.tar.gz

   (3) 进入解压的目录,并安装这个包

      cd avro-1.7.7

      python setup.py install

   (4) 将该书提供的源代码write_pairs.py传到linux上,并执行

         python write_pairs.py pairs.avro

        用户可输入如下内容,并按ctrl+d退出

       a,1

       c,2

       b,3

       b,2

   这样就会得到一个名为pairs.avro的二进制文件。可用下面的方式查看该二进制文件中的字符串:

    strings pairs.avro

会得到如下结果:

avro.schema
{"fields": [{"type": "string", "name": "left"}, {"type": "string", "name": "right"}], "type": "record", "name": "StringPair", "doc": "A pair of strings."}
avro.codec
null

 

二、用c语言来读到pairs.avro

具体操作步骤如下:

   (1)下载 http://apache.fayea.com/avro/stable/c/avro-c-1.7.7.tar.gz

   (2) 将avro-c-1.7.7.tar.gz传到linux下,用下面的命令解压:

       tar zxvf avro-c-1.7.7.tar.gz

   (3) 由于编译时需要用到cmake,需先到https://cmake.org/files/v3.4/cmake-3.4.0-rc2.tar.gz。

     然后解压 

          tar zxvf cmake-3.4.0-rc2.tar.gz

       cmake解压即可,不需要安装。为了在任何目录下能使用cmake,可将cmake的执行路径加到~/.bash_profile中的PATH环境变量中,比如笔者的PATH环境变量增加了cmake的执行路径后为这样:

   PATH=$PATH:$HOME/bin:/root/hadoop/cmake3.4/bin

    (4) 进入avro-c-1.7.7目录,并安装这个包

      cd avro-c-1.7.7

      然后执行下面这个shell脚下本      

          ./cmake_avrolib.sh

   注意,正确执行需要保证安装了gcc。若Linux上没有安装Linux,可参照http://blog.csdn.net/vah101/article/details/17677451来进行安装。

    (5)将书中提供的源码dump_pairs.c传到linux下,然后按下面的命令进行编译。

   gcc -I /root/hadoop/avro-c-1.7.7/build/avrolib/include/ -L/root/hadoop/avro-c-1.7.7/build/avrolib/lib -lavro -o dump_pairs dump_pairs.c

  注意,在笔者的机器上,avro-c的库是安装在/root/hadoop/avro-c-1.7.7/build/avrolib目录,在读者在编译时需根据自己的安装路径来修改相应库的路径。参数-l为要链接的库的名称,-lavro表示要链接-llibavro.so,前面的lib和后缀名都由gcc来自动加上,不应用由用户指定。

       (6)执行生成的可执行文件 dump_pairs

       ./dump_pairs pairs.avro

      其结果为:

       a,1

       c,2

       b,3

       b,2

posted @ 2015-10-27 20:59  flyinsky518  阅读(868)  评论(0)    收藏  举报