thrift是一种可伸缩的跨语言服务的发展软件框架。
它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Java,Python和PHP和Ruby结合。
thrift是facebook开发的,我们现在把它作为开源软件使用。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。
以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。对于thrift的详细介绍见: http://thrift.apache.org/
thrift在hive中有好几处应用,目的都是为了实现跨语言的服务。
最近详细的看了在metadata模块中的thrift应用。
metadata中thrift定义文件为\hive-0.6.0\src\metastore\if\hive_metastore.thrift,
该文件详细定义了hive元数据的各个结构,以及相应的方法。
还是拿database来举例,对于database的结构定义如:struct Database {
1: string name,
2: string description,
3: string locationUri,
}对database的方法定义在service ThriftHiveMetastore extends fb303.FacebookService中,主要有以下几个:
void create_database(1:Database database) throws(1:AlreadyExistsException o1, 2:InvalidObjectException o2, 3:MetaException o3)
Database get_database(1:string name) throws(1:NoSuchObjectException o1, 2:MetaException o2)
void drop_database(1:string name, 2:bool deleteData) throws(1:NoSuchObjectException o1, 2:InvalidOperationException o2, 3:MetaException o3)
list<string> get_databases(1:string pattern) throws(1:MetaException o1)
list<string> get_all_databases() throws(1:MetaException o1)
定义好了metadata的thrift文件后,就可以通过thrift产生相应的脚本文件,
在build.xml中对于该编译命令为:
<target name=”thriftif”>
<echo>Executing thrift (which needs to be in your path) to build java metastore APIs…. </echo>
<exec executable=”thrift” failonerror=”true” dir=”.”>
<arg line=”–gen java:beans –gen cpp –gen php –gen py -I ${basedir}/../service/include/ -o ${src.dir} if/hive_metastore.thrift ” />
</exec>
</target>
当然我们也可以手工进行:thrift –gen java:beans –gen cpp –gen php –gen py -I ${basedir}/../service/include/ -o ${src.dir} if/hive_metastore.thrift
执行后就会产生
drwxr-xr-x 2 hjl hjl 4096 May 27 08:25 gen-cpp
drwxrwxr-x 3 hjl hjl 4096 May 27 08:27 gen-javabean
drwxr-xr-x 3 hjl hjl 4096 May 27 08:25 gen-php
drwxr-xr-x 3 hjl hjl 4096 May 27 08:25 gen-py
下面几个脚本,对应着c++,java,php和python。hive-0.6.0中使用的thrift版本为r790732,如果使用相同的thrift版本会产生和官方hive版本相同的文件,
而采用不同版本的thrfit的话,那么产生的各种文件会有些差距。