您的位置:首页 > 其它

HCatalog

2016-04-20 18:06 155 查看
HCatalog:Apache HCatalog是基于Apache Hadoop之上的数据表和存储管理服务。
提供一个共享的模式和数据类型的机制。
抽象出表,使用户不必关心他们的数据怎么存储。
提供可操作的跨数据处理工具,如Pig,MapReduce,Streaming,和Hive。

Hive0.11.0集成了HCatalog,Hive以前的版本不存在HCatalog.

HCatalog可以使Hive的元数据存储为基于Hadoop的其他的工具所共用。其为MapReduce和Pig提供了连接器,这样用户就可以通过使用那些工具,从Hive数据仓库中读取和写入数据。

MapReduce
读数据:
MapReduce使用Java类InputFormat来读取输入数据。绝大多数情况下,这个类会直接从HDFS中读取数据。InputFormat的实现类同样实现了从HBase、Cassendra和其他数据源中读取数据的功能。
InputFormat的任务是双重的。首先,其决定了数据是如何划分成数据片然后为MapReduce的map任务所并行处理的。其次,其提供了一个RecordReader,MapReduce使用这个类来从输入数据源中读取记录,然后将其转换成键和值来提供map任务进行处理。

HCatalog提供了一个HCatInputFormat类来提供MapReduce用户从Hive数据仓库中读取数据。其允许用户只读取需要的表分区和字段。同时其还以一种方便的列表格式来展示记录,这样就不要用户来进行划分了。
在初始化HCatInputFormat时,首先要做的事就是需要指定要读取的表。通过创建一个InputJobInfo类,然后指定数据库、表和分区过滤条件。
对于InputJobInfo实例和包含MapReduce任务的Job实例,可通过HCatInputFormat的setInput将其传递给HCatInputFormat:
Job job = new Job(conf,"example");
InputJobInfo inputInfo = InputJobInfo .create(databaseName,inputTableName,filter);
HCatInputFormat.setInput(job,inputInfo);

map任务需要指定值的类型是HCatRecord,键的类型不重要,因为HCatalog并不会将键提供给map任务。

HCatRecord是HCatalog提供的一个用于和记录交互的类。其提供过了简单的get和set方法,可以通过位置或者名称来获取记录。如果是同过
列名来获取字段内容的话,那么就必须提供表的模式信息。可以通过HCatInputFormat来获取表的模式信息。

写数据:
和读数据类似,写数据时,需要指定数据库名和要写入数据的表名,如果要写入的表是分区表而指向写入其中的一个分区的话,那么还需要指定要写入数据的分区名。
同时向多个分区写入数据是允许的,这也就是所谓的动态分区,因为记录是在执行时动态划分到不同的分区的。如果要使用动态分区的话,那么分区字段的值必须存在于数据中。
通过创建一个OutputJobInfo对象,然后就可以调用静态方法setOutput将其传递给HCatOutputFormat:
//注意第三个字段是Map<String,String> partitionValues 在此无分区 故传递null
OutputJobInfo outputInfo = OutputJobInfo .create(dbName,outputTableName,null);
HCatOutputFormat.setOutput(job,outputInfo);

当HCatOutputFormat写数据时,输出的键的数据类型并不重要,而值的类型必须是HCatRecord。可以再reduce阶段写数据或者对于只有map过程的任务来说,在map阶段写数据。

下面的例子将会从表名为rawevents的表中读取时间为20120531的分区,然后对每个用户计算对应的事件个数,并将结果写入到表cntd中:



命令行:
对于非Hive用户的HCatalog用户来说,提供了一个被称为hcat的命令行工具,这个工具和Hive的命令行工具类似,最大的区别就是其只接受不会产生MapReduce任务的命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: