From 8b287869bd75665cdcf7f59b64389b6e33cfbab8 Mon Sep 17 00:00:00 2001 From: Stamatis Zampetakis Date: Wed, 27 Mar 2024 16:41:27 +0100 Subject: [PATCH] HIVE-28156: Remove HCatalog documentation from Hive git repo (Stamatis Zampetakis reviewed by Ayush Saxena) The HCatalog documentation has been migrated to the Hive wiki a long time ago (HIVE-4993, HIVE-4994). However, the source files and the website generation properties were left in the Hive repo and they are still present under hcatalog/src/docs directory. Ever since HIVE-4993, the docs directory is obsolete and all updates in the documentation are performed directly in the wiki (e.g., HIVE-4590, HIVE-1770). The presence of the docs directory in the git repo adds maintenance overhead and confusion with respect to how the HCatalog documentation is updated. Moreover, it adds extra burden to ASF releases since it currently becomes part of the source code distribution. Close apache/hive#5167 --- hcatalog/src/docs/forrest.properties | 170 ------ .../forrest.properties.dispatcher.properties | 27 - hcatalog/src/docs/forrest.properties.xml | 32 - hcatalog/src/docs/overview.html | 132 ---- .../src/docs/src/documentation/README.txt | 23 - .../classes/CatalogManager.properties | 62 -- .../src/docs/src/documentation/conf/cli.xconf | 327 ---------- .../src/documentation/content/locationmap.xml | 72 --- .../content/xdocs/addproperty.xml | 119 ---- .../content/xdocs/authorization.xml | 227 ------- .../src/documentation/content/xdocs/cli.xml | 222 ------- .../content/xdocs/configuration.xml | 332 ----------- .../content/xdocs/createcolumn.xml | 126 ---- .../documentation/content/xdocs/createdb.xml | 112 ---- .../content/xdocs/createpartition.xml | 126 ---- .../content/xdocs/createtable.xml | 222 ------- .../content/xdocs/createtablelike.xml | 127 ---- .../src/documentation/content/xdocs/ddl.xml | 128 ---- .../content/xdocs/ddlsummary.xml | 93 --- .../documentation/content/xdocs/deletedb.xml | 120 ---- .../content/xdocs/deletepartition.xml | 122 ---- .../content/xdocs/deletetable.xml | 109 ---- .../content/xdocs/desccolumn.xml | 103 ---- .../documentation/content/xdocs/descdb.xml | 103 ---- .../content/xdocs/descpartition.xml | 155 ----- .../content/xdocs/descproperty.xml | 112 ---- .../documentation/content/xdocs/desctable.xml | 191 ------ .../content/xdocs/dynpartition.xml | 122 ---- .../documentation/content/xdocs/example.xml | 86 --- .../src/documentation/content/xdocs/hive.xml | 142 ----- .../content/xdocs/images/TempletonArch.jpg | Bin 51542 -> 0 bytes .../images/build-with-forrest-button.jpg | Bin 1620 -> 0 bytes .../content/xdocs/images/hcat-archt.jpg | Bin 33412 -> 0 bytes .../content/xdocs/images/hcat-box.jpg | Bin 3491 -> 0 bytes .../content/xdocs/images/hcat-product.jpg | Bin 35817 -> 0 bytes .../content/xdocs/images/hcat.jpg | Bin 5765 -> 0 bytes .../content/xdocs/images/templetonlogo.png | Bin 24560 -> 0 bytes .../content/xdocs/images/templetonlogov2.png | Bin 7361 -> 0 bytes .../content/xdocs/images/templetontitle.jpg | Bin 14103 -> 0 bytes .../src/documentation/content/xdocs/index.xml | 117 ---- .../content/xdocs/inputoutput.xml | 460 -------------- .../documentation/content/xdocs/install.xml | 282 --------- .../content/xdocs/listcolumns.xml | 110 ---- .../documentation/content/xdocs/listdbs.xml | 80 --- .../content/xdocs/listpartitions.xml | 107 ---- .../content/xdocs/listproperties.xml | 103 ---- .../content/xdocs/listtables.xml | 122 ---- .../documentation/content/xdocs/loadstore.xml | 564 ------------------ .../content/xdocs/mapreducejar.xml | 163 ----- .../content/xdocs/mapreducestreaming.xml | 196 ------ .../content/xdocs/notification.xml | 241 -------- .../src/documentation/content/xdocs/pig.xml | 151 ----- .../src/documentation/content/xdocs/queue.xml | 161 ----- .../content/xdocs/queuedelete.xml | 156 ----- .../documentation/content/xdocs/queuelist.xml | 69 --- .../content/xdocs/readerwriter.xml | 159 ----- .../content/xdocs/renametable.xml | 120 ---- .../documentation/content/xdocs/resources.xml | 123 ---- .../content/xdocs/responsetypes.xml | 86 --- .../src/documentation/content/xdocs/rest.xml | 140 ----- .../content/xdocs/rest_server_install.xml | 258 -------- .../src/documentation/content/xdocs/site.xml | 98 --- .../documentation/content/xdocs/status.xml | 75 --- .../content/xdocs/supportedformats.xml | 51 -- .../src/documentation/content/xdocs/tabs.xml | 35 -- .../documentation/content/xdocs/versions.xml | 77 --- .../resources/images/ellipse-2.svg | 30 - .../src/docs/src/documentation/sitemap.xmap | 66 -- .../src/docs/src/documentation/skinconf.xml | 439 -------------- 69 files changed, 8883 deletions(-) delete mode 100644 hcatalog/src/docs/forrest.properties delete mode 100644 hcatalog/src/docs/forrest.properties.dispatcher.properties delete mode 100644 hcatalog/src/docs/forrest.properties.xml delete mode 100644 hcatalog/src/docs/overview.html delete mode 100644 hcatalog/src/docs/src/documentation/README.txt delete mode 100644 hcatalog/src/docs/src/documentation/classes/CatalogManager.properties delete mode 100644 hcatalog/src/docs/src/documentation/conf/cli.xconf delete mode 100644 hcatalog/src/docs/src/documentation/content/locationmap.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/addproperty.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/authorization.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/cli.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/configuration.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/createcolumn.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/createdb.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/createpartition.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/createtable.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/createtablelike.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/ddl.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/ddlsummary.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/deletedb.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/deletepartition.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/deletetable.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/desccolumn.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/descdb.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/descpartition.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/descproperty.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/desctable.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/dynpartition.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/example.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/hive.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/TempletonArch.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/build-with-forrest-button.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-archt.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-box.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-product.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/hcat.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/templetonlogo.png delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/templetonlogov2.png delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/images/templetontitle.jpg delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/index.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/inputoutput.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/install.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/listcolumns.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/listdbs.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/listpartitions.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/listproperties.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/listtables.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/loadstore.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/mapreducejar.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/mapreducestreaming.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/notification.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/pig.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/queue.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/queuedelete.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/queuelist.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/readerwriter.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/renametable.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/resources.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/responsetypes.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/rest.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/rest_server_install.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/site.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/status.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/supportedformats.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/tabs.xml delete mode 100644 hcatalog/src/docs/src/documentation/content/xdocs/versions.xml delete mode 100644 hcatalog/src/docs/src/documentation/resources/images/ellipse-2.svg delete mode 100644 hcatalog/src/docs/src/documentation/sitemap.xmap delete mode 100644 hcatalog/src/docs/src/documentation/skinconf.xml diff --git a/hcatalog/src/docs/forrest.properties b/hcatalog/src/docs/forrest.properties deleted file mode 100644 index 1a850a924702..000000000000 --- a/hcatalog/src/docs/forrest.properties +++ /dev/null @@ -1,170 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -############## -# These are the defaults, un-comment them only if you need to change them. -# -# You can even have a completely empty file, to assist with maintenance. -# This file is required, even if empty. -# -# The file obtained from 'forrest seed-sample' shows the defaults. -############## - -# Prints out a summary of Forrest settings for this project -#forrest.echo=true - -# Project name (used to name .war file) -#project.name=my-project - -# Specifies name of Forrest skin to use -# See list at http://forrest.apache.org/docs/skins.html -#project.skin=pelt - -# codename: Dispatcher -# Dispatcher is using a fallback mechanism for theming. -# You can configure the theme name and its extension here -#project.theme-extension=.fv -#project.theme=pelt - - -# Descriptors for plugins and skins -# comma separated list, file:// is supported -#forrest.skins.descriptors=http://forrest.apache.org/skins/skins.xml,file:///c:/myskins/skins.xml -#forrest.plugins.descriptors=http://forrest.apache.org/plugins/plugins.xml,http://forrest.apache.org/plugins/whiteboard-plugins.xml - -############## -# behavioural properties -#project.menu-scheme=tab_attributes -#project.menu-scheme=directories - -############## -# layout properties - -# Properties that can be set to override the default locations -# -# Parent properties must be set. This usually means uncommenting -# project.content-dir if any other property using it is uncommented - -#project.status=status.xml -#project.content-dir=src/documentation -#project.raw-content-dir=${project.content-dir}/content -#project.conf-dir=${project.content-dir}/conf -#project.sitemap-dir=${project.content-dir} -#project.xdocs-dir=${project.content-dir}/content/xdocs -#project.resources-dir=${project.content-dir}/resources -#project.stylesheets-dir=${project.resources-dir}/stylesheets -#project.images-dir=${project.resources-dir}/images -#project.schema-dir=${project.resources-dir}/schema -#project.skins-dir=${project.content-dir}/skins -#project.skinconf=${project.content-dir}/skinconf.xml -#project.lib-dir=${project.content-dir}/lib -#project.classes-dir=${project.content-dir}/classes -#project.translations-dir=${project.content-dir}/translations - -#project.build-dir=${project.home}/build -#project.site=site -#project.site-dir=${project.build-dir}/${project.site} -#project.temp-dir=${project.build-dir}/tmp - -############## -# Cocoon catalog entity resolver properties -# A local OASIS catalog file to supplement the default Forrest catalog -#project.catalog=${project.schema-dir}/catalog.xcat - -############## -# validation properties - -# This set of properties determine if validation is performed -# Values are inherited unless overridden. -# e.g. if forrest.validate=false then all others are false unless set to true. -#forrest.validate=true -#forrest.validate.xdocs=${forrest.validate} -#forrest.validate.skinconf=${forrest.validate} - -# PIG-1508: Workaround for http://issues.apache.org/jira/browse/FOR-984 -# Remove when forrest-0.9 is available -forrest.validate.sitemap=false -forrest.validate.stylesheets=false -forrest.validate.skins.stylesheets=false - -#forrest.validate.stylesheets=${forrest.validate} -#forrest.validate.skins=${forrest.validate} -#forrest.validate.skins.stylesheets=${forrest.validate.skins} - -# *.failonerror=(true|false) - stop when an XML file is invalid -#forrest.validate.failonerror=true - -# *.excludes=(pattern) - comma-separated list of path patterns to not validate -# Note: If you do add an "excludes" list then you need to specify site.xml too. -# e.g. -#forrest.validate.xdocs.excludes=site.xml, samples/subdir/**, samples/faq.xml -#forrest.validate.xdocs.excludes=site.xml - - -############## -# General Forrest properties - -# The URL to start crawling from -#project.start-uri=linkmap.html - -# Set logging level for messages printed to the console -# (DEBUG, INFO, WARN, ERROR, FATAL_ERROR) -#project.debuglevel=ERROR - -# Max memory to allocate to Java -#forrest.maxmemory=64m - -# Any other arguments to pass to the JVM. For example, to run on an X-less -# server, set to -Djava.awt.headless=true -#forrest.jvmargs= - -# The bugtracking URL - the issue number will be appended -# Projects would use their own issue tracker, of course. -#project.bugtracking-url=http://issues.apache.org/bugzilla/show_bug.cgi?id= -#project.bugtracking-url=http://issues.apache.org/jira/browse/ - -# The issues list as rss -#project.issues-rss-url= - -#I18n Property. Based on the locale request for the browser. -#If you want to use it for static site then modify the JVM system.language -# and run once per language -#project.i18n=false -project.configfile=${project.home}/src/documentation/conf/cli.xconf - -# The names of plugins that are required to build the project -# comma separated list (no spaces) -# You can request a specific version by appending "-VERSION" to the end of -# the plugin name. If you exclude a version number, the latest released version -# will be used. However, be aware that this may be a development version. In -# a production environment it is recommended that you specify a known working -# version. -# Run "forrest available-plugins" for a list of plug-ins currently available. - -project.required.plugins=org.apache.forrest.plugin.output.pdf,org.apache.forrest.plugin.input.simplifiedDocbook - - -# codename: Dispatcher -# Add the following plugins to project.required.plugins: -#org.apache.forrest.plugin.internal.dispatcher,org.apache.forrest.themes.core,org.apache.forrest.plugin.output.inputModule - -# Proxy configuration -# - proxy.user and proxy.password are only needed if the proxy is an authenticated one... -# proxy.host=myproxy.myhost.com -# proxy.port= -# proxy.user= -# proxy.password= diff --git a/hcatalog/src/docs/forrest.properties.dispatcher.properties b/hcatalog/src/docs/forrest.properties.dispatcher.properties deleted file mode 100644 index 1960924b0fb5..000000000000 --- a/hcatalog/src/docs/forrest.properties.dispatcher.properties +++ /dev/null @@ -1,27 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -############## -# Note: The reason for this "forrest.properties.dispatcher.properties" -# is to assist with automated testing (main/build.sh test). -# Its content redefines the project.required.plugins property which defines -# the list of required plugins for the dispatcher. -# To test the Dispatcher in development, simply replace the -# project.required.plugins property in the forrest.properties file by the one -# defined in this file. -# -project.required.plugins=org.apache.forrest.plugin.output.pdf,org.apache.forrest.plugin.internal.dispatcher,org.apache.forrest.themes.core,org.apache.forrest.plugin.output.inputModule diff --git a/hcatalog/src/docs/forrest.properties.xml b/hcatalog/src/docs/forrest.properties.xml deleted file mode 100644 index 0363f0b2b68c..000000000000 --- a/hcatalog/src/docs/forrest.properties.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - diff --git a/hcatalog/src/docs/overview.html b/hcatalog/src/docs/overview.html deleted file mode 100644 index 5179a5e91b4c..000000000000 --- a/hcatalog/src/docs/overview.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -Overview - - -

Overview

- - - -

HCatalog

-
-

HCatalog is a table and storage management layer for Hadoop that enables users with different data processing tools – Pig, MapReduce, and Hive – to more easily read and write data on the grid. HCatalog’s table abstraction presents users with a relational view of data in the Hadoop distributed file system (HDFS) and ensures that users need not worry about where or in what format their data is stored – RCFile format, text files, or SequenceFiles.

-

HCatalog supports reading and writing files in any format for which a SerDe can be written. By default, HCatalog supports RCFile, CSV, JSON, and SequenceFile formats. To use a custom format, you must provide the InputFormat, OutputFormat, and SerDe.

-

- - - -

HCatalog Architecture

-
-

HCatalog is built on top of the Hive metastore and incorporates Hive's DDL. HCatalog provides read and write interfaces for Pig and MapReduce and uses Hive's command line interface for issuing data definition and metadata exploration commands.

-

- -

Interfaces

-

The HCatalog interface for Pig consists of HCatLoader and HCatStorer, which implement the Pig load and store interfaces respectively. HCatLoader accepts a table to read data from; you can indicate which partitions to scan by immediately following the load statement with a partition filter statement. HCatStorer accepts a table to write to and optionally a specification of partition keys to create a new partition. You can write to a single partition by specifying the partition key(s) and value(s) in the STORE clause; and you can write to multiple partitions if the partition key(s) are columns in the data being stored. HCatLoader is implemented on top of HCatInputFormat and HCatStorer is implemented on top of HCatOutputFormat (see HCatalog Load and Store).

-

HCatInputFormat and HCatOutputFormat are HCatalog's interface for MapReduce; they implement Hadoop's InputFormat and OutputFormat, respectively. HCatInputFormat accepts a table to read data from and optionally a selection predicate to indicate which partitions to scan. HCatOutputFormat accepts a table to write to and optionally a specification of partition keys to create a new partition. You can write to a single partition by specifying the partition key(s) and value(s) in the STORE clause; and you can write to multiple partitions if the partition key(s) are columns in the data being stored. (See HCatalog Input and Output.)

-

Note: There is no Hive-specific interface. Since HCatalog uses Hive's metastore, Hive can read data in HCatalog directly.

-

Data is defined using HCatalog's command line interface (CLI). The HCatalog CLI supports all Hive DDL that does not require MapReduce to execute, allowing users to create, alter, drop tables, etc. (Unsupported Hive DDL includes import/export, CREATE TABLE AS SELECT, ALTER TABLE options REBUILD and CONCATENATE, and ANALYZE TABLE ... COMPUTE STATISTICS.) The CLI also supports the data exploration part of the Hive command line, such as SHOW TABLES, DESCRIBE TABLE, etc. (see the HCatalog Command Line Interface).

- -

Data Model

-

HCatalog presents a relational view of data. Data is stored in tables and these tables can be placed in databases. Tables can also be hash partitioned on one or more keys; that is, for a given value of a key (or set of keys) there will be one partition that contains all rows with that value (or set of values). For example, if a table is partitioned on date and there are three days of data in the table, there will be three partitions in the table. New partitions can be added to a table, and partitions can be dropped from a table. Partitioned tables have no partitions at create time. Unpartitioned tables effectively have one default partition that must be created at table creation time. There is no guaranteed read consistency when a partition is dropped.

-

Partitions contain records. Once a partition is created records cannot be added to it, removed from it, or updated in it. Partitions are multi-dimensional and not hierarchical. Records are divided into columns. Columns have a name and a datatype. HCatalog supports the same datatypes as Hive (see HCatalog Load and Store).

-
- - - -

Data Flow Example

-
-

This simple data flow example shows how HCatalog can help grid users share and access data.

-

-First Joe in data acquisition uses distcp to get data onto the grid.

-
-hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data
-
-hcat "alter table rawevents add partition (ds='20100819') location 'hdfs://data/rawevents/20100819/data'"
-
-

-Second Sally in data processing uses Pig to cleanse and prepare the data.

-

Without HCatalog, Sally must be manually informed by Joe when data is available, or poll on HDFS.

-
-A = load '/data/rawevents/20100819/data' as (alpha:int, beta:chararray, …);
-B = filter A by bot_finder(zeta) = 0;
-…
-store Z into 'data/processedevents/20100819/data';
-
-

With HCatalog, HCatalog will send a JMS message that data is available. The Pig job can then be started.

-
-A = load 'rawevents' using HCatLoader;
-B = filter A by date == '20100819' and by bot_finder(zeta) = 0;
-…
-store Z into 'processedevents' using HCatStorer("date=20100819");
-
-

-Third Robert in client management uses Hive to analyze his clients' results.

-

Without HCatalog, Robert must alter the table to add the required partition.

-
-alter table processedevents add partition 20100819 hdfs://data/processedevents/20100819/data
-
-select advertiser_id, count(clicks)
-from processedevents
-where date = '20100819' 
-group by advertiser_id;
-
-

With HCatalog, Robert does not need to modify the table structure.

-
-select advertiser_id, count(clicks)
-from processedevents
-where date = ‘20100819’ 
-group by advertiser_id;
-
-
- - -
- - diff --git a/hcatalog/src/docs/src/documentation/README.txt b/hcatalog/src/docs/src/documentation/README.txt deleted file mode 100644 index 55745572dd0f..000000000000 --- a/hcatalog/src/docs/src/documentation/README.txt +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -This is the base documentation directory. - -skinconf.xml # This file customizes Forrest for your project. In it, you - # tell forrest the project name, logo, copyright info, etc - -sitemap.xmap # Optional. This sitemap is consulted before all core sitemaps. - # See http://forrest.apache.org/docs/project-sitemap.html diff --git a/hcatalog/src/docs/src/documentation/classes/CatalogManager.properties b/hcatalog/src/docs/src/documentation/classes/CatalogManager.properties deleted file mode 100644 index b3819241c973..000000000000 --- a/hcatalog/src/docs/src/documentation/classes/CatalogManager.properties +++ /dev/null @@ -1,62 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#======================================================================= -# CatalogManager.properties for Catalog Entity Resolver. -# -# This is the default properties file for your project. -# This facilitates local configuration of application-specific catalogs. -# If you have defined any local catalogs, then they will be loaded -# before Forrest's core catalogs. -# -# See the Apache Forrest documentation: -# http://forrest.apache.org/docs/your-project.html -# http://forrest.apache.org/docs/validation.html - -# verbosity: -# The level of messages for status/debug (messages go to standard output). -# The setting here is for your own local catalogs. -# The verbosity of Forrest's core catalogs is controlled via -# main/webapp/WEB-INF/cocoon.xconf -# -# The following messages are provided ... -# 0 = none -# 1 = ? (... not sure yet) -# 2 = 1+, Loading catalog, Resolved public, Resolved system -# 3 = 2+, Catalog does not exist, resolvePublic, resolveSystem -# 10 = 3+, List all catalog entries when loading a catalog -# (Cocoon also logs the "Resolved public" messages.) -verbosity=1 - -# catalogs ... list of additional catalogs to load -# (Note that Apache Forrest will automatically load its own default catalog -# from main/webapp/resources/schema/catalog.xcat) -# Use either full pathnames or relative pathnames. -# pathname separator is always semi-colon (;) regardless of operating system -# directory separator is always slash (/) regardless of operating system -# The project catalog is expected to be at ../resources/schema/catalog.xcat -#catalogs=../resources/schema/catalog.xcat -# FIXME: Workaround FOR-548 "project DTD catalogs are not included -# when running as a servlet WAR". -# Same catalog, different path -catalogs=../resources/schema/catalog.xcat;../../project/src/documentation/resources/schema/catalog.xcat - -# relative-catalogs -# If false, relative catalog URIs are made absolute with respect to the -# base URI of the CatalogManager.properties file. This setting only -# applies to catalog URIs obtained from the catalogs property in the -# CatalogManager.properties file -# Example: relative-catalogs=[yes|no] -relative-catalogs=no diff --git a/hcatalog/src/docs/src/documentation/conf/cli.xconf b/hcatalog/src/docs/src/documentation/conf/cli.xconf deleted file mode 100644 index c238d97e8591..000000000000 --- a/hcatalog/src/docs/src/documentation/conf/cli.xconf +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - - - . - WEB-INF/cocoon.xconf - ../tmp/cocoon-work - ../site - - - - - - - - - - - - - - - index.html - - - - - - - */* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hcatalog/src/docs/src/documentation/content/locationmap.xml b/hcatalog/src/docs/src/documentation/content/locationmap.xml deleted file mode 100644 index 58422a23fdfc..000000000000 --- a/hcatalog/src/docs/src/documentation/content/locationmap.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/addproperty.xml b/hcatalog/src/docs/src/documentation/content/xdocs/addproperty.xml deleted file mode 100644 index c650bee9050e..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/addproperty.xml +++ /dev/null @@ -1,119 +0,0 @@ - - - - - -
- PUT ddl/database/:db/table/:table/property/:property -
- - -
- Description -

Add a single property on an HCatalog table. - This will also reset an existing property.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/property/:property

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:propertyThe property nameRequiredNone
groupThe user group to useOptionalNone
permissionsThe permissions string to useOptionalNone
valueThe property valueRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
databaseThe database name
tableThe table name
propertyThe property name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json -d '{ "value": "apples" }' \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/property/fruit?user.name=ctdean' - - -

JSON Output

- -{ - "property": "fruit", - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/authorization.xml b/hcatalog/src/docs/src/documentation/content/xdocs/authorization.xml deleted file mode 100644 index c44d5fe91f84..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/authorization.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - - - -
- Storage Based Authorization -
- - - - -
- Default Authorization Model of Hive - -

The default authorization model of Hive supports a traditional RDBMS style of authorization based on users, groups and roles and granting them permissions to do operations on database or table. It is described in more detail in Hive Authorization.

- -

This RDBMS style of authorization is not very suitable for the typical use cases in Hadoop because of the following differences in implementation:

- -
    -
  1. Unlike a traditional RDBMS, Hive is not in complete control of all data underneath it. The data is stored in a number of files, and the file system has an independent authorization system.
  2. -
  3. Also unlike a traditional RDBMS which doesn’t allow other programs to access the data directly, people tend to use other applications that read or write directly into files or directories that get used with Hive.
  4. -
- -

This creates problem scenarios like:

- -
    -
  1. You grant permissions to a user, but the user can’t access the database or file system because they don’t have file system permissions.
  2. -
  3. You remove permissions for a user, but the user can still access the data directly through the file system, because they have file system permissions.
  4. -
- -
- - - -
- Storage-System Based Authorization Model - -

The Hive community realizes that there might not be a one-size-fits-all authorization model, so it has support for alternative authorization models to be plugged in.

- -

In the HCatalog package, we have introduced implementation of an authorization interface that uses the permissions of the underlying file system (or in general, the storage backend) as the basis of permissions on each database, table or partition.

- -

In Hive, when a file system is used for storage, there is a directory corresponding to a database or a table. With this authorization model, the read/write permissions a user or group has for this directory determine the permissions a user has on the database or table. In the case of other storage systems such as HBase, the authorization of equivalent entities in the system will be done using the system’s authorization mechanism to determine the permissions in Hive.

- -

For example, an alter table operation would check if the user has permissions on the table directory before allowing the operation, even if it might not change anything on the file system.

- -

A user would need write access to the corresponding entity on the storage system to do any type of action that can modify the state of the database or table. The user needs read access to be able to do any non-modifying action on the database or table.

- -

When the database or table is backed by a file system that has a Unix/POSIX-style permissions model (like HDFS), there are read(r) and write(w) permissions you can set for the owner user, group and ‘other’. The file system’s logic for determining if a user has permission on the directory or file will be used by Hive.

- -

Details of HDFS permissions are given here: -HDFS Permissions Guide.

- - - -
- Minimum Permissions - -

The following table shows the minimum permissions required for Hive operations under this authorization model:

-

 

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


Operation

Database Read Access

Database Write Access

Table Read Access

Table Write Access

LOAD

X

EXPORT

X

IMPORT

X

CREATE TABLE

X

CREATE TABLE AS SELECT

X

X
source table

DROP TABLE

X

SELECT

X

ALTER TABLE

X

SHOW TABLES

X

- -

 

-

Caution: Hive's current implementation of this authorization model does not prevent malicious users from doing bad things. See the Known Issues section below.

- -
- - - -
- Unused DDL for Permissions - -

DDL statements that manage permissions for Hive's default authorization model do not have any effect on permissions in the storage-based model.

- -

All GRANT and REVOKE statements for users, groups, and roles are ignored. See the Known Issues section below.

- -
-
- - - -
- Configuring Storage-System Based Authorization - -

The implementation of the file-system based authorization model is available in the HCatalog package. (Support for this is likely to be added to the Hive package in the future.) So using this implementation requires installing the HCatalog package along with Hive.

- -

The HCatalog jar needs to be added to the Hive classpath. You can add the following to hive-env.sh to ensure that it gets added:

- -export HIVE_AUX_JARS_PATH=<path to hcatalog jar> - -

The following entries need to be added to hive-site.xml to enable authorization:

- - <property> - <name>hive.security.authorization.enabled</name> - <value>true</value> - <description>enable or disable the hive client authorization</description> - </property> - - <property> - <name>hive.security.authorization.manager</name> - <value>org.apache.hive.hcatalog.security.HdfsAuthorizationProvider</value> - <description>the hive client authorization manager class name. - The user defined authorization class should implement interface - org.apache.hadoop.hive.ql.security.authorization.HiveAuthorizationProvider. - </description> - </property> - - -

To disable authorization, set hive.security.authorization.enabled to false. To use the default authorization model of Hive, don’t set the hive.security.authorization.manager property.

- -
- - - -
- Creating New Tables or Databases - -

To create new tables or databases with appropriate permissions, you can either use the Hive command line to create the table/database and then modify the permissions using a file system operation, or use the HCatalog command line (hcat) to create the database/table.

- -

The HCatalog command line tool uses the same syntax as Hive, and will create the table or database with a corresponding directory being owned by the user creating it, and a group corresponding to the “-g” argument and permissions specified in the “-p” argument.

- -
- - - -
- Known Issues - -
    -
  1. Some metadata operations (mostly read operations) do not check for authorization. See https://issues.apache.org/jira/browse/HIVE-3009.
  2. -
  3. The current implementation of Hive performs the authorization checks in the client. This means that malicious users can circumvent these checks.
  4. -
  5. A different authorization provider (StorageDelegationAuthorizationProvider) needs to be used for working with HBase tables as well. But that is not well tested.
  6. -
  7. Partition files and directories added by a Hive query don’t inherit permissions from the table. This means that even if you grant permissions for a group to access a table, new partitions will have read permissions only for the owner, if the default umask for the cluster is configured as such. See https://issues.apache.org/jira/browse/HIVE-3094. A separate "hdfs chmod" command will be necessary to modify the permissions.
  8. -
  9. Although DDL statements for managing permissions have no effect in storage-based authorization, currently they do not return error messages. See https://issues.apache.org/jira/browse/HIVE-3010.
  10. -
- -
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/cli.xml b/hcatalog/src/docs/src/documentation/content/xdocs/cli.xml deleted file mode 100644 index bba20920fd3b..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/cli.xml +++ /dev/null @@ -1,222 +0,0 @@ - - - - - -
- Command Line Interface -
- - - -
- Set Up -

The HCatalog command line interface (CLI) can be invoked as -HIVE_HOME=hive_home hcat_home/bin/hcat -where hive_home is the directory where Hive has been installed and -hcat_home is the directory where HCatalog has been installed.

- -

If you are using BigTop's rpms or debs you can invoke the CLI by doing -/usr/bin/hcat.

- - -
- -
-HCatalog CLI - -

The HCatalog CLI supports these command line options:

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

Option

Usage

Description

-g

hcat -g mygroup ...

Tells HCatalog that the table which needs to be created must have group "mygroup".

-p

hcat -p rwxr-xr-x ...

Tells HCatalog that the table which needs to be created must have permissions "rwxr-xr-x".

-f

hcat -f myscript.hcatalog ...

Tells HCatalog that myscript.hcatalog is a file containing DDL commands to execute.

-e

hcat -e 'create table mytable(a int);' ...

Tells HCatalog to treat the following string as a DDL command and execute it.

-D

hcat -Dkey=value ...

Passes the key-value pair to HCatalog as a Java System Property.

hcat

Prints a usage message.

- -

Note the following:

-
    -
  • The -g and -p options are not mandatory. -
  • -
  • Only one -e or -f option can be provided, not both. -
  • -
  • The order of options is immaterial; you can specify the options in any order. -
  • -
-

If no option is provided, then a usage message is printed:

- -Usage: hcat { -e "<query>" | -f <filepath> } [-g <group>] [-p <perms>] [-D<name>=<value>] - -

- -

Owner Permissions

-

When using the HCatalog CLI, you cannot specify a permission string without read permissions for owner, such as -wxrwxr-x, because the string begins with "-". If such a permission setting is desired, you can use the octal version instead, which in this case would be 375. Also, any other kind of permission string where the owner has read permissions (for example r-x------ or r--r--r--) will work fine.

- -
- - -
- HCatalog DDL - -

HCatalog supports all Hive Data Definition Language except those operations that require running a MapReduce job. For commands that are supported, any variances are noted below.

-

HCatalog does not support the following Hive DDL commands:

-
    -
  • IMPORT FROM ...
  • -
  • EXPORT TABLE
  • -
  • CREATE TABLE ... AS SELECT
  • -
  • ALTER TABLE ... REBUILD
  • -
  • ALTER TABLE ... CONCATENATE
  • -
  • ANALYZE TABLE ... COMPUTE STATISTICS
  • -
  • ALTER TABLE ARCHIVE/UNARCHIVE PARTITION
  • -
- -
- Create/Drop/Alter Table - - -

CREATE TABLE

- -

If you create a table with a CLUSTERED BY clause you will not be able to write to it with Pig or MapReduce. This is because they do not understand how to partition the table, so attempting to write to it would cause data corruption.

- -

-

CREATE TABLE AS SELECT

-

Not supported. Throws an exception with the message "Operation Not Supported".

- -

DROP TABLE

-

Supported. Behavior the same as Hive.

- - - -

ALTER TABLE

- -

Supported except for the REBUILD and CONCATENATE options. Behavior the same as Hive.

- -

- -
- - -
- Create/Drop/Alter View -

Note: Pig and MapReduce cannot read from or write to views.

- -

CREATE VIEW

-

Supported. Behavior same as Hive.

- -

DROP VIEW

-

Supported. Behavior same as Hive.

- -

ALTER VIEW

-

Supported. Behavior same as Hive.

- -
- - -
- Show/Describe - -

SHOW TABLES

-

Supported. Behavior same as Hive.

- -

SHOW PARTITIONS

-

Not supported. Throws an exception with message "Operation Not Supported".

- -

SHOW FUNCTIONS

-

Supported. Behavior same as Hive.

- -

DESCRIBE

-

Supported. Behavior same as Hive.

- -
- - -
- Create/Drop Index - -

CREATE and DROP INDEX operations are supported.

-

Note: Pig and MapReduce cannot write to a table that has auto rebuild on, because Pig and MapReduce do not know how to rebuild the index.

-
- - -
- Create/Drop Function - -

CREATE and DROP FUNCTION operations are supported, but created functions must still be registered in Pig and placed in CLASSPATH for MapReduce.

- -
- - -
- "dfs" Command and "set" Command -

Supported. Behavior same as Hive.

-
-
- Other Commands -

Any command not listed above is NOT supported and throws an exception with the message "Operation Not Supported".

-
- -
- -
- CLI Errors -

Authentication

- - - - -

If a failure results in a message like "2010-11-03 16:17:28,225 WARN hive.metastore ... - Unable to connect metastore with URI thrift://..." in /tmp/<username>/hive.log, then make sure you have run "kinit <username>@FOO.COM" to get a Kerberos ticket and to be able to authenticate to the HCatalog server.

- -

Error Log

- -

If other errors occur while using the HCatalog CLI, more detailed messages are written to /tmp/<username>/hive.log.

- -
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/configuration.xml b/hcatalog/src/docs/src/documentation/content/xdocs/configuration.xml deleted file mode 100644 index 296b631af586..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/configuration.xml +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -
- Configuration -
- -

The configuration for Templeton merges the normal Hadoop configuration with - the Templeton specific variables. Because Templeton is designed to connect services - that are not normally connected, the configuration is more complex than might be - desirable.

- -

The Templeton specific configuration is split into two layers:

- -
    -
  1. webhcat-default.xml - All the configuration variables - that Templeton needs. This file sets the defaults that ship with Templeton and - should only be changed by Templeton developers. Do not copy this file and/or - change it to maintain local installation settings. Because webhcat-default.xml - is present in the Templeton war file, editing a local copy of it will not change the - configuration.
  2. - -
  3. webhcat-site.xml - The (possibly empty) configuration - file in which the system administrator can set variables for their Hadoop cluster. - Create this file and maintain entries in it for configuration variables - that require you to override default values based on your local installation.
  4. -
- -

The configuration files are loaded in this order with later files overriding - earlier ones.

- -

Note: the Templeton server will require restart - after any change to the configuration.

- -

To find the configuration files, Templeton first attempts to load a file from the - CLASSPATH and then looks in the directory specified in the - TEMPLETON_HOME environment variable.

- -

Configuration files may access the special environment variable - env for all environment variables. For example, the pig executable - could be specified using:

- - -${env.PIG_HOME}/bin/pig - - -

Configuration variables that use a filesystem path try to have reasonable defaults. - However, it's always safe to specify the full and complete path if there is any - uncertainty.

- -

Note: The location of the log files created by Templeton and some other properties - of the logging system are set in the webhcat-log4j2.properties file.

- -
- Variables - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDefaultDescription
templeton.port50111The HTTP port for the main server.
templeton.hadoop.config.dir$(env.HADOOP_CONFIG_DIR)The path to the Hadoop configuration.
templeton.jar${env.TEMPLETON_HOME}/share/webhcat/svr/webhcat-0.5.0-SNAPSHOT.jarThe path to the Templeton jar file.
templeton.libjars${env.TEMPLETON_HOME}/share/webhcat/svr/lib/zookeeper-3.4.3.jarJars to add to the classpath.
templeton.override.jarshdfs:///user/templeton/ugi.jarJars to add to the HADOOP_CLASSPATH for all Map Reduce jobs. - These jars must exist on HDFS.
templeton.override.enabledfalseEnable the override path in templeton.override.jars
templeton.streaming.jarhdfs:///user/templeton/hadoop-streaming.jarThe hdfs path to the Hadoop streaming jar file.
templeton.hadoop${env.HADOOP_PREFIX}/bin/hadoopThe path to the Hadoop executable.
templeton.pig.archivehdfs:///user/templeton/pig-0.10.1.tar.gzThe path to the Pig archive.
templeton.pig.pathpig-0.10.1.tar.gz/pig-0.10.1/bin/pigThe path to the Pig executable.
templeton.hcat${env.HCAT_PREFIX}/bin/hcatThe path to the Hcatalog executable.
templeton.hive.archivehdfs:///user/templeton/hive-0.10.0.tar.gzThe path to the Hive archive.
templeton.hive.pathhive-0.10.0.tar.gz/hive-0.10.0/bin/hiveThe path to the Hive executable.
templeton.hive.properties -hive.metastore.uris=thrift://localhost:9933, -hive.metastore.sasl.enabled=falseProperties to set when running hive. To use it in a cluster with -kerberos security enabled set hive.metastore.sasl.enabled=false and add hive.metastore.execute.setugi=true -Using localhost in metastore uri does not work with kerberos security. -
templeton.exec.encodingUTF-8The encoding of the stdout and stderr data.
templeton.exec.timeout10000How long in milliseconds a program is allowed to run on the - Templeton box. -
templeton.exec.max-procs16The maximum number of processes allowed to run at once.
templeton.exec.max-output-bytes1048576The maximum number of bytes from stdout or stderr stored in ram.
templeton.controller.mr.child.opts-server -Xmx256m -Djava.net.preferIPv4Stack=trueJava options to be passed to templeton controller map task.
templeton.exec.envsHADOOP_PREFIX,HADOOP_HOME,JAVA_HOME,HIVE_HOMEThe environment variables passed through to exec.
templeton.zookeeper.hosts127.0.0.1:2181ZooKeeper servers, as comma separated host:port pairs
templeton.zookeeper.session-timeout30000ZooKeeper session timeout in milliseconds
templeton.callback.retry.interval10000How long to wait between callback retry attempts in milliseconds
templeton.callback.retry.attempts5How many times to retry the callback
templeton.storage.classorg.apache.hive.hcatalog.templeton.tool.ZooKeeperStorageThe class to use as storage
templeton.storage.root/templeton-hadoopThe path to the directory to use for storage
templeton.hdfs.cleanup.interval43200000The maximum delay between a thread's cleanup checks
templeton.hdfs.cleanup.maxage604800000The maximum age of a templeton job
templeton.zookeeper.cleanup.interval43200000The maximum delay between a thread's cleanup checks
templeton.zookeeper.cleanup.maxage604800000The maximum age of a templeton job
templeton.kerberos.secretA random valueThe secret used to sign the HTTP cookie value. The default - value is a random value. Unless multiple Templeton instances - need to share the secret the random value is adequate.
templeton.kerberos.principalNoneThe Kerberos principal to used by the server. As stated by the - Kerberos SPNEGO specification, it should be - USER/${HOSTNAME}@{REALM}. It does not have a - default value.
templeton.kerberos.keytabNoneThe keytab file containing the credentials for the Kerberos - principal.
webhcat.proxyuser.#USER#.hostsNoneList of client hosts from which the '#USER#' user is allowed to perform - 'doAs' operations. - - The '#USER#' must be replaced with the username of the user who is - allowed to perform 'doAs' operations. - - The value can be the '*' wildcard, which means every host is allowed, - or a comma-separated list of hostnames. - - If value is a blank string or webhcat.proxyuser.#USER#.hosts is missing, - no hosts will be allowed. - - For multiple users copy this property and replace the user name - in the property name.
webhcat.proxyuser.#USER#.groupsNoneList of groups the '#USER#' user is allowed to impersonate users - from to perform 'doAs' operations. - - The '#USER#' must be replaced with the username of the user who is - allowed to perform 'doAs' operations. - - The value can be the '*' wildcard, which means any doAs value is - allowed, or a comma-separated list of groups. - - If value is an empty list or webhcat.proxyuser.#USER#.groups is missing, - every doAs call value will fail. - - For multiple users copy this property and replace the user name - in the property name. - - The username->usergroup mapping is performed using Hadoop API which is - controlled by hadoop.security.group.mapping property.
-
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/createcolumn.xml b/hcatalog/src/docs/src/documentation/content/xdocs/createcolumn.xml deleted file mode 100644 index bc8c64a22df9..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/createcolumn.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - -
- PUT ddl/database/:db/table/:table/column/:column -
- - -
- Description -

Create a column in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/column/:column

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:columnThe column nameRequiredNone
groupThe user group to useOptionalNone
permissionsThe permissions string to useOptionalNone
typeThe type of column to add, like "string" or "int"RequiredNone
commentThe column comment, like a descriptionOptionalNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
columnThe column name
tableThe table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json \ - -d '{"type": "string", "comment": "The brand name"}' \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/column/brand?user.name=ctdean' - - -

JSON Output

- -{ - "column": "brand", - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/createdb.xml b/hcatalog/src/docs/src/documentation/content/xdocs/createdb.xml deleted file mode 100644 index 52660a2a9280..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/createdb.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - -
- PUT ddl/database/:db -
- - -
- Description -

Create a database.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
groupThe user group to useOptionalNone
permissionsThe permissions string to useOptionalNone
locationThe database locationOptionalNone
commentA comment for the database, like a descriptionOptionalNone
propertiesThe database propertiesOptionalNone
-
- -
- Results - - - - - - - -
NameDescription
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json \ - -d '{ "comment":"Hello there", - "location":"hdfs://localhost:9000/user/hive/my_warehouse", - "properties":{"a":"b"}}' \ - 'http://localhost:50111/templeton/v1/ddl/database/newdb?user.name=rachel' - - -

JSON Output

- -{ - "database":"newdb" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/createpartition.xml b/hcatalog/src/docs/src/documentation/content/xdocs/createpartition.xml deleted file mode 100644 index d90bcf85fab5..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/createpartition.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - -
- PUT ddl/database/:db/table/:table/partition/:partition -
- - -
- Description -

Create a partition in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/partition/:partition

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:partitionThe partition name, col_name='value' list. Be careful to properly - encode the quote for http, for example, country=%27algeria%27.RequiredNone
groupThe user group to useOptionalNone
permissionsThe permissions string to useOptionalNone
locationThe location for partition creationRequiredNone
ifNotExistsIf true, return an error if the partition already exists.OptionalFalse
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
partitionThe partition name
tableThe table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json -d '{"location": "loc_a"}' \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/partition/country=%27algeria%27?user.name=ctdean' - - -

JSON Output

- -{ - "partition": "country='algeria'", - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/createtable.xml b/hcatalog/src/docs/src/documentation/content/xdocs/createtable.xml deleted file mode 100644 index d352d78587c4..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/createtable.xml +++ /dev/null @@ -1,222 +0,0 @@ - - - - - -
- PUT ddl/database/:db/table/:table -
- - -
- Description -

Create a new HCatalog table. For more information, please refer to the - Hive documentation.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe new table nameRequiredNone
groupThe user group to use when creating a tableOptionalNone
permissionsThe permissions string to use when creating a table.OptionalNone
externalAllows you to specify a location so that Hive does not use the default - location for this table.Optionalfalse
ifNotExistsIf true, you will not receive an error if the table already exists.Optionalfalse
commentComment for the tableOptionalNone
columnsA list of column descriptions, including name, type, and an optional comment.OptionalNone
partitionedByA list of column descriptions used to partition the table. Like the columns - parameter this is a list of name, type, and comment fields.OptionalNone
clusteredByAn object describing how to cluster the table including the parameters - columnNames, sortedBy, numberOfBuckets. The sortedBy parameter includes - the parameters columnName and order. For further information - please refer to the examples below or to the - - Hive documentation.OptionalNone
formatStorage format description including paraeters for rowFormat, storedAs - and storedBy. For further information please refer to the examples below or to the - - Hive documentation.OptionalNone
locationThe HDFS pathOptionalNone
tablePropertiesA list of table property names and values (key/value pairs)OptionalNone
-
- -
- Results - - - - - - - - - - - -
NameDescription
tableThe new table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json -d '{ - "comment": "Best table made today", - "columns": [ - { "name": "id", "type": "bigint" }, - { "name": "price", "type": "float", "comment": "The unit price" } ], - "partitionedBy": [ - { "name": "country", "type": "string" } ], - "format": { "storedAs": "rcfile" } }' \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table?user.name=ctdean' - - -

Curl Command (using clusteredBy)

- -% curl -s -X PUT -HContent-type:application/json -d '{ - "comment": "Best table made today", - "columns": [ - { "name": "id", "type": "bigint"}, - { "name": "price", "type": "float", "comment": "The unit price" } ], - "partitionedBy": [ - { "name": "country", "type": "string" } ], - "clusteredBy": { - "columnNames": ["id"], - "sortedBy": [ - { "columnName": "id", "order": "ASC" } ], - "numberOfBuckets": 10 }, - "format": { - "storedAs": "rcfile", - "rowFormat": { - "fieldsTerminatedBy": "\u0001", - "serde": { - "name": "org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe", - "properties": { - "key": "value" } } } } - } ' \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table_c?user.name=ctdean' - - -

JSON Output

- -{ - "table": "test_table", - "database": "default" -} - - -

JSON Output (error)

- -{ - "statement": "use default; create table test_table_c(id bigint, price float comment ...", - "error": "unable to create table: test_table_c", - "exec": { - "stdout": "", - "stderr": "WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated... - Hive history file=/tmp/ctdean/hive_job_log_ctdean_201204051335_2016086186.txt - SLF4J: Class path contains multiple SLF4J bindings. - SLF4J: Found binding in ... - SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. - OK - Time taken: 0.448 seconds - FAILED: Error in semantic analysis: Operation not supported. HCatalog doesn't allow Clustered By in create table. - ", - "exitcode": 10 - } -} - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/createtablelike.xml b/hcatalog/src/docs/src/documentation/content/xdocs/createtablelike.xml deleted file mode 100644 index 0e6f4edb7a1f..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/createtablelike.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - -
- PUT ddl/database/:db/table/:existingtable/like/:newtable -
- - -
- Description -

Create a new HCatalog table like an existing one

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:existingtable/like/:newtable

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:existingtableThe existing table nameRequiredNone
:newtableThe new table name.RequiredNone
groupThe user group to use when creating a tableOptionalNone
permissionsThe permissions string to use when creating a table.OptionalNone
externalAllows you to specify a location so that Hive does not use the default - location for this table.Optionalfalse
ifNotExistsIf true, you will not receive an error if the table already exists.Optionalfalse
locationThe HDFS pathOptionalNone
-
- -
- Results - - - - - - - - - - - -
NameDescription
tableThe new table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X PUT -HContent-type:application/json -d {} \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/like/test_table_2?user.name=ctdean' - - -

JSON Output

- -{ - "table": "test_table_2", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/ddl.xml b/hcatalog/src/docs/src/documentation/content/xdocs/ddl.xml deleted file mode 100644 index 95fad4e95775..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/ddl.xml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -
- POST ddl -
- - -
- Description -

Performs an - HCatalog DDL command. The command is executed immediately upon request. - Responses are limited to 1MB. For requests which may return longer results - consider using the Hive resource as an alternative.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
execThe HCatalog ddl string to executeRequiredNone
groupThe user group to use when creating a tableOptionalNone
permissionsThe permissions string to use when creating a table. The format is - "rwxrw-r-x".OptionalNone
-
- -
- Results - - - - - - - - - - - - - - -
NameDescription
stdoutA string containing the result HCatalog sent to standard out (possibly empty).
stderrA string containing the result HCatalog sent to standard error - (possibly empty).
exitcodeThe exitcode HCatalog returned.
-
- -
- Example - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d 'exec=show tables;' \ - 'http://localhost:50111/templeton/v1/ddl' - - -

JSON Output

- -{ - "stdout": "important_table - my_other_table - my_table - my_table_2 - pokes - ", - "stderr": "WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated... - Hive history file=/tmp/ctdean/hive_job_log_ctdean_201111111258_2117356679.txt - OK - Time taken: 1.202 seconds - ", - "exitcode": 0 -} - - -

JSON Output (error)

- -{ - "stdout": "", - "stderr": "WARNING: org.apache.hadoop.metrics.jvm.EventCounter is deprecated... - Hive history file=/tmp/ctdean/hive_job_log_ctdean_201204051246_689834593.txt - FAILED: Parse Error: line 1:5 Failed to recognize predicate 'tab'... - - ", - "exitcode": 11 -} - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/ddlsummary.xml b/hcatalog/src/docs/src/documentation/content/xdocs/ddlsummary.xml deleted file mode 100644 index 66ec25522e4a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/ddlsummary.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -
- Templeton DDL Resources -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ResourceDescription
ddlPerforms an HCatalog DDL command.
ddl/databaseList HCatalog databases.
ddl/database/:db (GET)Describe an HCatalog database.
ddl/database/:db (PUT)Create an HCatalog database.
ddl/database/:db (DELETE)Delete (drop) an HCatalog database.
ddl/database/:db/tableList the tables in an HCatalog database.
ddl/database/:db/table/:table (GET)Describe an HCatalog table.
ddl/database/:db/table/:table (PUT)Create a new HCatalog table.
ddl/database/:db/table/:table (POST)Rename an HCatalog table.
ddl/database/:db/table/:table (DELETE)Delete (drop) an HCatalog table.
ddl/database/:db/table/:existingtable/like/:newtable (PUT)Create a new HCatalog table like an existing one.
ddl/database/:db/table/:table/partionList all partitions in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (GET)Describe a single partition in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (PUT)Create a partition in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (DELETE)Delete (drop) a partition in an HCatalog table.
ddl/database/:db/table/:table/columnList the columns in an HCatalog table.
ddl/database/:db/table/:table/column/:column (GET)Describe a single column in an HCatalog table.
ddl/database/:db/table/:table/column/:column (PUT)Create a column in an HCatalog table.
ddl/database/:db/table/:table/property (GET)List table properties.
ddl/database/:db/table/:table/property/:property (GET)Return the value of a single table property.
ddl/database/:db/table/:table/property/:property (PUT)Set a table property.
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/deletedb.xml b/hcatalog/src/docs/src/documentation/content/xdocs/deletedb.xml deleted file mode 100644 index 1c7db0f4a72a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/deletedb.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -
- DELETE ddl/database/:db -
- - -
- Description -

Delete a database.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
ifExistsHive returns an error if the database specified does not exist, - unless ifExists is set to true.Optionalfalse
optionParameter set to either "restrict" or "cascade". Restrict will remove the - schema if all the tables are empty. Cascade removes everything including - data and definitions.OptionalNone
groupThe user group to useOptionalNone
permissionsThe permissions string to use. The format is - "rwxrw-r-x".OptionalNone
-
- -
- Results - - - - - - - -
NameDescription
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X DELETE "http://localhost:50111/templeton/v1/ddl/database/newdb?user.name=ctdean" - - -

JSON Output

- -{ - "database":"newdb" -} - - -

JSON Output (error)

- -{ - "errorDetail": " - NoSuchObjectException(message:There is no database named my_db) - at org.apache.hadoop.hive.metastor... - ", - "error": "There is no database named newdb", - "errorCode": 404, - "database": "newdb" -} - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/deletepartition.xml b/hcatalog/src/docs/src/documentation/content/xdocs/deletepartition.xml deleted file mode 100644 index 88613f7494a7..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/deletepartition.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -
- DELETE ddl/database/:db/table/:table/partition/:partition -
- - -
- Description -

Delete (drop) a partition in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/partition/:partition

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:partitionThe partition name, col_name='value' list. Be careful to properly - encode the quote for http, for example, country=%27algeria%27.RequiredNone
ifExistsHive returns an error if the partition specified does not exist, - unless ifExists is set to true.Optionalfalse
groupThe user group to useOptionalNone
permissionsThe permissions string to use. The format is - "rwxrw-r-x".OptionalNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
partitionThe partition name
tableThe table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X DELETE \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/partition/country=%27algeria%27?user.name=ctdean' - - -

JSON Output

- -{ - "partition": "country='algeria'", - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/deletetable.xml b/hcatalog/src/docs/src/documentation/content/xdocs/deletetable.xml deleted file mode 100644 index ccede1a98733..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/deletetable.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - -
- DELETE ddl/database/:db/table/:table -
- - -
- Description -

Delete (drop) an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
ifExistsHive 0.70 and later returns an error if the table specified does not exist, - unless ifExists is set to true.Optionalfalse
groupThe user group to useOptionalNone
permissionsThe permissions string to use. The format is - "rwxrw-r-x".OptionalNone
-
- -
- Results - - - - - - - - - - - -
NameDescription
tableThe table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -X DELETE 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table?user.name=ctdean' - - -

JSON Output

- -{ - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/desccolumn.xml b/hcatalog/src/docs/src/documentation/content/xdocs/desccolumn.xml deleted file mode 100644 index 86fd59b46a60..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/desccolumn.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/column/:column -
- - -
- Description -

Describe a single column in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/column/:column

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:columnThe column nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
databaseThe database name
tableThe table name
columnA JSON object containing the column name, type, and comment (if any)
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/column/price?user.name=ctdean' - - -

JSON Output

- -{ - "database": "default", - "table": "test_table", - "column": { - "name": "price", - "comment": "The unit price", - "type": "float" - } -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/descdb.xml b/hcatalog/src/docs/src/documentation/content/xdocs/descdb.xml deleted file mode 100644 index 11ca61a8109a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/descdb.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -
- GET ddl/database/:db -
- - -
- Description -

Describe a database. (Note: this resource has a "format=extended" parameter however - the output structure does not change if it is used.)

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db

-
- -
- Parameters - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - - - - - -
NameDescription
locationThe database location
paramsThe database parameters
commentThe database comment
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/newdb?user.name=ctdean' - - -

JSON Output

- -{ - "location":"hdfs://localhost:9000/warehouse/newdb.db", - "params":"{a=b}", - "comment":"Hello there", - "database":"newdb" -} - - -

JSON Output (error)

- -{ - "error": "No such database: newdb", - "errorCode": 404 -} - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/descpartition.xml b/hcatalog/src/docs/src/documentation/content/xdocs/descpartition.xml deleted file mode 100644 index 3b98c2cd1529..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/descpartition.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/partition/:partition -
- - -
- Description -

Describe a single partition in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/partition/:partition

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:partitionThe partition name, col_name='value' list. Be careful to properly - encode the quote for http, for example, country=%27algeria%27.RequiredNone
-
- -
- Results - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
databaseThe database name
tableThe table name
partitionThe partition name
partitionedTrue if the table is partitioned
locationLocation of table
outputFormatOutput format
columnslist of column names, types, and comments
ownerThe owner's user name
partitionColumnsList of the partition columns
inputFormatInput format
-
- -
- Example - -

Curl Command

- -% curl -s \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/mytest/partition/country=%27US%27?user.name=ctdean' - - -

JSON Output

- -{ - "partitioned": true, - "location": "hdfs://ip-10-77-6-151.ec2.internal:8020/apps/hive/warehouse/mytest/loc1", - "outputFormat": "org.apache.hadoop.hive.ql.io.RCFileOutputFormat", - "columns": [ - { - "name": "i", - "type": "int" - }, - { - "name": "j", - "type": "bigint" - }, - { - "name": "ip", - "comment": "IP Address of the User", - "type": "string" - } - ], - "owner": "rachel", - "partitionColumns": [ - { - "name": "country", - "type": "string" - } - ], - "inputFormat": "org.apache.hadoop.hive.ql.io.RCFileInputFormat", - "database": "default", - "table": "mytest", - "partition": "country='US'" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/descproperty.xml b/hcatalog/src/docs/src/documentation/content/xdocs/descproperty.xml deleted file mode 100644 index 561c4afa16eb..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/descproperty.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/property/:property -
- - -
- Description -

Return the value of a single table property.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/property/:property

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
:propertyThe property nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
propertyThe requested property's name: value pair
databaseThe database name
tableThe table name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/property/fruit?user.name=ctdean' - - -

JSON Output

- -{ - "property": { - "fruit": "apple" - }, - "table": "test_table", - "database": "default" -} - - -

JSON Output (error)

- -{ - "error": "Table test_table does not exist", - "errorCode": 404, - "database": "default", - "table": "test_table" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/desctable.xml b/hcatalog/src/docs/src/documentation/content/xdocs/desctable.xml deleted file mode 100644 index 1e92203d04ea..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/desctable.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table -
- - -
- Description -

Describe an HCatalog table. Normally returns a simple list of columns - (using "desc table"), but the extended format will show more information (using - "show table extended like").

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table

-

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table?format=extended

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
formatSet "format=extended" to see additional information (using "show table - extended like")OptionalNot extended
-
- -
- Results - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
columnsA list of column names and types
databaseThe database name
tableThe table name
partitioned (extended only)True if the table is partitioned
location (extended only)Location of table
outputFormat (extended only)Output format
owner (extended only)The owner's user name
partitionColumns (extended only)List of the partition columns
inputFormat (extended only)Input format
-
- -
- Example - -

Curl Command (simple)

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/my_table?user.name=ctdean' - - -

JSON Output (simple)

- -{ - "columns": [ - { - "name": "id", - "type": "bigint" - }, - { - "name": "user", - "comment": "The user name", - "type": "string" - }, - { - "name": "my_p", - "type": "string" - }, - { - "name": "my_q", - "type": "string" - } - ], - "database": "default", - "table": "my_table" -} - - -

Curl Command (extended)

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table?user.name=ctdean&format=extended' - - -

JSON Output (extended)

- -{ - "partitioned": true, - "location": "hdfs://ip-10-77-6-151.ec2.internal:8020/apps/hive/warehouse/test_table", - "outputFormat": "org.apache.hadoop.hive.ql.io.RCFileOutputFormat", - "columns": [ - { - "name": "id", - "type": "bigint" - }, - { - "name": "price", - "comment": "The unit price", - "type": "float" - } - ], - "owner": "ctdean", - "partitionColumns": [ - { - "name": "country", - "type": "string" - } - ], - "inputFormat": "org.apache.hadoop.hive.ql.io.RCFileInputFormat", - "database": "default", - "table": "test_table" -} - - -

JSON Output (error)

- -{ - "error": "Table xtest_table does not exist", - "errorCode": 404, - "database": "default", - "table": "xtest_table" -} - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/dynpartition.xml b/hcatalog/src/docs/src/documentation/content/xdocs/dynpartition.xml deleted file mode 100644 index 3aa1dd36618c..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/dynpartition.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -
- Dynamic Partitioning -
- - - -
- Overview - -

When writing data in HCatalog it is possible to write all records to a single partition. In this case the partition column(s) need not be in the output data.

- -

The following Pig script illustrates this:

- -A = load 'raw' using HCatLoader(); -... -split Z into for_us if region='us', for_eu if region='eu', for_asia if region='asia'; -store for_us into 'processed' using HCatStorer("ds=20110110, region=us"); -store for_eu into 'processed' using HCatStorer("ds=20110110, region=eu"); -store for_asia into 'processed' using HCatStorer("ds=20110110, region=asia"); - -

- -

In cases where you want to write data to multiple partitions simultaneously, this can be done by placing partition columns in the data and not specifying partition values when storing the data.

- - -A = load 'raw' using HCatLoader(); -... -store Z into 'processed' using HCatStorer(); - - -

The way dynamic partitioning works is that HCatalog locates partition columns in the data passed to it and uses the data in these columns to split the rows across multiple partitions. (The data passed to HCatalog must have a schema that matches the schema of the destination table and hence should always contain partition columns.) It is important to note that partition columns can’t contain null values or the whole process will fail.

-

It is also important to note that all partitions created during a single run are part of one transaction; -therefore if any part of the process fails, none of the partitions will be added to the table.

-
- - -
- Usage with Pig - -

Usage from Pig is very simple! Instead of specifying all keys as one normally does for a store, users can specify the keys that are actually needed. HCatOutputFormat will trigger on dynamic partitioning usage if necessary (if a key value is not specified) and will inspect the data to write it out appropriately.

- -

So this statement...

- -store A into 'mytable' using HCatStorer("a=1, b=1"); - - -

...is equivalent to any of the following statements, if the data has only values where a=1 and b=1:

- - -store A into 'mytable' using HCatStorer(); - - - -store A into 'mytable' using HCatStorer("a=1"); - - - -store A into 'mytable' using HCatStorer("b=1"); - - -

On the other hand, if there is data that spans more than one partition, then HCatOutputFormat will automatically figure out how to spray the data appropriately.

- -

For example, let's say a=1 for all values across our dataset and b takes the values 1 and 2. Then the following statement...

- -store A into 'mytable' using HCatStorer(); - - -

...is equivalent to either of these statements:

- -store A into 'mytable' using HCatStorer("a=1"); - - - -split A into A1 if b='1', A2 if b='2'; -store A1 into 'mytable' using HCatStorer("a=1, b=1"); -store A2 into 'mytable' using HCatStorer("a=1, b=2"); - -
- - -
-Usage from MapReduce -

As with Pig, the only change in dynamic partitioning that a MapReduce programmer sees is that they don't have to specify all the partition key/value combinations.

- -

A current code example for writing out a specific partition for (a=1, b=1) would go something like this:

- - -Map<String, String> partitionValues = new HashMap<String, String>(); -partitionValues.put("a", "1"); -partitionValues.put("b", "1"); -HCatTableInfo info = HCatTableInfo.getOutputTableInfo(dbName, tblName, partitionValues); -HCatOutputFormat.setOutput(job, info); - - -

And to write to multiple partitions, separate jobs will have to be kicked off with each of the above.

- -

With dynamic partitioning, we simply specify only as many keys as we know about, or as required. It will figure out the rest of the keys by itself and spray out necessary partitions, being able to create multiple partitions with a single job.

- -
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/example.xml b/hcatalog/src/docs/src/documentation/content/xdocs/example.xml deleted file mode 100644 index afc9b0d15ce2..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/example.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - -
- Example -
- -

The following example, extracted from the HCatalog documentation, shows how people - might use HCatalog along with various other Hadoop tools to move data from the grid - into a database and ultimately analyze it.

- -

Without Templeton there are three main steps to completing - the task.

- -

First, Joe in data acquisition uses distcp to get data - onto the grid.

- - -hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data - -hcat "alter table rawevents add partition 20100819 hdfs://data/rawevents/20100819/data" - - -

Second, Sally in data processing uses Pig to cleanse and prepare the - data. Oozie will be notified by HCatalog that data is available and can then - start the Pig job

- - -A = load 'rawevents' using HCatLoader; -B = filter A by date = '20100819' and by bot_finder(zeta) = 0; -… -store Z into 'processedevents' using HCatStorer("date=20100819"); - - -

Third, Robert in client management uses Hive to analyze his - clients' results.

- - -insert overwrite table 20100819events -select advertiser_id, count(clicks) -from processedevents -where date = ‘20100819’ -group by advertiser_id; - - -

With Templeton all these steps can be easily performed programatcally - upon receipt of the initial data. Sally and Robert can still maintain their own scripts - and simply push them into HDFS to be accessed when required by Templeton.

- - -??Still need to add web hdfs push! - ->POST /v1/templeton/ddl.json?exec="alter table rawevents add partition 20100819 hdfs://data/rawevents/20100819/data" ->{"result":"ok"} -> ->POST /v1/templeton/pig.json?src="hdfs://scripts/cleanse.pig" ->{"result": "ok", "jobid": "123"} -> ->... ->GET /v1/templeton/queue/123.json ->{"result": "ok", "status" "completed"} -> ->POST /v1/templeton/hive.json?src="hdfs://scripts/analyze.hive" ->{"result": "ok", "jobid": "456"} -> - - - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/hive.xml b/hcatalog/src/docs/src/documentation/content/xdocs/hive.xml deleted file mode 100644 index 8761c4440454..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/hive.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - - -
- POST hive -
- - -
- Description -

Runs a Hive query or set of commands.

-
- -
- URL -

http://www.myserver.com/templeton/v1/hive

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
executeString containing an entire, short hive program to run.One of either "execute" or "file" is requiredNone
fileHDFS file name of a hive program to run.One of either "exec" or "file" is requiredNone
defineSet a Hive configuration variable using the syntax - define=NAME=VALUE.OptionalNone
statusdirA directory where Templeton will write the status of the - Hive job. If provided, it is the caller's responsibility - to remove this directory when done.OptionalNone
enablelogCollecting hadoop job config and logs into $statusdir/logs folder. - statusdir must be set as well to use this feature.OptionalNone
callbackDefine a URL to be called upon job completion. You may embed a specific - job ID into this URL using $jobId. This tag - will be replaced in the callback URL with this job's job ID.OptionalNone
-
- -
- Results - - - - - - - - - - -
NameDescription
idA string containing the job ID similar to "job_201110132141_0001".
infoA JSON object containing the information returned when the job was queued. - See the Hadoop documentation - (Class - TaskController) for more information.
-
- -
- Example - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d execute="select+*+from+pokes;" \ - -d statusdir="pokes.output" \ - 'http://localhost:50111/templeton/v1/hive' - - -

JSON Output

- -{ - "id": "job_201111111311_0005", - "info": { - "stdout": "templeton-job-id:job_201111111311_0005 - ", - "stderr": "", - "exitcode": 0 - } -} - - -

Results

- -% hadoop fs -ls pokes.output -Found 2 items --rw-r--r-- 1 ctdean supergroup 610 2011-11-11 13:22 /user/ctdean/pokes.output/stderr --rw-r--r-- 1 ctdean supergroup 15 2011-11-11 13:22 /user/ctdean/pokes.output/stdout - -% hadoop fs -cat pokes.output/stdout -1 a -2 bb -3 ccc - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/TempletonArch.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/TempletonArch.jpg deleted file mode 100644 index fbc515f42433e1ea0ed0f8072591b3ba04235722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51542 zcmeFYcQ{<#-!Hs}Vf5bHs38Q=yU_&^gs2J8d+&7;2@*9(NDxF%5s6Op8Yx5xL8A8( zGwNW>yj$-3{ypa@=e?fyT<84pUe{T!wfA?vtM9eew|v%u|AC(aX!LdTbN~nh0$c(A z0Q>?gR!>vY&iJ~Kj^0&mFaZEqx9t7=ya;Fjz}qJ%;JU5`x22UeH*6Y!0dRl>kOxTZ z9RvN;jg7AY|I=_d4uCZQz^LeXUH{W;|8)YblXIXW06>hvWCy1}M{kg>1popKN56m| z03gJG{BNN_ejp9~2+|AzUtr zKgj0}adZXiq0|BZVmcoucOL+tw*+ZbM>l&X@LN0u^IY=w_C2S2Kw8M*f2haxf1vH{ z9sX6Py}j$d=)cASmINEtau4+LvJe0B^nJY{mmyJaBPk^FaW#&XCN2|0G~d9C~y_f z1hoEsiUKZxJ(v;#rUe3?zzRrvgC%^yGQJ?q{dYdi|HRSxQ_dAE_wQ@u1{}e>!T)OW zuhzK1Hvg&99dH8afB5!b8|P`~y$iH+kNvkc|H*M)-=E%GetmiUGWMT7K`%fhp)ybn zs0vgSssM09nV@WdC{!9M4^@XEph{qx0-ysdfi=7S)5r7ry{lb9p8AF>n!ACi=VN#H zClxUNliU4YzyDJY0QbSIhOK{k002SGVcIKn<=?R)7oO1BAfuED6X0N`M-m4d??#fEi!~*n;cF4P1i( zKqwFe+y&x+B;XP71jqpjfMTEms06Bk2A~D#1p0u_z&GGKFb&KB%fKdp0uF&wP)Nfd zln{CdD+CS^fQUdOA@UGah&JRZA@h)R$S&lBfRKQKfPsLM-~xd-fjogafdPRT!7Tz;0)K)Cg8Kxi1WyTy2;LCX z6Lb=MCiqS;N3cn7KnM_$6EYF<5Q-AY6KWC~5n2Rq1;eWaGhR(-hetn{h=|?WM~ew0$LC4fsR7wp(rShh?0ndNQ6j{NRP;p z$dxFRD4r;bsEnwNsF&zF(K68?F)=X{u^_P=@fBh#Vh`d-;$-6I#8t!{#KXjk#0M}K zj1?vVQ-K-5>|sH$c-S-88(2GR1hx#rkdTwWNhC>hNUTYGNMcE{NM4b&k&KY6lAMy# zkP470k{XdZk%p6|k(Q7)lMazClb({%k_nQjkeQKrkliJFO7@nlm+U9m9yvKVFS!D_ z3AsD@9rCB-@5n!r&yych&`}6eXj0sy2&PD-D5vP4n55XFq@=t+sYYo{8AO>%`I54m za)uH^MNcJ0rAOsNg`~=*s;3&E`b|wrEkLbKZA%?Nokd+kJw&}lLrQajMw7;#CWa=L zrio^P=75%-R)W@u)|)n&_7&{_?HV17?gE`QofF-Cx?;L+x)W;0<6Wy@#lW!qwB zU{_*yWKU$TW}o69;1K4x&JoE`%<+ZefRl?;m(!2)8D}@=78etj8kYyxW3D!?bvQj- z748my3~z^Ta5HkNb9-?=!86En$}7lwgEyA9iuV^E8J|3#3*TeD zE%4NE;4+H=#s)EpG!rTCPXPj)kQ-@ zUyII*F^OFjixq1S`z_8dZY`cJ-Y<^3EOXiGa>?as2|5XViCBqdiCsxyNk_?C$uTKP zDIF=KRHGDHT147eI$!#S484q@OoB|8%$cm5Y=G=r*>yR7x!ZDiauf0l^2YMX@*fq5 z6f_i&3M~r9in5A9iq(ocN}@`hO0SgGlm(TYl}nTtRd`kGRbHsfsdB5{RxMPWL+~K% z5k-gvH9j>bwKBC;^^58r>TlG4Yh2a{(5TZm(p1!p*6h$C)Y8>T)Ed;L)4rjdqdlX; ztK+KkS_h>oqZ_H)afRrL!IktY6MCF_j(RWkQ2KKE(fU0G6b7aSIR*94bR+mimpQfhP4k!LM;2NZ85VPv;+D~tpRL%e+^rg|VbW!48a+BQ#YmT$`3 zjK4X4OYm0MtpQs$TQA#IJ8C<7yPDfXw=HhJx{b9rvM;hfaL{web3i$2I%Yd=I;lB5 zc3O8kxox>?y63o~J+62ZcpP~ed6s+Py)3+{yh*%o zdpG&e`FQ&D_;UG%`40Pu_{ICp`78QA@ka$11e66r0&fL21~Guf;g?{c;JD!V5Y>>} z5KO3fXiXSxm`~W3aN+QW;j0lk5v7sPNXN*oD4wXhQS;I2(Jx{kF%B_ZNIv9!|9}qv0pp;PX0Q$iF!QexwhtD43 z5}gu1C0$O+O2Q^PCVxtiNO_uqPjyKhOp{H^e?JlmfTjx*0eUVw)<`P_K5a_4!@4APS?)G zF1xPjZp-em9+RHIUW49`eL8*J{p$VgA5}iK3@8pXeUksw@LBeA{TG=pbzfz^)(y%I z)(^=IHGWh0);z2{+%|$3=^WJ>?Hkh@`~3ad_u=sy<3A>DPR#vq`mr|YHHn@InL3@m z^ONXj;xC$CSu-3nMY9)YtL9|qTIaRqzbu$8OfNbvZY~8bVVCc(P_AUH!dG9eNv^f5 z>#Tpfr|?O?3RN*gcayJ zd;?pnV$w%s zapZ9nk15NkCTLh`o#|>AAdFT_?^(!Lt=KBqe{%|Q8NofcLwLe@k$eyNGX-)l6bY6I zm0m0rE);oo>5*uH7*ag^a)?BTWRz5xw6%=5ERpOlxjOk&1$RXqC4OZByZ^nv7f@FeapRZylEtRw zo)yl9^d{{sT3Z@Bn%gw?bPf!TEKVHGye>knm)#WI4LyQ9pL_LqZ}?LCN&DXj2noy# zstO(mSqME1XNb5IsS{-v9Uha3ti02AcQzJtpEgc7UL(QkLBPY5#Men*l6O-%(yl&= zNw3Y=dMxXPc;HVigyHIsbcX_0Te)@I&*y~D6muS=_2tw*_6zE7%O{G-SK z=K%K8_~)uG@n3BQ#Rl<1gWqz7T}C8Ffzhe4`tOF@^o#Q=U*O(;#Vk=m{ARjFC)lnP*uU*g&n!k-%Bb)em3b{>`((JI2?_Un-D%!B6m- zkf0Fu;-GMzi0dWEOUI%eV)5dJm*JO>B!(o*q#~uS%CN~S$-b8Jlb4j=Rd}ZusDw~v zRNhq?Q*A`#sUg*EHRLtPG>5fPwbivzI_`FRr`SBanR4ryZKYk)?f3Q-4lf*^Ib}E}yTrTRb&GNj^$7Iz z^YZcb^6~I>_jC7m5AX=|3i1UF>EO`tu;}pEh=jcWl9_@3Xd_;joq2G&# zMK6m#maLVLmS3#Uf9d%u`E})+p-NO0-8<>`H>!hcp48UV4cBis!kT!R6+f7?IJEk= z-Dywj$n7ledf(mL(+SF}!T!;Y9|zh#)qZ~SrR;0rVBXNPZ%>D_M{-9i#u~qW9G{%n z_;ET#ISv0Q@k?vQVm4qdd%j~~eTjYS^iOm%rzq6;KBJfkp@gC*J&qcD>Jvnxv^E0QgeJ%S^GGnmU8?!axrqr}U>d&t+tA0r?xFmoYEP+o9e zDE^}G#XeyNVXVmGOP4P7i#mz{VtL|<;@>a(Nl;3>l+=-2kcyQSkRFw}Co3sCFPAQ_ zE{{?uP&8Holq!{NR7h2tRNWEmh#|E&brtmkjVetqEfK8^?Uy=kx1K zI)PXg0E!0yzyfrrjoAR;`5p+9fOr+PFZi1h0L&Bs0=@|V@<|1Nm~8$_f51RY<|3d9 zdX}ERJy43&0AGL=2#DlBWFbZnchC#WhcrVbAo~P#1QG-$1c3xk2$~7z2uTTL2%QMC z35TF0Ai@w0ZHAr@DG}Wv>L;clzD4|o7zZ!=i|I;gKu57AiCEYSMUp3ps@XQnS>kYo7BXv4U}bf1}xxq-!uWsmhSn=IQT zdo%|x#{j247duxk+@G6|`xj3(uNfa5-w3F&%rCHAm<4r~&qcY5$HMPLJT3`bS`;l2 za}gI2-@n{0kt%5?B`r-My&}^kTPSx&-d;gV@uCv75(c!Nzp1t(-l>(SKhsFpOx8-! zj@60Q4ZY&0=c<3x!1$_`q1-iLBTi#l6SC_tQNYsUfT5Y`EN{^}({$tNmVQes^o{{714+@?Sg$UwoSy<@xSA(KW^PGi2t+JYw<9 z3dfq#2Ic0&cGiwQYH#<^zQDozBUw!SiNtC783!))kNltqE`cbI9S{y=g2=%~U=hGU z*dcNd6Nnci0a6UqBqEd`v?EL->?GWW3PYWt<(Y&r@tL>!|she~qSMRlci^12cGlpm*s4=U_rR!>@=4ReE;>}-J zv|3JEo!W5RMBH++O|)yijdBojba2XZo^oY&vvAM$nDXNCcJO)Wi}sfa2n%crCJr$U z%?(?Nkc)f}H60_4jJxwIR`y=z{oQ!egvN*5iAhN(Dc-3Ik8IM%Gi@HPWraN@dsdjM zlsA^1p}_P8E56>9uH!*s%Dz1d$}al#aBQOtx&d97=&p z@v2gUa)rtSf>=#X-9zJr=Cn48j-_til|_AN(8~CEP15Lr@$7Xu(+sn1b3=>wR&3UZ zHuzhSw%FUj_MaSiog$paKsz(VebdvxtI~(w7wNYdU>?{REF6*vTA0oeLs1&h?MRI~ zUt(|HJBuq$Fn)kZbV(XdxsuxaNIbnXlk;(Q7JYWwGp3xPJhA6Z1sa6|MMlMArIuyW z6;3aIzmBLRew+2~!u!S=gW9?JkVeX;;txtKV{JYiq@AVRnmr4Bu^;&dK7Wq;0R;psx}2+h@lRbpf@3uG+QQ zBiJk1m)Y+-xN$IcXnHtuq<_?k5yuoAQy+&PFPvOGsXb*mjXs^nYGcdKNY32O25`c- z1l%%S6aV6T{|CBANuFyD079Vw8j~}4{N4osfMo!{SvnqnT7<`+6@$(Ocm~qp_1AgD zd1hh|bI%((r}`Z>@0`E?$AF&)?r4X(gZ_)5As`HNB4@JzNy&_a|;lHc64%fadmU| z2n-4i2@MO6xOYD;KHYx~8_SzM-+HxvRUUx3B-> zz^9SXvG3y(KPIQ<7Z#V6S60{7H_*F#`v-?dnB$Z4aX~=4;-B!>$o|8)Xu)w2K%s3JpZk}znbzj)tC$|rRl#pn<)Ovc17JuiShAKIUh z{r3hI`@b}@e+}&4#x(^{fZjF%Eg>y{0M4*Qi9*2tjsK^=fs`5%gUNYJ&ye~GFqmln zpNaSHgqN1R?--CS*?LP@lXx}pwts3^p{(92Z>j#qW`zfWH#yNqx0RLaz&dd)M4Of2 zXIg}$%G#J%f|E(Q;m4z5zL^w_|D^;m_h(%DP9_zBJd+HBnI>8Nf!o(~DDybx_ViDF zIIa~X7Lo}S-T7}tjSfeZb&tAELLZF`NuA%%xY`P=6^R~ReOW8J6)P$6Rq#1{(BQV< zrT#kzHmoz|10EoPVxBDSFmBASpFO=K4X4Ja4!VmvVbT}ak@W^qYrR~CiXX9YH?o&A zqCa&+f8Rl8C$=ap3_Z*axEbY$sX^;5Bz>7)c|R6B(J%^8(F*bRPUT6@69W8uV;*+f zGOtd47aA`$)W~}>R<>18ZXOj9+Ha*}A*NraP>Oy3y~^|ig7)1OI8_a!TX0i$M1PpK zNbu$T7^yVNU@b7HYs|YRmm#Sr8g`)$?COQH#2|zCcw{P@_kOp$p`7|y6=5_RyNlg; zJA2Sj9Fj^pEY>niu={mG@sNig@^t$ck-d7Ww5-6{Lh_oPZ38` zqNWIx+3aL(fHXWMS&4S;r34;$F|q2#!qU;P{se{xz8efG;et21*U$;4mJ@j34zg2u zAndd0)_gXO2-LD?tVuYs>{Bt<;3Wi8P|xopThhi3JkTa}>%tRogbHVg!KC9C+r)3K zGgIP$O9yZ=k73AxZw&+dd5pc|w}s*y7BSH&r3VhrsBZ+B!}b^%Ra3{NjwITT1+jGV zi;8w!tjIaLvzMn9^99q?hnDF3>HUScZ*Vff#!RkTtrHIlYoG1?(3Rq&-%dP%8GWy9 zwb4(+1NviL!Ah(;4vn?Xol|hhCHF8Ed!`jw1WN1;hledS>g%Na=eB25TPN|;=@^H1 zK?QLU;&Cz|-(xs7aVi*#*Q=t@^WtObp z7D9#xO08`tb?vLVX*TThC6<3m-pdfUK2!^+%bd!gA{WZ+0OGNZz4FSIL3bk;=}3R1=dYD$h=sES}HRuqe!X zTogDu>n|JDW}M5fFwtfJ{&z*Q00Om+L4}tWsjZD}s~Vwyzh0c4ox%gQsJ0}uNDq$e z+ddwEtt-abxSfPN6Mya>9QvwXe?0~JRo?wXml#r#)$_;&LZkXFs{8jG?+B8g%)#m@}$QX`?ChDr%F!Y7FoB~#tKV? ze&scQ_27Zw7|aVi5c{W|w0BVkc%bMEtqHC@E-pN<>>Mm@vC@ua#MI#KIb)FNYe-l7 z_H>T_W>FJ7Kx>zTSd+C&IEEdDupiTYj=r~GcgDPv2*(Jaj_`np&?&5^{X~400f91^ z-@%z%m}}<0&F?xkGb;_9Pi|b2P z#+~8c0!e^mq{TsqRj$1hnd&sT$u%WgQJJISRSym0kc{^N3?{Y@A=(Vaf8rHOs;1J4 zC3#@4m%!)K!b93-u9(N+5AOsf?|XQe@{B8TtKij-*=w#BB^QK4N!WbQLOEok6_ zJKMs{3Tb)v<@-1YX$LfGiCUBF+HkwwZj(vUlkHI)?6|=Ep-D|Vc#~i%pG4-k#`)9) zH_pX-ma~l6o)@1q&}_yS9m;-}{v~)FJ(0O^%L3fvmJR7@Szj5Pi_YdAGzGvu!Y_W< ztb#>FVyqU#C&{}I?BY=t#bM$dG2Ej(Z4E7G6)aoCG%53$*_+*Px3z#0ktZMJ`2(#3 z>YB(bRNg(3${$PI*lfC{JJRNcnLag&lEavs(skfBWpcC}sENiQDmd&A~1O8zV@ig|O{Xd0IT&UJzM=w1^KeZxTY$=U*&U(w_2<(}56RZM4s=A*${xP#J>s|cA3wWmizWg-K0 z@Vf34^ld>G-yiVMlXnncUM0r~+r8M<%uw@6pP0Hk=%-0L!7-66*A?x5 zS+q?&%0LSqIy43?KPEH6+`x(VA?5?Zeq|4j%ku4gMQrB{``$%j7!X7IGFhhgkW`{k zivlN7Q`DRRLK~42NqC^^6`CFS7SoA_WH-hwCKvRO@nb~YgYE_!JwP(b@b56Rad*Kx z1mIJX-I&XU5uXsHA8~`9i(0V`w&|JJW2DrNw?36#l~<1%E?a9Tw(LUT&#IKiW5lqs z!z|=OOzX^as|4(_r#J7PK)ANxSJ9UB?LZrI=jE(b&8F{f5v!HBVt=uiLU|aPxRqQN zl@O<_99W16)Ec=dMo~X*qRYdTTTeHO;_F}Vh^|N4X|tJOcP>tU7a-ug6r0nsteF2$ z_aGBXEuGz$uZqrzPU=u)XhR)5uDrJ(PG6WXz#<>EJ+Trv;ob-7i$I@(+7McmG7l;^ z#V|?c3@a;{U-kw{uKXVKg#EtguQ9%~+1DjH`hX73NT)r!QUuBXd8|c!9}jFfj^ly- zMHQq<*k-nQu@UL@y3p&_SK75Iy)%Y=H)6Wy%~exEACzlk+~@neu@gPLzwWrNnkZDY z>Uenhf2R{zqT=rU$67E(Bd`TKDTu9nOeh{OIN12{21$WNPoRZyj|=Q za}jgLk)P^HYrkf}hk^)P3hHz3m#VmGGD|OKg{EuQvmVO$xHL3xg*C<7n9^G0Tsk$D z%urLg_-k{OdUA0)t9t>LBKv-U)3)CL-DTt6Z#Dk5PGNh&n_2&PG5ya0{3{)wuCi7QqM}C}CpfcOz$}2{ zcD}Zri9RVGz{IKAK5xoD^^N*t6=@VSX;BW#qx z8#Ne+6`W|KCIDf`8)YDvYx%-s|>PKHg_WLf9xC>7y zcZGetUp$;{dY?RY<7k=dRz}0TgS#A~*mgOl`~=P(g*dCn11|pHM%w?@#`iPI2xWWE zy(}yOUXO_|)L;o#GI&sUYuvzv{fi_q5hLvtAF^dX&t>t4b_};M%cpuVUq@}Rlo*pj ztoipCwx3~DI&gMnZT@_&VQ-fvZQ6d1cNHzIP7lR^vuT|~QtsCbXEIG^1vr=of{{A) z0DccnwxjIjleJzqi4}1b*t^y^Es@vX`rPmG(r?c9Hu;Je1Jvk3P=ptfHiiSk-aq_9 zA(Cf7lxhlVBL%Q#4(d!@A(Y>&buIIBw>Ditf}46p(Om;=BXDlbVk8*T?$)(q_{z7d zk7%P%7j<$&%YTN!^=aLhw97{3GNNS_o_wKIWL^B3eB<#)#vD2J_Cjh%)xGR_ zxdi0AZA092$ExA|H9J%)OX~B(TkXxK3Q0#X*JeM|Ecfeo8{KOsb3jczsCC1!M5!d{ zPRz%1hIApQtuL|V`4wJqY*c5l%93U`Rt-rdCJN!=K&`~hixa!!I8cL0C1HWxhcpko zf_{k&D%sdL!Miz3D$H(XgxpQ_$Qw<`J}9y)4A=||c=XOBOP;H?4%)E|rO2b9E{pb` zDs+m~x=mvLagZ9eTkd+HO*Z>*5~DDWn3n1(AW*$D`x%wicPQsE~aaQIGuJqJTR9vyZZo6hWycA3HGNi0_T3BtuzX{-qW+E z?x)Cmvpu~a-G1tSaxOi0*G~)oy${I49b8CMl$<>L4;uAfyg}))dTdNEe1(Mn?pSc? zIaoCV+DFC8!#RLZ2|rb>5A4OzXbwOMIH6SBU@{zc^-~rv4sNANq#keE%C^H*8NuV{ z>{)1C71NKf$b|q+qOYkbui-VSl@xPc8N<1x{(HU}5587J84old_8&*THNtJu6eWu6nvU3O3$aSy-g^|rx^D1{{HeYWcWPm(l=kJT zLPcpql|)1gF?>~(|ISbTHolP7YU_x~#Oc|-#siK84-xxk6&B^x{{{2CJ|384ti+BT6?~&X3^A&C>9Fpk>bV9A)^Np$PGl%#IQ(Spq=91?4h&AEbRyIVb8VB zZx$zp^9v0W%Q&;b_Fc0mCaJ4hk1SZx%-sW=N( zY-Xd=0}P=i;LQ?ALFe?4=Dfo0i%TIv_wSC)MNCX_tS-@l=0-rw*qcB+KrMkeV*Rb9 zSnwtKn#^51u+jgG2Tb+HjTKj68KxJH&W^|Mz;U2mRqkjF@kyYqy+68m{xP!F=Q%2M zwvX*vIa=&DtDq|9=#reA`MbUk`JQpfmm99$CVpDz@ac6%2MzUCaZD)lwgDc{lf|6k zftX+f?&dJ4br#NEwy$59g}3hvmg9lXIcHHiP`~MTN!9$?twaC|b|%3;W^8sp(=KiH zXw?*S_P@eWzs09=aT%WIQyg{!iEXNy*cvXVTGsDK`v^a8#Sm;o26OgzDr;hWFd{ek5n>^5h;YAZ;;ehjEPy+T!|9G1 z_gpeK{`|)fY%cDbU3Ef#6=(!?>b}KMVw4u-da9=O`fRyIy(@#O7&b%pbg2?|SuZg8 z1_p;J3iA%M6KfymtG#YiMS3Casej;sMcCHRoKD(;Tz|B0&tU_Nw-JH+25?b0bIdLR&(ioa zjI2kXyx1QA)i1=!81U*tK={CBPBb_7Dnl(`ZVm#kyyovg97qxmtP$6FirfMhu!tod zsA5I#6RJrahn*E5mxiK1`{+_JsL>-EL?)@nKpQsY- z5BTb?%n1m|K|#yuu^Pq{*Qer(2d+s??CFjOV#463k$Aux;fD&vJZ(P(jd>r07U(tO zZXtsH9jd>IHCjla?wlcSMKeD*Ald)LJFK1`dfgv9gQdvOlkb4$tciS4y&Ogv!yhv= z!-FcrEHpRW*K_4deiPW&x#)-o2#gVID}C4A2wgLKvXt5IayTwU!91~Io9X)*RY6zV zXeC#mZ9;}55oFej^8=r=Po<5t_2AHA1jeb`uy z9}T4TaHMs$>oUA0rWP!3jhcn|^L<5SJkfe`MYbe6aC#v*#W}2wy%CQA1{Hu^g-yw))Fk0v$?EVsN_T$DNd4#TG z2A}1rl2xeq&z(wOGwvWn6R^zWT}y=GTkBP6SHs%)@IZahpSs&o7FGz?9fqnhWfKS< zm?CI5Y@bg;IK71QZ>^)E2q%2wy(bVE-(AiU+MRRaRp7|ewu1p}F05Lw|Sf-=- z%|P)EBx@nK^Lv=K@jz|wEhCKRL>I0)iVD4ZCKKs+CbBQuZV&%)25R@@aEyo4gwOM| zC6CuJ9qsQwui_;3I!NLR8ssnPZJJIBrb6Se)SA;k2~;b#o_=`D<0M^5&=7J4*$R{D+lwLxYSBjKka zva5?DV?I@lVnh{yc3MI~&CXUOiq5ktIpPgsT5)lWZi6lEYhC&UA^RV@18gE~>zqFb zlIS>IeIx}?zLWhpvU{f*Sn^v+YUo=_?JO-2x>se-7Rbw(57BAaOcRZ+;J*?wnMeYS zH*RJi3hgEf4(GtW8~-THzKhird$M@HLF!hRfpyx}$$gLZ@M6d_LG^s=3toPfVro?b z$jMP0$*+Z9VOC*Dhv{g2jHaOgKavC!;I`5h0}+w=_>1CJHJ_EV)?1&6D+jI_D|Jn+i_+=($) zhV=47(Si#JacvA3+0Qr84xS^Hzicbt7?ip-u-%XQRI~d?XRDZGR)S?a?-BLGu+YO% z4D-Sey>>|$(iq)V9CcDL%2Iw$1}?^)sLtrYL9IbhVtBDvX%1t-@}Yk-ch-zN&lwRThtFzG6;tDa%Wbor?W7XDZgjC zcG{c$H6^a=3A{e@#p!N|qpOz)6~jb)a@C17=cX1ac$=0zw}-3Ru^-uAG=f>@7(xaTieEM;L)}gcrQd@ zN*41|GRhuBjio!92PNyRz*BYXRkUu(?IeTNF=_U*8_wSjM96a+d1QUP8@T*ZuXHvF ze%WJe^V)J=DxQxL(WlCn6_Z*vj;cN?6_n1J*=SV&H_|a%OCN3P_yjV*XxDWE79SNl zKg1GN)u$*H7q0TVcs|BxzHCgE zuWN$pLnPJD)N%a(8I!hIs)xI_jQ)PIEb)G7V7dC( z} z2qu#2BYpJlV&I$H zJRfMqe!+tn0n9TLbI)uobr+||LPL)@%Ubaqc18x(R#oM}yJ`MSEN*dHSpy}M-i^!zNRV!cVhCi|K6{zhhWW~0MKz}v9N_2|eC@Rx67 zeP%R>TBvOyzNT+1yoo=%#BkG+*ez^F`QDA5&9P%NUL&w zht5x_n&}mLv^C{*L{usI{f0NA^G(WxmATA8_`X_&h5w$bKMb*&Rz|D>)5q>T42xhj zTaQ%Ms3dz>$Di|EulKd;p!kw^LeHy)(S}73{D`z75TmVI;Zgy?&X*`tTt8^*?)Sc)D9R7ltE)gX@DbNx$7UHl7)yP;(}PRiy)E z#8rA$UxeV`WIwi<#{c;$OVwutM(|5}og3yg`r789b2Y}dB5ZHVFO9ZAnXl(SJ8CyjaQj*uN6Zw#S-D3e6BlvO4J&TyU7OICIz`J z$#AJdd5raH+gB6V?sv+VcE|kMWYRvwb09`7ZORBo_L?hd_Q!_~N#umeRpf5Rxff~- zI(o*7L%FB4m>YQD=NL5}xWIN6H5Hk6=8t12fme-zePua&gP1F$y|)_E&1SlY3!iNS zjj)xr#It9rO1N=5`WWSn6YBo<$$G>+RfhU+0xdP;sCS**?O{FIfA3Cx48i5B=mBr_Lr|oWxwV1woF4?!)b-9xwc1rJl+Dg{sgYOUI ze|xSgySA$!1~x7#h-UQ2sfF$WYf=sQXMyAOgVkSjB(8^rSA5EA%FI}?k#Tw3EH@E- zb=T`tJX^3z?agADPa`2C>uVs6&9^$uY2U_+`v&W6mPsvC=6vBMN27@h^g)$kN0Vc= zHhx5b6Fv}5`9W&9(Azg@3H}Ps*Q^>??a|tv}u5k>~sUfO?hJ$w8sJ5sm_>>eH2-}=?k`MIXD&k?N~8YrVr7Pe+Oy+=Qyq-{;(Woj zNokb&h{LXQ0j=T6HPgGC8;)PrMAV6v7(u(Xx38&oRm5VS-U^RGp*NJ1FLNa0UYm5tSu%LDttAZIQ$5`}bORVS9 zjM;3-Wy>MNe~6ha$UQ1(esPb_^@D5S*BBEEm~!@mCvNUK)e~47ocJC>=YE!ddZb*X zwfIh&<90iH%tQQzli;K-r2x2JnV~o+NExJegeqHL3P44Bs6SR z4_yVWxZ3@dU}aL?O!l$8eh%8-A}Fav*nO-4YW46XTBWU(sH0}A&L-)M*`ohMwbWbr z>!ko~?oUlqiy_n$Mio^J2-n#p#f116+RccPdefg9QeC3^pRF``r3k-Nb2yuX9Vslf zhGX(&`sZrO-pi(N`ZP~X7r*c;V`k0Tv!@Tf(JF_~X|X`Vx?(75>#}>;YGu9s{Gsxf zej{3I2|`X68NXZEPS37CvbFvw(D00~Z?Tv_Qe<8{p`9X17j4sD9k$xvkZr*hXway9 z&-3P9kN?ZlbjX^*$D^v|H@2m|^t9yio@{ z-e3U_B&kY{Dhre-Nm^ezEop3hOmXa|ac4l}RH$Rn^6pn4;&Az(pLM0>^+H15PFy>z zwo(lFKvim_mc8}*yy$+kRCuoO*h;9`mF-GL%1d9Y9!EX!PtUWMo81PLCQ&lF>LJr! zcR@{d!gNQD6g@5aS`##IBO_JE{!Ugr#lcUUQe0Tsyvfqxg{07@1V#MG9 zP`kf8%R;UdV3D9!;mQV;9UEf)08u@32D(>ZeHcDall&U0{%#58 z-pz68uQ1)w;O8Dr*;Zqsm3#&%>LW5KZ0-cVAHNbV{26uwxDANxCgI?wrrp#}7KF)LfJ!=+}si?5`7F?^S2NGr-v! zgJ{4qWgc2TVMWf{;l6Q_ENYEPfkK6rzp!02imd2pS zfcin@?b!M9RPyl2@3(Vq>>mCsgoOlDrhj`xT>@T61;G1k)|%s)Kd2uo8~vx7XmAj{ z+eNm4NN#oH{OpIB&L;0Gq!jK{*ixSkT;n}ALD_5`y^C2u4>2t=gPz&L-XRU^!Jf zRW{s#C`9`0sYY`2_qWZPhk+=S*{y^{cx<&tj8Ixv8-IICOM7$b0=&K?+rs6yCOb>Z zJHia+ATNzLqKCKo<>nDRz7Ol$xG>rFr`qmp%=dj-7{dxNZIk>p!@;@C$)6e|SWm(| zBzR^zI4EK%eX!DJB{-6(+vt?pgf>oa(Og3lH~c@`y?G#%?b|;*qJ%Qao@FYe2#Kk$TNckddwj;Mq5&d1)u6MLn=-|%Q(8jo% z*Qzt5VscN(UUmztwsrB5UAn5j>Fx!uwR8W(NnYa6M?;q99H_g~_aaCJ0*j)m;BTEI zgX0KWlYT{CJ#R6t&Yd4=rkgyUFV6hX$6ofo=POH$t7T%eoI00$aD^rjLShZAmDaP% z)Pd*O(3A&Ce)+Ka29;AV_14qh8I)M|REL z-|EdVpHMt+mkjUsXwV3qw9Q$)cyyc%n8_zd}W>wXqx{?{)LpDH~*~dS2M{Z7WwR5p{I*$fHzTEwMhuX7t%e zzh>w+NKLL+6qd*6#2=^WO+&*}&sATUxY5y?xN>ST-C|2eB6#Ieqp1Q4Q_yOE5cz-t72L%&Zkq(=TD$E#=6CwjyE2gKcOc4 zbc^>gY5)Qv&Q!yWo00BCKqD-c)<(9`nZSgq+|PO}}2Dwnqp~ z+nvgG%gxvEJj|0{tS|d8tL%%T`NUa(aC1$dO+r&zRJZGdhkuQQR}-vV9vKZZ3Q~ze$t%=@9+H$|o{Ijv0BskWg(vVQprJ zQ`Y_vI)V9}EYc0K^HM;1h@-D>9=r33_C@_9|C!RSqoN@Cm*R5t(+SHNLJRD~LM;pV zNLfArfRDab;>+WCn|a{^yyAi2xpHiK{LGUJXM`U;5`OgxFHr0fjxT~mlwd|WT1L;6 zk?5Bvn!ij8|9CUGc)8a?!yZ1 z`K`LoEG*HOw(q|lh<+4}Q~_=FCle7V=}E4{@60MQ6`Rl?EVm*q99kq9gc4g=_8hySn2lJYNu@~#b4!3;pdg}iI{QjPAH?6p|5%w-}iC_(*4!x z&&zoHmNp@;u^V@`VF$uAAmGYey-}n5PX`mB8|U*F$|#d#*p{GH{Dz4pKw&RJ86Qi0 zwl)X+_;Z``A=#qSExxgdn&^E|?)ZVTUDFX1(L#R_79IQXU4PN%CG8|Mf{KlMM*XA)lrCC6 z2AKN(q86i40Oc6k4aYtGR?KzGs8>tcdSa<%Vwe4VTFUqVXK}N$qs%ofgT1XQ`-XtS zE}LPnF;7GPLm`mZ92m#>icc8`DKAK}M*5NwJGed^RiYb0z71mwib7AH9V!F^Cvpq! z6E>lJXU#GK;)xL42-KPE?E1dovb8tb_)jI+ug%>@|5*w4RsJ+((ctSEk0xNrF-|qX#$f!h;wF2QI&9${CQ4Na7MQB#9*N$H7p?@FL9 z!YjEiHl|=+gOd}@zE`D1UT&N20B{ZF(Y%P}`c@|@n#R;~rdN}B^bQXjE?+$6W?2j~ zFEe@635fLrvoyuKQwuJ;2P=+Q^Oi!NlE&{|R*&7ipzZ#ul7?m;{g(HrsQ+n7d!|;jAP*Zv z_>{kzP<1oIX!S4<*>}FdrQYVQqSChvwLArbdHUMZk33T7m&`l=NZXsHeV)nTKUAq7 zDIq~f>6vvV8>(eX?WrD`^>kJ9m{-Qqj_deX=VFD(?H}qv;XyxU%?z|aCzTjoopl@Y7BwR`Iz`Tl-AU_swd&YScXCpwPuj8&nZa6~J}D{P9JRae&}~J$U*L zNKi_wPrd^^O8siuyEQh}d2g++PiWrmK#^=ca`){e`>_+&v*)qCOvPr~g>}&_U_$0E zD`HsnnQ5#rLTbGcB}ZmNli)`dm^86DqY^(kueTTIusjvLzQhTB4x+wAPklgtFWROG zD|wCq*`1WKDDYk2<8J&LG);hfFQao2Y1P|!#$8o*2 zS@G%iZ%|mj)gqArb6SD~Vwq}r8QoBh67Uh^8FCrztc_6Z;L}0bZ$NODk5li+j69#H zzkB(|jC}pc)#GKqet=@JkNzr%`d^_!^l&%(d7LM&LXzB$81$E^w255uJAiZ=jEXg( zi+0iuED*7E_>$d*F%i~=XvdvCnmUEXR~F_eaMv!gEQUllmM5I?J%ru+B5NCd3zwX3 zFSxrHltf3+9WgwY&!$I$bJVDeE`54$*q! zbLeY{C0k3jpXCqF8+g%$g3udtw(O_zMsV{G0q$?_Z zLXh+6(L*sP{KvMoMx}ct`{%@(KbmG(gunchEg|b*vzd7c-g%%_I$-R~$qy&$^9$AK zOUlB1WiVZ^5#m&BFh!DaRMLKm7pNm0MC#h-6q^}c`*Iui=CgdDTRZbJr9fh&{IByW zElwRMVN04J{VUWSKgvuR%Kf}_6{TEEeM&q|lgrRO5$WwBR(yGB?8MvA{&AHEAKPQ$ z+C#ki#H9SbazplI+s+J-n*m*70+t|)<7sIz^=hD08 z+{OZ&@mJl6u>mQ%^Mczmyu>7GIpzH?Z64t(MuW|heMZlFUmK5(E>9FmJv@BJHO4|3 z#a}judW6VXujd9rSRwS&PTwZg%t&?lOve)rW_-1ZcqIv%xjM(~mH>R1(9W4szkq*3@?ZK;`%7(DPI5pxA4ZLwlXCRP5Z*>~!ncxJMS# z&S^ZuL+kv&yX^%)i{K$B`xcDbK~*+GqBZ!6h|i2kU-8$H+p$`ff#QjiXW4!}a~Jpb zFg$ag^N3Ql@3b0TfW}FY3k1B$OvCYS4{NYH5fSCyFJfTvH;-OCRNE3Iy=}BN8xSGS zIQ@viQy_?Rti99cHV?OuPu9|?@XjyMzu>m$tCam=ATcJ!^bRqYu!KA~;8hw$KN(B5 znY?_2cAsU~@{){mhBh&8_#{Q=-^ zIsg9|z?m*VG-ZPI&KL8 zi2InfP)Ar!lAaNDiGBPzB+2BVj??6_p2NCJ9c@#SJa+MCPJ5v8U(!k+b=f&yJY2F?{gob}ZBNOa+E&wvn#{a6IoD@5t!vAC*S1>W!U5`9nX~6w$qx^!N?Zd ztYl}zoZ%L#Dvvpb&;>%mI?S6Q($rwxoJia1v4|-VM`X8&acW|EW7rZ(i#ef z-0gw)i(O{3axNczdDk^p>E2Os$OL30cFHqkW&S`Ap*JlPkCO|1)@NkydEDqWt;pL; zJx_gurET=n?4#V68;4n9WBfWF-_JQD+XEWaMrlgW%3 z-(Z@rL}3m72VLpR^fx{Oy^-me+SRo`sz2g1{r{+c`j3}_VMU$r(;ZT(5_@ue*3+60 zhmP~2<%_y2tf7eAo!4YYK&?2K)!ND+8}ZiGTvkRVFxputZc`wN`NR*y*vQ+UZ0HG8 zU!^u4xLmU!b@i6qneZ6e=e-NvfGNf>AT&!^4i zs!t?5acdtAd!M?O=m*J9u^+Zic%cA!QgEmDUG37(U2M=kYiO$c(&*s!WG<=Z2E5HMk{n|m)Wkm%u{p{4>GvsDvWx&Hn39l}^ zWMa6aJ7x9;F~5^aPeBQN!;%w`PpRn7odRm9u@574t2`nv|Mb~6+x&HaLf79Y!A4Z( ztv9R(TLce9lS|v-Wr^VzZ7T?NHcBZ>x3xK01=}RWc=uwbpe)ofl1_7tbUlNk_X?N? zk!w_O!hFPBEdER=5I zPQYrSYAks%B=jDXcnUqDL0)HkSRO2Z%_~L1HY{eKtKEP+)+zQksIm$8q|%~uQ$7Of z{!xRMKnB5Z(3?#>Fzoyn&4q@r^PiPEocw|JDr|=jg`NLeTt2%7jH}4usxyg`rvjN8 zaU4K67j!pa_fZ4V{UQH!bR-S1)nUY$kYD%PXb$QCz>+YY%A`jE<1fB5!x?Dk^rCkx zHo>9*CH#Q;2hErM8?^sqaJj$Ra0^C{PjRIklcW2h_pJi4Mua+py;GX%07$$3?l;Jg z&Q}{Qau_*J=4NPPFwmX*Pkw_2&|0`O*6XlEr4ana-6`nuI3VUniYn3Pt^)~@k)-MW z%mMw=&pL`ge~mNU&n+%IJTlc=nykh4(3Bf~Zq$>f;fH>4u;YMH$u7skXW;A%5C+zj zti>nNwBGljhR66MFu?u)T>Zw}ExT>Z)h$C1;GIug5A$?@ryq!XiyWU}zOpFyR450a z>&+F*huyiLhSwl0fI11<3coYCL}*ZTZyUPcnY3r8MK6R~@@w_D^}^I!!O`+6{ErQ^O%z{<9t z%>exJazSxf-RAD@T9lirs4{M3t5?h+a$%U8;S;IlZP4W64`F9WI<7+^ss+=QcGYf2 zQd@snH}}6!(Z~lgZ{!0Fupf4IL_5t!jyx-`xUOvsms8lN+}r^&n*FnplZ0zMa1%?n z(S}fv$aN6bwi)I4N7kW)7|xK;@tZOLJNX16w9>o2F04lAx0<|gpT(^0YWSEfg|ykhL>Z7m8)m)zMpd2>_0UmR>TXaVSesXX&dGHJf|&d5ro=RdU{eShY{MAzAc1 zrA~v)I;V@%*E%<I9Y*Wm$@>XzgU=KH9USs zBvkpzGK!z7;Oi*<0v>otjMb5K&*UU(9pSzcMD-#m8*WYLUqkZh508Sc=^nIVs$I88 zHMRzn_z1sK#r)CAn%mUnDGc+Hs=HR1kFD_hmF@MQF9Uf~Z!OGqtvpHon%kuV@UNis zTuZLId1qH&%#vz-drCN(BQ@4rhiZ&Q=XGY3lk$wa99HzhIav{+^Ezp4mWBYuOtqX2Sl$6op0OQ8O(+~ z+y8PdQ@F<>x`uzwfzkEeE0l4r)FJhlZKfV(&u%XW(J;{7y^bB^0Q@P-_(G6~ zykf|2kYm{L3hKo3s{!ur8LspZ@!uel6VV|Re6fTqv04eTD^y-9#8b_5ZKn@%Eq`Qq zl|2gQWG-MlsoX!$bi~aKYGH9c74R3p%juGpv-r~~*E<52+M{%`fSR%Yrb*P-g4T1% zciog(Yc9NCZMXS<+!+}Cr#E{?a@m98Pl-Zju?S!60h*BOgu5H1n$m#pf(d8xwv;!^ zXo{d$2YU`)e7V}tdjHD@)=03JSmeN?eMmcAvX8K^v#Fs`b~4Nga&ylxXaOyCXyML< zmww=1+ThQ$ERN6TGwQdXaRQnl8>zCdfwOxU5B@mSzw-a&lyqX$Ie&n#0RLAO1IlvJ z0K};~#SXlMq+J+1Itvk`Mq$v@6e4z+MwkB6Ir@|_5CElNNhk6D^H%>KW2m1&1ViWsME)$(T`G>z%@CRyaUIJ$uk`ct+gyUYf``y2rbX|7jyY=Yy z;{d{F1vu2=NDT=as3}7x2GjK90%?8vC{vkvkK1Xk;PMpQMLrGC;k)2WSI8$!yPj)_0b zZakF93MeDO7J{;cg$Z-^jnJ^kW8_R4j|*v;cB%Kt5E2ZiEkqp{Ld9@Cgjhi(A+>)! ze|zGd?5oQ+olD=T;p8sDcav*f@YM>yAF?5;tSE1iQ=LvMDWUj*1b2bw&zom;;6A6{ zOs8_T^J$;xKB2~OSf)6tF2JpKk&ZUAc#XYS0VC2q*CL7Py@qUD@hXzc(LpH*i`4$O z0JqC*YZngLE~K-ZbRBq=kqSV?`%M3zyv{sIbw2GL>Cg>mTcto$JqEiFC1?gyFEZcYI3UdVPIvYML0I;Kf|; z<>)C8b797{WX9vsP3a4du1^I8)#K(^cWUXMG*1ILMJV1G&51-%xm~jyiJWWOw(iph z%}2EQWRJ?oe(((19IN#Hbn_*}*+^IW2@_pQTH4;}NPT@hU;s9DR}ui3iQG;mJ^rG) z_jKbCpzy*ke)4?Jv8s$d+|`YgJZ}2J>_SKDv2VHCphu0TXMqyhf9S#Vz$oN24`?PI z-MyU+m}W2~q~4BV-@<_xGN)aq%m)Je?m5EUig#MpSEf^h9G&e#qdn~vjvV(=l4?91 zzQsF>=VkCAKGoq1cbl+6fU6ZoNsT|>XAK5Y11)N~GE83_^HwLH9)lL{8TDpqj^GM& z+fW)0Vb6iBB-wHta;KvB>J@jXlnc`aS*6Y@=&eum8q3j z!3#sU*O@A9&&SUaiO;&il*6J6je7RF8C(z^4~UTFxwz%n%mphtlw@AlqP)#IgrQzj z2XZi4IFdbsV@r-5XOr*{5*jv2L10Hy4G#NUFhq$okf%DUY}TIWfMl>4@h( zI|yH$DNpHT2rYkkNQzE>IG$bf!_>hJw528_B2A;UJf#`jGfpCN${Xmc*xKQA+WnH8 z3}YfPUjcEo?B+R}Hnj1=n zeFj>L{cTqQqj0!4;J4VR$-hBwh}OVuQH4(bmr>670*l`P+#nrbzwj>ZGEG5v*_dDv zc<%d=Zi;jcXb4Tuhpw#|*H48u^dQvg+P+-RUh?TZfKSX4_M_gd@^f2Tb$BY^--iZW z?ml-Y>re%TYMH_dY%#N@b=uYa_1~Z~y?@Pw?LWqK*F(XGF$qP)@#Fv6w<~9T&KSBE0%=|h{>P3 zIy>gWXTp&iEve3J6LnKF6Pq!A)}IqZy>Ha03OEb|g})c+H$8A)w;w*=CA;%?fkj>& zQ*1b)3;$nH%K7ks$eNm5`dRWWLpO<)?i&J>W(BwW237x10;3WZ4cmEEI}WR~7~D*9 zrBYxgP-C@<^c+nARF?}yXvejfoKgZ$YZk9P*N59Otr|F74x)cOcAGc;l5pj!Bn#K2 zQ+W1jG2kvp(zB7il#Xk?nqrLJWiqCYU+H<}WJx;WRQsIed4+g~89n=ikCCj(^ODN- z2MS4y_lygSZs0_Q(t>v5AK-xA(wfEABwgJ1s9y=jsu zjZ_82YsL5AIsy^y1cMEBft0F=rjc8b7x9+=-npzp{UwY)evV1cyS77Vp&x zBK7-Fl8dGBl-8@6qJm|&MMGj>Nh?aNuFvoa{Y~Ez1WHAQNZuc!3NtvFimEM6RK~1k=t=j2N*P=&ZEZCXu|!O;kj7d2n|jP*hr8i*(9Vv z2uRQzv{dp1xsrc_^oKmw!NZ6#T|e7VY;ya;CnEL#IKm|yfP90#fp1eLSBu(Ds zd+W;EOzOV43@=I7dm0znSI?!|B4vTV?6AFv z87IBHG>vL?H+Cg|Hj1kp!}FqTop7g+uP9yk3`?5updv=-`Kw*RZptO{>d(=k0J#yF zZ~5pV99;JFNAaPZ0*v%ej8i;(<*1gV|kXZW(hcLKH@Oby*%5iDK zqOi60CGPhrf?Vp(wapJtSd4VKGlY7IyEzctx5<+jN4`&A7EQT^7k9E&Opl(qF6;yo>E-rjxlP!YuHjhtWXuBdS3{vN_8YEx_kT=33q6?%bepZ06r3S^PQ4pd zZc{Ss!vWXqmx9Nxe#e z4P9R>%fAAdOjN|IPjB=xECC2#fX(nGxmF1Im5lzGD z(A4qMI65~v975&zL#ylu8AE{g=nxtk`XjnYk%Zsp2O^+)H=y2Rt5Iwy9AiNPEKtY? z8gTVrTqr@mK}`QVBg|?wD~*9+u;70}NvB+4bdDUr0#%@+_a8?uYwP5p>;aV0!8irz zr(16D}1e=3Ujw|CB!GmbB6+rh~`mvoRHiQQd$Mi1% zs-PD>(H{K<)mh5{xn}?k{e6-LE=<2cPyh)9$ZdkDZ<5S@gKjM0sj{$H)W@g)w%GVB zea0p9lq|sOwQZsQVV?9dAXLQy)2;ik7ec#v4}dkFJz+F{xee&u%Nh1d-N07$7d2buXCmc&-TG9r-@f)e^AMPGX?D~Fu#1u36 z_QRWT6M@o={YtbOEC;Hqluu%66UiRwMDRCaF~HJkUO>2(Kv<}`cL_2iQ0J-mFkj^S zq1)+uJ!IDk?U$}eW~F13&GKi24=GC-h|#7P+BN4pbtU;dkgv`L-{Dn}YK`0Rr4er4 z2)jGmHz@dT^)CPF4*j=&JP-|3KLk>Y9!cAA!;o-q)#dW2*oK|Nnv#^lO10LVTxCgH zf#j1na%IKk&oy);PtAwf*L9D^PD!qEe0hfphMrKA@iLNUll9O|8hai;3@S^2%Zi_I z51ited82U`QnKFonF3VBf1p&=<#LQq5UKZ;oQ~dqS~F4k?$cw;{^~JLn(@QuN~6v= zc$TBt2a8vkaH&owcl!&G4pz3uBJr2Mw_In%JO?rMc9~OrJa_UrNcN5RBQz_j2uUsk zrO_v|O=Me+|2n!q^k6pdy1AHh_SvfhUH&+`V@J>8+3`=%qmm4ElYFZCjj95wT{aR$ zHIwEo8$?=q@+GL<$~XLZDyi$uBlalsKKD2=VYBtxx9-_Qgn>cT;1*^@-_(J39nk2P zTm-7N+*AxMfgr4DkL*PbgU}aGwIonJG1!3Jd)T0?x<7&tiaeaH;P<}bf)gnjg6`y) zg6m}!vbA0~*T)nAIJ|!Q21po#l{yIYarPp)G}51FST>#-%t{pGKy6Hfbck~wOD=2~ zF%_JOOn;OD-uXoTMB_d%Ky{4b8!>{ZrO5#mJ=-69G+JVPa&CE@2pUVyuVCu^`0}J0DGv37EL1SYf#0ckOf%(X8-C$5)j{M{G12T|S2K zFz;i#biaJx5^>TdR71Wl@AGBa=Po416?>T~4aKrOE)UZp3Z+G|7e-xQ#~ODHpPmER3W^O1?|SaBGj`4y?=;Mq5q0d$tZDhtt51MX%8isp|UYjm7XU) zIjL7L;@_klVW%Q3swIzw#>glaX@_dw_G;Nqge ztK-m(LLh4VV;Y9|5wtvm*PX$`2e>G$KaJV~gqEB3_X85Rx4%L2bSRA-O$$Xk1Mnv9 z{qCRBh+uT=VaT~ya%u@|U-n-%_8Jh+T0{PRgd&3kCIMXpjI1$WhHoBtfob0||C|Mn z%bzz5K##$P0T0#d^)F|{3M6{~oBU75{>v?cjFqE**=hVao3uago76n*yo?#+-JkBc z2fAmb^S9si?0L}L`#@(<{2mu$q7ev}FNB=lZWZ%KEP=~1KQB3^28f#b*9ie;QJSVh zluSv;CI0QQm2We{K3?DEw;V}&?y3X%u@>!UT12q$I=Jtm zSDhx(kTMm>i8_5lhrtb0UGp9H#x}x2`0$*H#1qZnx9T@Zxf5Ow83O|)A`TXBe|@wV z8}&b2%+iR&hEqUwNJbL1JoP;pU+O@2xZqToRWH+8*%z*l>QteN|@(bdsDhn_R~ za1H*&L+Z2#zu>)N&Zz4p4XyiNZKnmxg137n6n+Mq9yxNp8Bb1RbTh6{h%3`G!%d?clS86KNq2$#BY8+ zr^tWU|JTH7W((^&Se(&O#AIdm4s{x#S6`VK^i5qSrzB!N%yXbuQ6Q}({#8{q!Y)ZC zG_Dl);aI-)_b~o=L7t&hqzu`M!5(sO8F^>ma}N#nZ3%x^{n0}$%?~qr?k+5D;cJIh zxVi2lCgfkIXxfz1!Tp|ag@-*dSKyNO3kMZDvR=m%;@vOybcLjeWuFOHxqf9D3nWaQ zx%i_+6&G!(ndFX!NvZ0m8-xc}0pmYl3-Zt_FKtf?Xra0Oz;*lGWUy6HT&BL_JxS^nQAm4OSgHelMo4iJ# zDe7bu@QayLFQ$~?qNl>%-%kW>yn=YrPS8v6&v2N6u`wzu=}icLNLZ+?A=~kc?tvi4 z^uuRjonk|0m)GywN7MeuLOo@)WBI;fjlYvU01H-qzkBX$?o>j2GfPlZ%RsKB=WN{D zhrdAxPh67F6pY4`xnminPd1wo#T@8Uj|`xe8$}hL$i23u@^qg+^WY_)bjif1CI~lT z-L6~TCZctzuwc5igD{%-2&MZ+wPGe39umtDZr<%X0~l&?YOI~Mncl6iksiM||rYNW*3bS#WEKrI4tk%d&Q(F`Jn z!HFQYK#P>Zwx~}lF{XW@ik_pc zMSiAlqy`T4dG^62S2n@@b<9q?U!4IMT5S?-Ex`F;^~YX-=GSj|yZ4-^CDad;nVE~| zGF0@8G&qtU&x3TDx>2bUT6=slH`sYJ@Xg+ zE8dQJ1r>3HBXsRsuZqLmu@ zy(-PXHDj#8IJ{Lh+g|wH*7+4_scjKeqnL$+1v_QAyqT=~zIO}_fX0#(C6Zhdj1PcX z-MN6iw`O)%wIy}eKq}&8Hb<4*?IjnR)e9v}1ElCR=$>y#^Dh@)GrV$=nQc zM`zK`bJqF~n(nl<={POzn?GmhJX3k3mXeUpdZlp~F*(Z6f6`kV@ub77pk(utLCR^- zTR%Ev$H_D$zGzXj}JOwz9aOKVY2e(M3;K6HR+c? zCJ-UW9JeF4E-lFC~*U8GLpX6utf?QZ)>t=bSE_&RpCE2Whzn{Uj^dNiX zSBE6wYbEl-Or|xY&#bdW$4`=Y693F2~vO<6YNS#UBx-*U#v(1TCoTGUB#&SE5OJ z5z@^J$^MhtT#}(2+6oOJrDbl=^{=*6!lE#9f@!ku{rCBK=q85dzVXY*Bk}B!aP7ok zohyQhF?0G#xRg+azsGWOWue*en8vfkPF>Y(C>M35=fBEM2JtQgWuQ{fCprEP_$d~* zERWG^Dy)GDW5SUn{6}yQmV8eL8xASmUG<)_q~F-AXNZtxKYM>g*xzTrrH_{B*YJ0x zy?o~ZK8yKyu{S!<6raVifP$Crh&OKj-MNPvc|{S6?OB zZ=jc zGVQ0+DJ_xSj2|4U_761Z;0f_!?`qt?d5@`EQY^`ngogl~O<>=nsr6GGI1HL?3rNTF zDLQE}Ci`B*&Qo~PADy>jj;{z1NPnmI&-*8eVf6ch<;iEl~|)wwZBV)z-)!xPNL_2=iQi_1+hMLixC_ zA?CR!&ykvznbB}x+WBR?a`CBrg*W+p{Bl#UZE889XJVc)+ z5P0{nlvol5Q!7F9BI`7{9CEagB=bd2_hwR!8!Ui^c}Nj&I}z+#q>lITG1zAcR$qBB zg=4^ZE0<^R;`Zt@(ozdSFZ$y282nw34!ic`r`u*hgKw{d4xmSi+oF!y9&X_ez2n@Yr&; zB%G%$q1q5fb!wPo8AM*6k+Hwkqb}pbrW(vBa2Mu_YH7M~x$Vr+EM4Zg(@z5?Yh|c| zfZLv>zeinp7jXy8)I0?_+0OB`Vk*;G)rdIhU}C{`*(W}y3-iY}EF#dT2>my#as+cf;l1%02C$tNb1d@wp$KtJ>lwU+_$Tq0oXhpdBY20a65b zc52?r*M1@MJ{eEGqW9R#!`UVZ<@MkjRM6Km_Sj-Y>g)DlW&$@@EArSSaw@Wu{rzA^c@c zKnhiV0idE0tqdSC16o3+Xws9AzDF$j)~^koD=#*clsr+KtM0vcQ1#kGggX_d46w2U z27ADP)L{c5ssa!ntv7zUSDEsrlm4xM^YxyCEC*9Z(U?Ivcv4hX3!Ask{~9SbU1i80 zf|Q?L2RDXGIVO6TE~Rq&0}p@P_lXTiT)Z(Gb7Q?l$qN?*1Th%ud8K;Xs1E4`jB`a1 zFNEMGVWY*mr<1*Oqu$G(@pg3;UD(MI_*rXw@)}2M*g@Mv;eh%zwVp#5*DxxE!4A3& zxC{sC4AHO`zqM`$b0#!F$@d|9+L%b_ibNWEak9O96TEAY6233W{i^FFeg-p#X_)Ca z1+>B)3S+o0F*fOluf;a+HrUUnCLQu#98F2qx?xbVa&$X7x zWZx~EfmF*k@n09#2qa_(Kbf}qO@saA2dUuOoyDWC%xV(ND*FrO67eA=pZvI+QzQx7 z%5ql(Jw6n_QB!mv1u*j|tBjAd+61X%@09MFguFwYwO*VQb6k^Aq@V5mCSx&8GDv1k z(Bug(oEIw8$=CAP-j1tb#JM`61>;8%?U(6&OFsEJ16vv`PCu)yr=6OedW0 zNW5oMy;t!qeI+T@LgPcW@ARj7fUrhoMNQUh>E&7J9NW;X$uKNCUcTYp)=eeol1ShN z%*pSkaXVJD`AFLrsMDL6=W~i^W_>uBsN0us(=fE?X*ZD0x6~}QxA`keSslc$QL~x2 zCDh^ML_fFGwTL`$%9@ZcxHR4S=IF(v;`>oL&eB05Mz7^3C+;ye7JI!{{Gi9}M#8CX z=BTqV?>u5G7Ba-?LuFPqUg|D)dXUdiZ07fBH9xJu)7kiXJrEx+KD!vYyVlJdPD&$h zS9`r99~dO3KeQ)r4>&XZDrdhf2ojD2pR0-USiX%^PPBT}il3m| zFelR;8xTH2mQNW63}Z~Dfx z+=H=LX`~$C1D-^eKVgH*VMI^Q&}6&hc^>=Z7=TTr~{9|cZ~Dcm#MFlKZ1KgxUlr|)4V&%_*Tn3fc%wlqcw z6`0ClE&A*3@M>rdst=|HKm`=F!;LOI!5q6sCw^05qa-~ z{fMpcJPCp%_nii}nLk9~)9gZ9PlHpJo6$;WvLSjHZ$nS1RkCCZ!is3BZvv*dbG6Vp z^=W~aY51+%r_??MhD#L3!0QeQ+BU+azkmm!!_b|c9`y6|k&aUx!wy6NbtunEYVPfK zzs!N0rAw;FbX24n!(3(9ja|XtZ|3Zp;l>&b+O6TV2LR&0L`GBPhekA{^WY(pqqw}c z_%reYL$;t#H_}@4;ODW*c%BwNA=HWO3Me({_sa1bCqi^jy%Gb+4!NFPlomC zHb(p%K*iZZA(|t7h_LCIGl@A*Nm?U z5GEcNTcBZtmkd0vg7;C#kCNL)ijj)fvO+KMFoiRj>fEuoQ0C?K-~~^MQIkjOOC1Y8 zo-h?jGBjw6gtYksMHn=uwPZivd54ot=E6S|{)}jDAznH&oN)i;E6jCkqvNTx&)y3f zj$8Mc{uHBJgZ?_D37q#m9#F7n`br)6)B<_oK!8PUS46r17C=J?=t{C<(uOf>d|-2T zpOXi_)5TA7rS(!RCu)lg$2Y(lwSj<#kB^|Y?r$G{TEjof`xDW(zYesW&0D(4eWhl# zT4*W`MSj$nSs<97Qehx$X=Q_yB*^4FP9eSWhewKEw45{Sai6UG&JO10^vlO^hl$v| ze`3uyuqWZ<;_J{GGL7S%XeL|UAH1^2yi}>CFEaU3sZFpQb2sYRkL8C94vHT=q)|r4 zh?3DcP!{z(&*_x*=ULkV_Lfw8@fd&$i!dETD&#`mNk0~O-P)KqKO%eOMsMj4QP5>h zox=<(x?iMFmId`qYh&eBys1w_`KRWtU9bzh60tgBHWzwgK=@dsj>ubF;lqo<18JGH z{aa&NW0nlosf{k`JNAX4YCy&^qw3<-DXr8kf%cu4^-cd2qviw^a{O?T*z9Wi&4Ca< z^lVMfciB*=al4PCoS#cwzuKJ0;9a#9z@U8Tw3u1>5kEC(7PzJ1Lo#dgt4f zjyXqbm0gw=6)0;*?0%b%d;ED_!fAAEseQLf?NaR-R}r04ZXfXL=5A_(MPYh{`bs$# z>xIvX`F-NEXRv%@R)|qJr<%|vZ!!CKIi|}fa@+i&OmgPCb7h}evT@5h`?b+&dO|wi z1a5few7Y$@dUM+Uh+0{B`v2A5cZW5#ZTkjMvC#xXnn8*nRYjUW0wUD{2udePFVY00 zg#-&lqzDKiD2VhD5a~4{9fU}i&>~*53Qv_s-e-mUF-R-hJQuzW3)^$(nPl zHOHKD%rSoBHwIOCa^22J6L0|$H(c&68A=}MZ51^W#Sq~33_$gIPO6{zf zdc1T}t@RB2FR4@}Y;@3(gpA#+p(!!d2ess7EsLk}y`+GxzUXpep*ay;J1*a&AZp@1K7w z>?9z!(w7%5&AT=Cbok+Cf}4iBy&c7|F<{KmE<@U|L>D*8vle^Nq~}u6iN(RYt0fue5wS+qfWMdXt+=G}fG9We(|2q2dFc^*mDacF-kc)s&?am&Qd@F7$BMeTm7^OAa^xDYdi|AUxn)I)w4y8X? z|9O+=H#(xlzR%D*7W8mFxA#!BYsoi#3M=!QZ0iN(K}6RB@9#d>Nur`U*zTV={`u3{j1jaHfKT!l zh><=x{iQFSAl$qoTD*B?+N$3^Jy3}uNLb57EF~sh%84wL%M8@1)Gw5 za7y$ZFOAwCmHDsb+vDN?g0Kh;UH-15>Fn^O6vRM&1lbJ3|QX!;w@4~Oup>^SU z4s3xBqd8uM*mejnUcY3<@HWnCd{HQj{;}eBIEHYZ+uy-4xJSy5+t&U8$KWwH*X^(( zr>iT9XCLOrmHo}x7(Ms;^-;aA#9VGG#`-8J#_iv*Px+_HA_QwNjj|bR;5F`@f;+RN zwvXa0fGQ*43N0Fux=gtNn}+oj*?hhII~GiHFB08^{s4A4n)~+z^djc}ty4@S zP|B9>Tl@`^3GvZVml3>j_;fpr=fqj3sdUln-t`&!MoG<92~p|*&pY|<@V}XxXWBVk zg^7?=1Nvt)1z6paSX&A$6z^TWXkadb9b_Wb5{0Er%#D`UTNQ(I`gFesj|Y()Au)WJ}3AdQz%nm zRK$2$V<)v1Ev+rBw1ckREn?g}rX)y?Rgx#MxV)LWG3Cf%pQ zCS^Z|=YHpS{n^Q6jONy;(x)ho)BbgUb!GkSo>#AnNYs9EKg@;uz9|Ft_^fj_U#z*g z7vd2)5u4`Va5N*!!pzb`VWeNg`?y(|L>7bPd;TXyCilxeXq~$kjI?n)5o=Q<(WP~# z7lul!Nl_BKyre8fy@n(gJoaMf>X@8(%ph>(8p6cLjG}B^4_%#d(nLkL$oM_fo2a+U zq>PDns0C#_yjfd5v|+2bA>uD^)H_z0Jm{Q@Qy3qGt#35;+wj*R_h|70&@){uc;#xmfFPah}6!bJdJMPQ9HsIL=1AOVGY-Pf8d3 zf%D$uo=?cp?*{A|If1A{aSQLAD!G{3hEX}SsoQf?Q|wfqPIkFX15Rx@J<&5j(wy-`&T@`UW)i#10s3CMlOJ^a63x2KQrbY9fmo%9JR@FZsPB87J6} z3GVm8H$2be;LO9*W;-{-GbA6?4>vRx8Vi2W%xL(|U_E(MN1ptUqDYl?S6Z2|i2N8S zp;PH~=xG?}35azGmWS8Yfw4>p6_&e>Y(pdI3F#sWwO{hyJaD~8QTDlW(=B^cBE+I8 zZ)NEl$wKy|`8=3tC%;B)54d^f3@_(#+VG+JYcx)}-oKNd8~T^uT$qGDXo2AM6mvw+ z)Ja+)(ji9kYq|*g3YJ#mmT_vWJ1u9RgwTSlJ~<;5pBQe%9)8b(%0hb$Qsj=6Hbi18u`Uyq~2kH$_^|&O)BD@Uh0?_gJC}Q2cbhyr%g?4G?-H4$ z-QKy@G5VYw!i-db;%~#o?e3Bu5-tNlsMyi{R7jNU{AYaI9*R9|_vY+*ok5wK{2d&S z>r1p-Xt4>;M6%c|$xF)y`RyUgj58VIm_6Bkr0eupCnl@SAqNh_@5(BM5lz3LzEUuD zD#UFo+5mF6hWSIzFj^WY?SrmDRO4B3CK+E!I}S=4)MoDwXAkbCp`0$G!-(Lk#mR|) zrU9vlhmJ#~?h17L7V?6|--w3nnf|~5*_$wWBLa$Sz6G4+H~`1FKkQr+$8tSg%6Tu; z4SO#EPCs7}4H8hNj2eFYwja>m+^sFnxW~-G(5I)Q+#!bFFgSJgy$?`A1WG+k*;_XN zlic)aX-zV&vkl&P>caRZWdSoEY)9nh`mP5}+$h>sG>uVLwio>ca?NWh|2!z;Sy}>& z#7s<1P3^mHI=tc{^_OSWjS}=`9(#!&qH#ub0|*xfVZqp4j;HE8btRb&xz5!V;aUD} zc6sCK+Y=KLw}fIjjglRGzU6}w#?CTA4KUC%^by1*!V46DRf!$Hjo*J^jqGpGL;dVh z+x+w)C%pIF8BWy=mz1)z7o_YU5kNthWPd#J8HBG{62Prh@_5Mm9*%=__Znfrw^X;W z;Y`K0T6BqnQ*3rtT#|8bk5@B({yG!F#F(cpxf6SJuJ9+1#94nAwP_Q09J`a>r2&%y z=dr=t1X*14rj0@DxyzC1FFijk7rt6&G~*!C&sCylAHdzj#Bh1B7#ff*OgA0j;yNfL z52mgKVT|W(e4;%zvlNlDP|_fPvcq&BN#Z{MusBSI3Yew5$mLqn7T^No1$e3@*G@#i z))WAQ4%7_!$o3cL{UmV02iUj`XxvZ%05zAT2_Wl2!1xR*p!c7aaA+#0Gm=_bECCpc z=H;>nNwgk?EV=(&tL=qSfweT+tcjH>NP+vT?dBi0!2;*4Du250j?01&%*!)f|Hq!U!k# zo+dVvebWU=v$$i#>Zdk)D%N1l?X1_)DWh~z8i$J9v`6qr^;?mOtXGefG*cVp0%c1JDq!aqZY-7~9^ROGS_(vRd$F~)@8Zi1QM zngbhD*}344h~_{i$(}q{QEmMWVe!kIOpsgeao*amh2I=R^ZSy)IreU;S|#XN%SNG% z65%MrQ*zql4pnciq%3Ol7f1f|d)Vn|#Nzf{xqvM9hztKK%J3D?| zSIlBx*O?`s&#^-FrSXR@d3BaftlUh0@6?}>bKTYZu684*(S5@|Q7Zgy=9$Q8i^jR| z6y$$oJxiDl-5~bxn6ww0@n2HcC6bZp%!nY;FVLO_9#L8{VFP`xs^aG@eA&f*(9TgT z_OXTt9i~rn4;bD_k3cyXWML^Id{!(3k{zOf(NegY&;AOtZ0nU-6hFrBRz z#PV|ha8u7ofJt_;%*Y>UnaG(hvUDM|J8PKlh_W*WWC;09EEkDkznP#G1F3)c3zQMJ z^;-#v+2{s&AUf+2254X>niK{7^9>q+;do&HtnTSTaikl&n1ea-`M8HPe?WDi;3)*K z5VrtQ&|gdf6YWSmlE8`l$7?PMuyhT~1vycHmj8GK9g$$BQE%uDfwnXUqh5X+j$Xd~1C2N5 z{sm&!`O`HFD5dvDpZ`+`{`hsUH2|2#bnIumMB>|Rc!3-a#p}T7*B(X%MEuhY1omIL z{hJhzbv}puAA9?I!$jqcJWZ zK3k1llva$Lm3Svg#_nSGosIbMZ)KKYj9j*_5hfKc|6+FiBW=oG&9aylh09y%Kn!J7 zUX+u81T0xcpftc+EEZnriB+7v5RJmo6oz`{XlDk_FS;d{l|Tkh$5vmyz4i>3Yw;8ulrF>;>Rmi3M2i9i%(LgS(^c#MZJ z`F55df7LZWiFekK@8d`pS=UWbaAs0D_l7B+oU61X`Lb(5qaVB zAmj?^F=t$Bs;|1xbe0oBJFD*Q}o5ccWG5Ol+Cz>8>|4@ZIQ0R(`@^lL!pvo)O2!flP2LxKb+RabodF8}riSIvN^1RF zLhRJSGdWS5dtcOT1K#srbvSm!?A(bNc6IQ$?0Oyn@HzkzdBeF0YgY2ZQ+cy08c1P3 zx0)=r2>?OwyZ{ahrYu2zmUcl&!f~zk1TiWHz)>$hiLG3Eu4?Xmik)L$S|-WE&NK5} z33@9Lh6;OnT|1a~_9JT_8oQ|Ni4C3=vB#?_&atSmW@MeBgEIP>5Y)?bZ<^#Z+6{Sd ztrW07_M`&*K*H7X*p>YS){Es+0 zr-4H7=_7oVtFb5d9uJFFl0MA2nK&LxmmL9t@JxF#eMb;|0T*U4vuUs+Kb3Zx7O z@pa9iDSSjEO=)6u!!wixF6{=C`>lQ4iQrU(!yuW%x8N(6uI zqe9oyg)vgOj_i;h`=nMq5YS3~%sLmV*}zDy@;lAm?xnoMv;tFx`_dAc4k7x3?28DR zvx{+sZpOOym@3vM7ZMZ==n2Lh}TU*q(5A87D95jYtR)+j=VmTFkp)&>Vb0{BwXY$Xl%@aQ(I zUmdgDy(%-JBww0~*|%OHRtdlD#rJ2%coq=Gu#Z0>mZufwefwN3+-NPkz&u1^r|EY} zXQ8xLzzRx#<2<}$Q&hTK$4|BoYA>+Mg=9UcdLp!FnBn}Pyh`AI5O9-w$PrPbySJqf#W>M5&=25zkl$gs7t3K*U9Z2xn)^bvfYxm5}?;s>AX~xb3-}vCZ(5UPlPM%CnvlVdLzjxYUbtD-9tR= z$3@t0*@{L;d1A%BHJ#1q*rwj=Z_rpoQL3MnTy^SqGQ-|*?$Iu~YA>1BTiZUM6$qGB zfI$^K#Rh00(iwev7kP$+Fkp6exmrfLvZNm~usNXePIV+WS+q4f;d%+^gi09~c(q~( ztajrA&VA3{`fhMZ7Z1RgU}EUr=uuBZzkO>7Mqo)1nvDd2H^;)29MWEy*TMgG#Jex| zro(H8lX0^X*PMQk?**4~kz9LPx$AB(*5{17J_&LeDnZ%T+)I!&)RntJJpMYcGyz9| z#qFX=;s$Me7zQe!MlbNz%e-9+kyE{@_y(IN zJbV2?SWOzoBR0t@ZpfESObIUhLb7|U!ak=#pyc+)ZUqFfmh5Hi$@n z#YxLtNl$6wK}BCcuW#TNtY?Ht}Fl z+ zNs1)E3BW{qRT6(u#e@w z>xfl5uF^Q>fMo2n4nfu1@oKEWuI2KOeb1wg!c+5^2Z@4g+B_wI z0_!!9^kyw5Pi*hp?ROkN&3|sHT?~%AWoI9k1WPGVJfsATu^IK1R%x|3Up6#zMWXXU zxO0y4LUlZ1J^s?7GQ)DWw#vL0BFHnrBj(2LRu%<4lWvdVd2EnbTH_&cXGB2LOQ#H@ zNzCaBL9*L~xRkEi@C-{=z<7F>EN%xw zg6f}kmws=dy=OJh|AsnlJZ-1k+`KjBWhxz)I&c-m8oc%BP#(PP^EE~duUjFWMsrctZGdMza=XAAX z{h;bDW?P=%hu%=c=RoZ`D_%DE6`)_~JRcdG^xe?uRlGjv0`X7Q@Vo?mUu$#FA>W79 zDj@ak@9E=5a^^C)%~w)KUzFw!rM6h6j+NL*+WWc)+_7X521?7oG+E9T=Rln&?t0po zez_as9ujw*$13Z#eo+;$n$+&6ED3y3KT@+s%=K5v!P;qdQ_S}q}DoCk0PbcD@S+MTyZiU+xiXI!N(t*jI zShM&1iJtCB`)C6b#LI_Y815h5J^TPSy0WF$H~CYE9PD)91LLGxC^VhJ8+<#PIoc#_ zfR`RvU4jk!rmektRq&!yq*77tPB=ORv^vikqa0rppOw_tfxzDU)H4;_`;B?o;GY-^sg!+9Rb|+f=(A(y}8P|4*QXopnmr5(aGf|^P(8TXZ z3wm}BdJ^!dg@M03Ku^vt2Z?eTSx4ypYp#X=u6ylwb=x(F0!53Z*rGiryeVL$Nx8yU zsV4D1SIahQ@r!lB%rc1qoMEs1o%_5+0vQH{C9Z#=T{hA`yTPD%YJO*sKW>z|CkXzo zxb8v-#wo5V0!Kr+Mp`ODD8REd2pwKY^Lr%E%w!O@IUf~x>9cF{iL5KaG6QYeHd2J9 zOOoWkm(|>TiXL5zYASwvG#{&^j;HX8euOB@99Ku!t}@))B^UC}y@dAe_WJ$UIh`<3 z;m4Ve2*i2&sI?)1-uT!MXNKKTO2o>YTr@CzAnFngaOlpj{^t1lSq_ZBigpZ4*_G^& zTRrP;tTiNTzAk@KPuj!I>qLdeiO+)b;5X^Vs9GU>6ia{&V)!@5UYQd>RxuF6+i;Bd z3k1nUAH@~aEcRyY+!0HQg{=9sHgUr_2N3*-@7T93!7+LbI!8Z^>fCK`Gh(Ra&{^Ob zt1XLsmM>a=?x+utcN~s%Vr5y*DEqL~ytZLGN9L=~tIIGeuRfD_oI0GKob;G<@yq$> zo${%s=ub_7ODT)PX1NV`R7~<+^BYAph0>8xqmm}=L*sfapcL4b#24}UhEjz0$ z+>=x4{2E(ou=e#QHuk~=87pS*g$fs)*oooWb0$DC@If83N&D?50oyHn+GVGbSwi5r z^kVHfH~oj^t;PMVeVXjyBJ=xS$#YRyRV{#`N6&3AS)so=H~mpw%1C7?Nw^OV#qY_o z()$r|q^B(TgUmtg?PI=M^ra7O6qR${cf=d5bbX!|r5sf}31x`%l> zkH?H@gR*o0%pWb3Bq;W@d~ zL!>Mx{OVvcH@E^)GIc!aySaQ=#0wPag2FG5e~0sHgkFohO8c+Neq zg)qZs5QpuCtC%%)R>{u(d+E*OH3J>@f#9Ht zzVItK;uUBSJ5sRbV8i7ZYvGo<8?v4`E6Ltii*`)Sx)$hkaFvo+(+_V;P9rPh0_Co* z>Vog%?p60200^dUQQAq0bIE#%@MX-Yd>(59Lyg1yyYuI={Y%xR3rL3}OU~_E;CU$J zpXDZc8N$8)~A8&<$G@Gnh$HE8G~djt z%u7KN@KV&qwEc~)*CFe;_e=bv7=OeuQu(YdumUrCwoJ1`L|1~31$eCXSPTFX0Q=G9 zuB+_rY~AxkApiII4?8R<7EzlmPD%NFcfIc}x>szu8{c*wed25QUF?o3>Y}v&4#aM- z0ZMS1^X%9V?S&y*Zb7ez!*=l#6j3g&oz%qa73~w32fAQ4 z6(|S9nnK)?(sqtR?i8>;CkEeLNSU zOb_n8J*&KYiIe}m7ySgjI=109#o7#D?&fYmfoHWp%Z^{BmR_mTX^m7;I1FM_@fHd(Iqx9OiHCPn1 ze2bb4;{ul1Y2XmO(!PjxYhVCaE-FiDKHw2_!IiCjedw&tdX4OUK+w6D03G_nfq#l; z{y!*l_g`+KgOVL=yizQu4t@`Wd8?t7uy07p8NXj3ns|TF*Pu|H>v9J>G`D3WmOh{h zQK6n6d3P4uU{MuUKVm-8w_*}hW_g@NjdQdQw^`8ns6>xU=RUSS zBZY9AUhn_8!bl6Qv6K1N#89WTK{fF@%g`spJps2cLKty)a`NqS-=l+dqEg(wp-{C@#%0hFPtn!95}$-X$kb3$bne21X=BMSPNTbm|3avo zTTQNlJkR*fx^`#%_TkXz`IxBVVyeDstCl$px+}D9$T3)6TD6xmqmh9Y> z5dT!q{Oxzf=f88j{olBLy_@qXoT(340c}ZX5{5Gm`TEvaLyg0=8V9!aJQS*p1o|OY zu7rIqsXY>(V(%opV|-^s#^9x=s@$9kk17=BcBl)PeFx$5d1L3H(jl|6pzbxQsODj) zI4x&Ls%^MBIf!FA?+!g{ybv3nu@E4_K zt{r~8ma9Hy7pA3>F;onnd{<`7Gt+WQxp_8?_G8LC{6x;m?*NG0dBj~dhZljyQJf#^ z#)8kdo+u2SIgYleY|9wiX*&QWc;1{0blrUjO4@**z>jinxfX3g9Ieiqt6g}vW@4Iv zY=H!{(8J>*Ge|(aBI=Vkk`v}E@<%@bu((c40-@yC!QUv#UIBjlNZ4wO=c1ZN)V9H2 z{?rddfDUl1WL}66a@H~*Nx%Y3VnA?uX^xesUA=RzS}RbDDz_93U3Mk`fvhkOAm-5F z445)-LIjN&%nrq)eiIQO4ZDooAuy4%EDz!=KQ$!Md3M^tyI0{ifOB!RArR%R_^ZI- zDd+>zbD9x~+JPDfZF>XyE|+`{u=Q$6frHhbI$+uhCIni6IjJ|A)mWp5hah?TW4R4- zZRmr5-&<&}XU9Qb_P1=`oQ-4cL&-V$`qzbm!bCzAo~xwz?wp9t{~B~rCC!`CY7Yd* zLLM8e*eH8almn9cCYqf}NqYkv!g>oWb7{L)wKA?RV80mslke&x!d*(Mp- zHi27)vxJ=fPktObz-u?i4TSL6!T-$zk(Cf|n0Dk}8$oFK^sCO_wG51#YgGRQ+HeI1 zey(mv)9So6Eo|hS9Xj|2I^{hrD+gRst(|M`ou#$G9#Hil)UE4J5v7W z7pV5x>Fld)SBObXD-XYw;69A|j6>J^i(FkluZ~V#7(wkHz2s`qJ3It@_1RamG^@zx zGg1%6c%Ocj0DZLkOod7XkFHjSulJUO9b(@%KH5+Z1Y}#rVXP}7GdId+ScW&*w97Oq z-F9D~JcZY~@;^mA_%H8Q|C{#1^M(FrE=_1_<}0t6I)9pTT@vt{Wri$Xzs0^YDpVfV zLc5efWE;&ix?QXGQ@qVrb%)MH|1F+-o|+F#KO_)VK8BRoy(aM}>ficF{0k!nItv4W zzu&;!aU@f+6BQq^U8?!%mEiw#k6c74aH!H$8FPh~)(N~5U+@b_xj#OC!VT2vU)<5h n)<*#q9Lqi$USV1>Hqtr|Y>t27zylKH{{OxIhra>%*Vz96f|Ep> diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/build-with-forrest-button.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/build-with-forrest-button.jpg deleted file mode 100644 index 2c9cdc25659a98849af0cdbf42ddbe41a43f35ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1620 zcmbV~dod| zRw0xwVzRAkxzw;FV<~Ej+%NOn>2f-I_OIRjKIeVk^S+<=yytVC^TJQzVIaH3#oYx! z;@TrF0E+R;@Q7Gu+=2Ln#H1rf(~o5w&pdI4 zefFn3PJTh*C2r~ED`n-ptJiPT)YjdsZ)j|O(9+6(*!JtA$4`3u`Ujpq6TBP|j{Y$= z{_6F_)bxj$*}3_J#U+ARSptbfATb}6A&GeLKoF293KcEquniL!vsTmeFqY_;d$Iby zq!w-ad-Gpn|76zbWpWhe776kd!Juc}Afd z2JgK#!a%!ke^$QTfKX;hDvY(DUj&0QVSh;PS>Aop{*~cH7z|&D7P)iJS{`|O$OHx# z>M~%ER&aMw=hXLOGPMg2L}>!D2p0l_(Lzh7e8adBf?!f$`*T_R<$zrgB;%;&=X|#S zD)RaKj3Zzf!b&~FJJME1$XFbMR4!DH*fm?6&~c0~CdN{;Jv(LsUv zK*4z+U2&3iufh?E^R}a~U8nP{{0+s&CIK8p7^HTi>i^usX`e33Ug2g4hTqtU&fa5d z$ePl6aiBxF-L>V#(=3AVoPF)$h3xtlH==A~-Ovn@tUp6UIzJIMoNlha(OnC*t;qVc zsb`Z;QO_D{HQyC&f8A9y69y|d&nez0C-8%7Ly}-brQC<%$1T)du2MmJ&1kZH^u}%{ z!hn2-1cP5HSg+MO2t%Iq)BQ7jy&_Hj<^kWlTTGrxO68c2{T+ui*Qkgkc6alX0y{pC z$Cwj%^sV-_7pg`ohYS1;EOsjDPtH5-kseDml440usB1pnXJeGdf6mx-d{(9!V4ewV z^f+qs`|d>-SR)zbRxlPkuP*<&nmA%yKoYI7T z{v(Iww%c|#{hhItlGx(qYMsKK!^W*uixEYPcOyAujFPUA)Vgw(E2)-};r&ooFJ$J0h!_ z7sT+TbHA4e%o6Q7XsvhO$Yl@iJSprHUS?kPs2FPP?CdvSHOGwPEKYL89~XajC8?x3 zrS+}N5z*QlBC9Ka33`hK30lsmnWoiVi}o9EE=?+}Q}?J8C1o89 z&CZHsj@D%JRp;L5^GghxTE^oT@(em{@QyO8ja|kX^juY(ec&q$-C>`uX1F(u2z{78 zkuYU<4FmyboC(7P)FIQ$u LeCA&k8Ti>>Y9-6c diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-archt.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-archt.jpg deleted file mode 100644 index 98f158d051cd39a5ad3b2bd338533699e385a097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33412 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 G{QM8TyGFkN diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-box.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat-box.jpg deleted file mode 100644 index f18b7b44845ddf8f11101a0bfc9b0d153ae9d0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3491 zcmds(do)z*8^_-<#*AAvL&%*-(a~{@5E2qaLPbKkGbU+}OOss6B}2kFo!oNEpvYyA z$o*C!C6^*YE)!*>F&MLdQ|GL+>bK4x=bXQO>-W5C?{_`>`>wq|`+fF)o(CF&-hnNL zP0UOHj6Iy$13)YwWnpZ1P};`roTneo7w6&S79efrcTQQ_PDS}=6#$KbD1bt6A-NDJ zBo~q!h2rKDlav(SCN3r|r>r0?t0XHXzEg9j(jFBxbv3CSTDn@Q zy2`3*Dlil`Hy;n5Fh9Srij267%0D)!6?PW@7y|aqz#j(VfOE3RP~1GcFaZBuW1oLl zzZ16r4j3HH!3jqoI62w331@476OF*gs2Fky9CJa+`U|Q?B_*)5|;HB0exE z_)>#=b+Q*NcErT_Bl?Yp^o`2~gdibxMDDyyo=HMMokEv;?s9i3g>F9u$| z8hkx8JTgI@s(&Ll197y376>3e!QFpGHC~bryxM;m^`8s z+4qz+Nb_JW^%JzcYt5!NFW`g-y*~+mPD`}8TK6sQn@;s8YAX0egZEk_{*l>Z zRE(M7YR&eQV5XObOJP7+k%$${K%7j}pIm8%0DUWNV|#6(L@Qm&K1mR;B?S0!avvvj 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 E*@0`db^rhX diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/hcat.jpg deleted file mode 100644 index 13d1f07791652d88a897319584af1f871de4ccc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5765 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�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 diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/images/templetontitle.jpg b/hcatalog/src/docs/src/documentation/content/xdocs/images/templetontitle.jpg deleted file mode 100644 index 9efab7c0aeb622a12e520c4d61d7b3e3e8fd0d0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14103 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 QnmY8RkpISu2tWNl0E}}!1poj5 diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/index.xml b/hcatalog/src/docs/src/documentation/content/xdocs/index.xml deleted file mode 100644 index 5ff662717b80..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/index.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - -
- Overview -
- -
- HCatalog - -

HCatalog is a table and storage management layer for Hadoop that enables users with different data processing tools – Pig, MapReduce, and Hive – to more easily read and write data on the grid. HCatalog’s table abstraction presents users with a relational view of data in the Hadoop distributed file system (HDFS) and ensures that users need not worry about where or in what format their data is stored – RCFile format, text files, or SequenceFiles.

-

HCatalog supports reading and writing files in any format for which a SerDe (serializer-deserializer) can be written. By default, HCatalog supports RCFile, CSV, JSON, and SequenceFile formats. To use a custom format, you must provide the InputFormat, OutputFormat, and SerDe.

-

-
- - -
- - -
- HCatalog Architecture -

HCatalog is built on top of the Hive metastore and incorporates Hive's DDL. HCatalog provides read and write interfaces for Pig and MapReduce and uses Hive's command line interface for issuing data definition and metadata exploration commands.

- -

- -
-Interfaces -

The HCatalog interface for Pig consists of HCatLoader and HCatStorer, which implement the Pig load and store interfaces respectively. HCatLoader accepts a table to read data from; you can indicate which partitions to scan by immediately following the load statement with a partition filter statement. HCatStorer accepts a table to write to and optionally a specification of partition keys to create a new partition. You can write to a single partition by specifying the partition key(s) and value(s) in the STORE clause; and you can write to multiple partitions if the partition key(s) are columns in the data being stored. HCatLoader is implemented on top of HCatInputFormat and HCatStorer is implemented on top of HCatOutputFormat. -(See Load and Store Interfaces.)

- -

The HCatalog interface for MapReduce — HCatInputFormat and HCatOutputFormat — is an implementation of Hadoop InputFormat and OutputFormat. HCatInputFormat accepts a table to read data from and optionally a selection predicate to indicate which partitions to scan. HCatOutputFormat accepts a table to write to and optionally a specification of partition keys to create a new partition. You can write to a single partition by specifying the partition key(s) and value(s) in the setOutput method; and you can write to multiple partitions if the partition key(s) are columns in the data being stored. -(See Input and Output Interfaces.)

- -

Note: There is no Hive-specific interface. Since HCatalog uses Hive's metastore, Hive can read data in HCatalog directly.

- -

Data is defined using HCatalog's command line interface (CLI). The HCatalog CLI supports all Hive DDL that does not require MapReduce to execute, allowing users to create, alter, drop tables, etc. The CLI also supports the data exploration part of the Hive command line, such as SHOW TABLES, DESCRIBE TABLE, and so on. -Unsupported Hive DDL includes import/export, the REBUILD and CONCATENATE options of ALTER TABLE, CREATE TABLE AS SELECT, and ANALYZE TABLE ... COMPUTE STATISTICS. -(See Command Line Interface.)

-
- -
-Data Model -

HCatalog presents a relational view of data. Data is stored in tables and these tables can be placed in databases. Tables can also be hash partitioned on one or more keys; that is, for a given value of a key (or set of keys) there will be one partition that contains all rows with that value (or set of values). For example, if a table is partitioned on date and there are three days of data in the table, there will be three partitions in the table. New partitions can be added to a table, and partitions can be dropped from a table. Partitioned tables have no partitions at create time. Unpartitioned tables effectively have one default partition that must be created at table creation time. There is no guaranteed read consistency when a partition is dropped.

- -

Partitions contain records. Once a partition is created records cannot be added to it, removed from it, or updated in it. Partitions are multi-dimensional and not hierarchical. Records are divided into columns. Columns have a name and a datatype. HCatalog supports the same datatypes as Hive. -See Load and Store Interfaces for more information about datatypes.

-
-
- -
- Data Flow Example -

This simple data flow example shows how HCatalog can help grid users share and access data.

- -

First Joe in data acquisition uses distcp to get data onto the grid.

- -hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data - -hcat "alter table rawevents add partition (ds='20100819') location 'hdfs://data/rawevents/20100819/data'" - - -

Second Sally in data processing uses Pig to cleanse and prepare the data.

-

Without HCatalog, Sally must be manually informed by Joe when data is available, or poll on HDFS.

- -A = load '/data/rawevents/20100819/data' as (alpha:int, beta:chararray, …); -B = filter A by bot_finder(zeta) = 0; -… -store Z into 'data/processedevents/20100819/data'; - - -

With HCatalog, HCatalog will send a JMS message that data is available. The Pig job can then be started.

- -A = load 'rawevents' using HCatLoader(); -B = filter A by date = '20100819' and by bot_finder(zeta) = 0; -… -store Z into 'processedevents' using HCatStorer("date=20100819"); - - -

Third Robert in client management uses Hive to analyze his clients' results.

-

Without HCatalog, Robert must alter the table to add the required partition.

- -alter table processedevents add partition 20100819 hdfs://data/processedevents/20100819/data - -select advertiser_id, count(clicks) -from processedevents -where date = '20100819' -group by advertiser_id; - -

With HCatalog, Robert does not need to modify the table structure.

- -select advertiser_id, count(clicks) -from processedevents -where date = ‘20100819’ -group by advertiser_id; - - -
- - - - diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/inputoutput.xml b/hcatalog/src/docs/src/documentation/content/xdocs/inputoutput.xml deleted file mode 100644 index fec9e732743b..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/inputoutput.xml +++ /dev/null @@ -1,460 +0,0 @@ - - - - - -
- Input and Output Interfaces -
- - - -
- Set Up -

No HCatalog-specific setup is required for the HCatInputFormat and HCatOutputFormat interfaces.

-

-
- - -
- HCatInputFormat -

The HCatInputFormat is used with MapReduce jobs to read data from HCatalog-managed tables.

-

HCatInputFormat exposes a Hadoop 0.20 MapReduce API for reading data as if it had been published to a table.

- -
- API -

The API exposed by HCatInputFormat is shown below. It includes:

-
    -
  • setInput
  • -
  • setOutputSchema
  • -
  • getTableSchema
  • -
- -

To use HCatInputFormat to read data, call setInput with the database name, tablename and an optional partition filter.

- -

You can use the setOutputSchema method to include a projection schema, to -specify the output fields. If a schema is not specified, all the columns in the table -will be returned.

- -

You can use the getTableSchema method to determine the table schema for a specified input table.

- - - /** - * Set the input to use for the Job. This queries the metadata server with - * the specified partition predicates, gets the matching partitions, puts - * the information in the conf object. The inputInfo object is updated with - * information needed in the client context - * @param job the job object - * @param dbName the database where the table lies - * @param tableName the table to read - * @param filter the partition filter to use - * @throws IOException the exception in communicating with the metadata server - */ - public static void setInput(Job job, - String dbName, String tableName, String filter) throws IOException; - - /** - * Set the schema for the HCatRecord data returned by HCatInputFormat. - * @param job the job object - * @param hcatSchema the schema to use as the consolidated schema - */ - public static void setOutputSchema(Job job,HCatSchema hcatSchema) - throws IOException; - - /** - * Get the HCatTable schema for the table specified in the HCatInputFormat.setInput - * call on the specified job context. This information is available only after - * HCatInputFormat.setInput has been called for a JobContext. - * @param context the context - * @return the table schema - * @throws IOException if HCatInputFormat.setInput has not been called - * for the current context - */ - public static HCatSchema getTableSchema(JobContext context) - throws IOException; - - - -
-
- - - -
- HCatOutputFormat -

HCatOutputFormat is used with MapReduce jobs to write data to HCatalog-managed tables.

- -

HCatOutputFormat exposes a Hadoop 0.20 MapReduce API for writing data to a table. - When a MapReduce job uses HCatOutputFormat to write output, the default OutputFormat configured for the table is used and the new partition is published to the table after the job completes.

- -
- API -

The API exposed by HCatOutputFormat is shown below. It includes:

-
    -
  • setOutput
  • -
  • setSchema
  • -
  • getTableSchema
  • -
- -

The first call on the HCatOutputFormat must be setOutput; any other call will throw an exception saying the output format is not initialized. The schema for the data being written out is specified by the setSchema method. You must call this method, providing the schema of data you are writing. If your data has the same schema as the table schema, you can use HCatOutputFormat.getTableSchema() to get the table schema and then pass that along to setSchema().

- - - /** - * Set the information about the output to write for the job. This queries the metadata - * server to find the StorageHandler to use for the table. It throws an error if the - * partition is already published. - * @param job the job object - * @param outputJobInfo the table output information for the job - * @throws IOException the exception in communicating with the metadata server - */ - @SuppressWarnings("unchecked") - public static void setOutput(Job job, OutputJobInfo outputJobInfo) throws IOException; - - /** - * Set the schema for the data being written out to the partition. The - * table schema is used by default for the partition if this is not called. - * @param job the job object - * @param schema the schema for the data - * @throws IOException - */ - public static void setSchema(final Job job, final HCatSchema schema) throws IOException; - - /** - * Get the table schema for the table specified in the HCatOutputFormat.setOutput call - * on the specified job context. - * @param context the context - * @return the table schema - * @throws IOException if HCatOutputFormat.setOutput has not been called - * for the passed context - */ - public static HCatSchema getTableSchema(JobContext context) throws IOException; - - -
- -
- - -
- HCatRecord - -

HCatRecord is the type supported for storing values in HCatalog tables.

-

The types in an HCatalog table schema determine the types of objects returned for different fields in HCatRecord. This table shows the mappings between Java classes for MapReduce programs and HCatalog data types:

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

HCatalog Data Type

Java Class in MapReduce

Values

TINYINT

java.lang.Byte

-128 to 127

SMALLINT

java.lang.Short

-215 to 215-1 (-32,768 to 32,767)

INT

java.lang.Integer

-231 to 231-1 (-2,147,483,648 to 2,147,483,647)

BIGINT

java.lang.Long

-263 to 263-1 (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)

BOOLEAN

java.lang.Boolean

true or false

FLOAT

java.lang.Float

single-precision floating-point value

DOUBLE

java.lang.Double

double-precision floating-point value

BINARY

byte[]

binary data

STRING

java.lang.String

character string

STRUCT

java.util.List

structured data

ARRAY

java.util.List

values of one data type

MAP

java.util.Map

key-value pairs

- -
- - -
- Running MapReduce with HCatalog -

-Your MapReduce program needs to be told where the Thrift server is. -The easiest way to do this is to pass the location as an argument to your Java program. -You need to -pass the Hive and HCatalog jars to MapReduce as well, via the -libjars argument.

- - - -export HADOOP_HOME=<path_to_hadoop_install> -export HCAT_HOME=<path_to_hcat_install> -export HIVE_HOME=<path_to_hive_install> -export LIB_JARS=$HCAT_HOME/share/hcatalog/hcatalog-core-0.5.0.jar, -$HIVE_HOME/lib/hive-metastore-0.10.0.jar, -$HIVE_HOME/lib/libthrift-0.7.0.jar, -$HIVE_HOME/lib/hive-exec-0.10.0.jar, -$HIVE_HOME/lib/libfb303-0.7.0.jar, -$HIVE_HOME/lib/jdo2-api-2.3-ec.jar, -$HIVE_HOME/lib/slf4j-api-1.6.1.jar - -export HADOOP_CLASSPATH=$HCAT_HOME/share/hcatalog/hcatalog-core-0.5.0.jar: -$HIVE_HOME/lib/hive-metastore-0.10.0.jar: -$HIVE_HOME/lib/libthrift-0.7.0.jar: -$HIVE_HOME/lib/hive-exec-0.10.0.jar: -$HIVE_HOME/lib/libfb303-0.7.0.jar: -$HIVE_HOME/lib/jdo2-api-2.3-ec.jar: -$HIVE_HOME/conf:$HADOOP_HOME/conf: -$HIVE_HOME/lib/slf4j-api-1.6.1.jar - -$HADOOP_HOME/bin/hadoop --config $HADOOP_HOME/conf jar <path_to_jar> -<main_class> -libjars $LIB_JARS <program_arguments> - - -

This works but Hadoop will ship libjars every time you run the MapReduce program, treating the files as different cache entries, which is not efficient and may deplete the Hadoop distributed cache.

-

Instead, you can optimize to ship libjars using HDFS locations. By doing this, Hadoop will reuse the entries in the distributed cache.

- - -bin/hadoop fs -copyFromLocal $HCAT_HOME/share/hcatalog/hcatalog-core-0.5.0.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-metastore-0.10.0.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libthrift-0.7.0.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-exec-0.10.0.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libfb303-0.7.0.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/jdo2-api-2.3-ec.jar /tmp -bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/slf4j-api-1.6.1.jar /tmp - -export LIB_JARS=hdfs:///tmp/hcatalog-core-0.5.0.jar, -hdfs:///tmp/hive-metastore-0.10.0.jar, -hdfs:///tmp/libthrift-0.7.0.jar, -hdfs:///tmp/hive-exec-0.10.0.jar, -hdfs:///tmp/libfb303-0.7.0.jar, -hdfs:///tmp/jdo2-api-2.3-ec.jar, -hdfs:///tmp/slf4j-api-1.6.1.jar - -# (Other statements remain the same.) - - -

Authentication

- - - - -

If a failure results in a message like "2010-11-03 16:17:28,225 WARN hive.metastore ... - Unable to connect metastore with URI thrift://..." in /tmp/<username>/hive.log, then make sure you have run "kinit <username>@FOO.COM" to get a Kerberos ticket and to be able to authenticate to the HCatalog server.

- -
- Read Example - -

-The following very simple MapReduce program reads data from one table which it assumes to have an integer in the -second column, and counts how many different values it sees. That is, it does the -equivalent of "select col1, count(*) from $table group by col1;". -

- - -public class GroupByAge extends Configured implements Tool { - - public static class Map extends - Mapper<WritableComparable, HCatRecord, IntWritable, IntWritable> { - - int age; - - @Override - protected void map( - WritableComparable key, - HCatRecord value, - org.apache.hadoop.mapreduce.Mapper<WritableComparable, HCatRecord, - IntWritable, IntWritable>.Context context) - throws IOException, InterruptedException { - age = (Integer) value.get(1); - context.write(new IntWritable(age), new IntWritable(1)); - } - } - - public static class Reduce extends Reducer<IntWritable, IntWritable, - WritableComparable, HCatRecord> { - - - @Override - protected void reduce( - IntWritable key, - java.lang.Iterable<IntWritable> values, - org.apache.hadoop.mapreduce.Reducer<IntWritable, IntWritable, - WritableComparable, HCatRecord>.Context context) - throws IOException, InterruptedException { - int sum = 0; - Iterator<IntWritable> iter = values.iterator(); - while (iter.hasNext()) { - sum++; - iter.next(); - } - HCatRecord record = new DefaultHCatRecord(2); - record.set(0, key.get()); - record.set(1, sum); - - context.write(null, record); - } - } - - public int run(String[] args) throws Exception { - Configuration conf = getConf(); - args = new GenericOptionsParser(conf, args).getRemainingArgs(); - - String inputTableName = args[0]; - String outputTableName = args[1]; - String dbName = null; - - Job job = new Job(conf, "GroupByAge"); - HCatInputFormat.setInput(job, dbName, - inputTableName); - // initialize HCatOutputFormat - - job.setInputFormatClass(HCatInputFormat.class); - job.setJarByClass(GroupByAge.class); - job.setMapperClass(Map.class); - job.setReducerClass(Reduce.class); - job.setMapOutputKeyClass(IntWritable.class); - job.setMapOutputValueClass(IntWritable.class); - job.setOutputKeyClass(WritableComparable.class); - job.setOutputValueClass(DefaultHCatRecord.class); - HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, - outputTableName, null)); - HCatSchema s = HCatOutputFormat.getTableSchema(job); - System.err.println("INFO: output schema explicitly set for writing:" - + s); - HCatOutputFormat.setSchema(job, s); - job.setOutputFormatClass(HCatOutputFormat.class); - return (job.waitForCompletion(true) ? 0 : 1); - } - - public static void main(String[] args) throws Exception { - int exitCode = ToolRunner.run(new GroupByAge(), args); - System.exit(exitCode); - } -} - - -

Notice a number of important points about this program:

-
    -
  1. The implementation of Map takes HCatRecord as an input and the implementation of Reduce produces it as an output.
  2. -
  3. This example program assumes the schema of the input, but it could also retrieve the schema via -HCatOutputFormat.getOutputSchema() and retrieve fields based on the results of that call.
  4. -
  5. The input descriptor for the table to be read is created by passing the database name, -table name, and an optional partition filter to HCatInputFormat.setInput. In this example the partition filter is null, so all partitions of the table -will be read.
  6. -
  7. The output descriptor for the table to be written is created by calling OutputJobInfo.create. It requires the -database name, the table name, and a Map of partition keys and values that describe the partition being written. -In this example it is assumed the table is unpartitioned, so this Map is null.
  8. -
- -

To scan just selected partitions of a table, a filter describing the desired partitions can be passed to -HCatInputFormat.setInput. To scan a single partition, the filter string should look like: "ds=20120401" -where the datestamp "ds" is the partition column name and "20120401" is the value -you want to read (year, month, and day).

-
- -
- Filter Operators - -

A filter can contain the operators 'and', 'or', 'like', '()', '=', '<>' (not equal), '<', '>', '<=' and '>='.

-

For example:

- -
    -
  • ds > "20110924"
  • -
  • ds < "20110925"
  • -
  • ds <= "20110925" and ds >= "20110924"
  • -
-
- -
- Scan Filter - -

Assume for example you have a web_logs table that is partitioned by the column "ds". You could select one partition of the table by changing

- -HCatInputFormat.setInput(job, dbName, inputTableName); - -

-to -

- -HCatInputFormat.setInput(job, - dbName, inputTableName, "ds=\"20110924\""); - -

-This filter must reference only partition columns. Values from other columns will cause the job to fail.

-
- -
- Write Filter -

-To write to a single partition you can change the above example to have a Map of key value pairs that describe all -of the partition keys and values for that partition. In our example web_logs table, there is only one partition -column (ds), so our Map will have only one entry. Change

- -HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, null)); - -

to

- -Map partitions = new HashMap<String, String>(1); -partitions.put("ds", "20110924"); -HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, partitions)); - - -

To write multiple partitions simultaneously you can leave the Map null, but all of the partitioning columns must be present in the data you are writing. -

- -
-
- - - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/install.xml b/hcatalog/src/docs/src/documentation/content/xdocs/install.xml deleted file mode 100644 index 4ae0401b3bd3..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/install.xml +++ /dev/null @@ -1,282 +0,0 @@ - - - - - -
- Installation from Tarball -
- - -
- Server Installation from Source - -

Prerequisites

-
    -
  • machine to build the installation tar on
  • -
  • machine on which the server can be installed — this should have - access to the Hadoop cluster in question, and be accessible from - the machines you launch jobs from
  • -
  • an RDBMS — we recommend MySQL and provide instructions for it
  • -
  • Hadoop cluster
  • -
  • Unix user that the server will run as, and, if you are running your - cluster in secure mode, an associated Kerberos service principal and keytabs.
  • -
  • Apache Ant 1.8 or greater. Version 1.7.x is not supported.
  • -
- -

Throughout these instructions when you see a word in italics it - indicates a place where you should replace the word with a locally - appropriate value such as a hostname or password.

- -

Building a tarball

- -

If you downloaded HCatalog from Apache or another site as a source release, - you will need to first build a tarball to install. You can tell if you have - a source release by looking at the name of the object you downloaded. If - it is named hcatalog-src-0.5.0-incubating.tar.gz (notice the - src in the name) then you have a source release.

- -

If you do not already have Apache Ant installed on your machine, you - will need to obtain it. You can get it from the - Apache Ant website. Once you download it, you will need to unpack it - somewhere on your machine. The directory where you unpack it will be referred - to as ant_home in this document.

- -

To produce a binary tarball from downloaded src tarball, execute the following steps:

-

tar xzf hcatalog-src-0.5.0-incubating.tar.gz

-

cd hcatalog-src-0.5.0-incubating

-

ant_home/bin/ant package

-

The tarball for installation should now be at - build/hcatalog-0.5.0-incubating.tar.gz

- -

Database Setup

- -

If you do not already have Hive installed with MySQL, the following will - walk you through how to do so. If you have already set this up, you can skip - this step.

- -

Select a machine to install the database on. This need not be the same - machine as the Thrift server, which we will set up later. For large - clusters we recommend that they not be the same machine. For the - purposes of these instructions we will refer to this machine as - hivedb.acme.com

- -

Install MySQL server on hivedb.acme.com. You can obtain - packages for MySQL from MySQL's - download site. We have developed and tested with versions 5.1.46 - and 5.1.48. We suggest you use these versions or later. - Once you have MySQL up and running, use the mysql command line - tool to add the hive user and hivemetastoredb - database. You will need to pick a password for your hive - user, and replace dbpassword in the following commands with it.

- -

mysql -u root

-

mysql> CREATE USER 'hive'@'hivedb.acme.com' IDENTIFIED BY 'dbpassword';

-

mysql> CREATE DATABASE hivemetastoredb DEFAULT CHARACTER SET latin1 DEFAULT COLLATE latin1_swedish_ci;

-

mysql> GRANT ALL PRIVILEGES ON hivemetastoredb.* TO 'hive'@'hivedb.acme.com' WITH GRANT OPTION;

-

mysql> flush privileges;

-

mysql> quit;

- -

Use the database installation script found in the Hive package to create the - database. hive_home in the line below refers to the directory - where you have installed Hive. If you are using Hive rpms, then this will - be /usr/lib/hive.

- -

mysql -u hive -D hivemetastoredb -hhivedb.acme.com -p < hive_home/scripts/metastore/upgrade/mysql/hive-schema-0.10.0.mysql.sql

- -

Thrift Server Setup

- -

If you do not already have Hive running a metastore server using Thrift, - you can use the following instructions to setup and run one. You may skip - this step if you already are using a Hive metastore server.

- -

Select a machine to install your Thrift server on. For smaller and test - installations this can be the same machine as the database. For the - purposes of these instructions we will refer to this machine as - hcatsvr.acme.com.

- -

If you have not already done so, install Hive 0.10.0 (say) on this machine. You - can use the - binary distributions - provided by Hive or rpms available from - Apache Bigtop. If you use - the Apache Hive binary distribution, select a directory, henceforth - referred to as hive_home, and untar the distribution there. - If you use the rpms, hive_home will be - /usr/lib/hive.

- -

Install the MySQL Java connector libraries on hcatsvr.acme.com. - You can obtain these from - MySQL's - download site.

- -

Select a user to run the Thrift server as. This user should not be a - human user, and must be able to act as a proxy for other users. We suggest - the name "hive" for the user. Throughout the rest of this documentation - we will refer to this user as hive. If necessary, add the user to - hcatsvr.acme.com.

- -

Select a root directory for your installation of HCatalog. This - directory must be owned by the hive user. We recommend - /usr/local/hive. If necessary, create the directory. You will - need to be the hive user for the operations described in the remainder - of this Thrift Server Setup section.

- -

Copy the HCatalog installation tarball into a temporary directory, and untar - it. Then change directories into the new distribution and run the HCatalog - server installation script. You will need to know the directory you chose - as root and the - directory you installed the MySQL Java connector libraries into (referred - to in the command below as dbroot). You will also need your - hadoop_home, the directory where you have Hadoop installed, and - the port number you wish HCatalog to operate on which you will use to set - portnum.

- -

tar zxf hcatalog-0.5.0-incubating.tar.gz

-

cd hcatalog-0.5.0-incubating

-

share/hcatalog/scripts/hcat_server_install.sh -r root -d dbroot -h hadoop_home -p portnum

- -

Now you need to edit your hive_home/conf/hive-site.xml file. - If there is no such file in hive conf directory, copy hcat_home/etc/hcatalog/proto-hive-site.xml - and rename it hive-site.xml in hive_home/conf/. - Open this file in your favorite text editor. The following table shows the - values you need to configure.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterValue to Set it to
javax.jdo.option.ConnectionURLjdbc:mysql://hostname/hivemetastoredb?createDatabaseIfNotExist=true where hostname is the name of the machine you installed MySQL on.
javax.jdo.option.ConnectionDriverNamecom.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserNamehive
javax.jdo.option.ConnectionPassworddbpassword value you used in setting up the MySQL server - above.
hive.semantic.analyzer.factory.implorg.apache.hive.hcatalog.cli.HCatSemanticAnalyzerFactory
hive.metastore.warehouse.dirThe directory can be a URI or an absolute file path. If it is an absolute file path, it will be resolved to a URI by the metastore: -

-- If default hdfs was specified in core-site.xml, path resolves to HDFS location.

-

-- Otherwise, path is resolved as local file: URI.

-

This setting becomes effective when creating new tables (it takes precedence over default DBS.DB_LOCATION_URI at the time of table creation).

-

You only need to set this if you have not yet configured Hive to run on your system.

-
hive.metastore.uristhrift://hostname:portnum where hostname is the name of the machine hosting the Thrift server, and portnum is the port number - used above in the installation script.
hive.metastore.execute.setugitrue
hive.metastore.sasl.enabledSet to true if you are using Kerberos security with your Hadoop - cluster, false otherwise.
hive.metastore.kerberos.keytab.fileThe path to the Kerberos keytab file containing the metastore - Thrift server's service principal. Only required if you set - hive.metastore.sasl.enabled above to true.
hive.metastore.kerberos.principalThe service principal for the metastore Thrift server. You can - reference your host as _HOST and it will be replaced with your - actual hostname. Only required if you set - hive.metastore.sasl.enabled above to true.
- -

You can now proceed to starting the server.

-
- -
- Starting the Server - -

To start your server, HCatalog needs to know where Hive is installed. - This is communicated by setting the environment variable HIVE_HOME - to the location you installed Hive. Start the HCatalog server by switching directories to - root and invoking - "HIVE_HOME=hive_home sbin/hcat_server.sh start".

- -
- -
- Logging - -

Server activity logs are located in - root/var/log/hcat_server. Logging configuration is located at - root/conf/log4j2.properties. Server logging uses - DailyRollingFileAppender by default. It will generate a new - file per day and does not expire old log files automatically.

- -
- -
- Stopping the Server - -

To stop the HCatalog server, change directories to the root - directory and invoke - "HIVE_HOME=hive_home sbin/hcat_server.sh stop".

- -
- -
- Client Installation - -

Select a root directory for your installation of HCatalog client. - We recommend /usr/local/hcat. If necessary, create the directory.

- -

Copy the HCatalog installation tarball into a temporary directory, and untar - it.

- -

tar zxf hcatalog-0.5.0-incubating.tar.gz

- -

Now you need to edit your hive_home/conf/hive-site.xml file. - You can use the same file as on the server except the value of - javax.jdo.option.ConnectionPasswordh should be - removed. This avoids having the password available in plain text on - all of your clients.

- -

The HCatalog command line interface (CLI) can now be invoked as - HIVE_HOME=hive_home root/bin/hcat.

- -
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/listcolumns.xml b/hcatalog/src/docs/src/documentation/content/xdocs/listcolumns.xml deleted file mode 100644 index 3d221b44ed9a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/listcolumns.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/column -
- - -
- Description -

List the columns in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/column

-
- -
- Parameters - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - -
NameDescription
columnsA list of column names and types
databaseThe database name
tableThe table name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/my_table/column?user.name=ctdean' - - -

JSON Output

- -{ - "columns": [ - { - "name": "id", - "type": "bigint" - }, - { - "name": "user", - "comment":"The user name", - "type": "string" - }, - { - "name": "my_p", - "type": "string" - }, - { - "name": "my_q", - "type": "string" - } - ], - "database": "default", - "table": "my_table" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/listdbs.xml b/hcatalog/src/docs/src/documentation/content/xdocs/listdbs.xml deleted file mode 100644 index 213a343a206e..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/listdbs.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - -
- GET ddl/database -
- - -
- Description -

List the databases in HCatalog.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database

-
- -
- Parameters - - - - - - - - -
NameDescriptionRequired?Default
likeList only databases whose names match the specified patternOptional"*" (List all)
-
- -
- Results - - - - - - - -
NameDescription
databasesA list of database names
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database?user.name=ctdean&like=n*' - - -

JSON Output

- -{ - "databases": [ - "newdb", - "newdb2" - ] -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/listpartitions.xml b/hcatalog/src/docs/src/documentation/content/xdocs/listpartitions.xml deleted file mode 100644 index 6e18c9453f2e..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/listpartitions.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/partition -
- - -
- Description -

List all the partitions in an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/partition

-
- -
- Parameters - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
partitionsA list of partition values and of partition names
databaseThe database name
tableThe table name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/my_table/partition?user.name=ctdean' - - -

JSON Output

- -{ - "partitions": [ - { - "values": [ - { - "columnName": "dt", - "columnValue": "20120101" - }, - { - "columnName": "country", - "columnValue": "US" - } - ], - "name": "dt='20120101',country='US'" - } - ], - "database": "default", - "table": "my_table" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/listproperties.xml b/hcatalog/src/docs/src/documentation/content/xdocs/listproperties.xml deleted file mode 100644 index a653a956b857..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/listproperties.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -
- GET ddl/database/:db/table/:table/property -
- - -
- Description -

List all the properties of an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table/property

-
- -
- Parameters - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe table nameRequiredNone
-
- -
- Results - - - - - - - - - - - - - - - -
NameDescription
propertiesA list of the tables properties in name: value pairs
databaseThe database name
tableThe table name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table/property?user.name=ctdean' - - -

JSON Output

- -{ - "properties": { - "fruit": "apple", - "last_modified_by": "ctdean", - "hcat.osd": "org.apache.hive.hcatalog.rcfile.RCFileOutputDriver", - "color": "blue", - "last_modified_time": "1331620706", - "hcat.isd": "org.apache.hive.hcatalog.rcfile.RCFileInputDriver", - "transient_lastDdlTime": "1331620706", - "comment": "Best table made today", - "country": "Albania" - }, - "table": "test_table", - "database": "default" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/listtables.xml b/hcatalog/src/docs/src/documentation/content/xdocs/listtables.xml deleted file mode 100644 index 7d476896bf4a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/listtables.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -
- GET ddl/database/:db/table -
- - -
- Description -

List the tables in an HCatalog database.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table

-
- -
- Parameters - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
likeList only tables whose names match the specified patternOptional"*" (List all tables)
-
- -
- Results - - - - - - - - - - - -
NameDescription
tablesA list of table names
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/ddl/database/default/table?user.name=ctdean&like=m*' - - -

JSON Output

- -{ - "tables": [ - "my_table", - "my_table_2", - "my_table_3" - ], - "database": "default" -} - - -

JSON Output (error)

- -{ - "errorDetail": " - org.apache.hadoop.hive.ql.metadata.HiveException: ERROR: The database defaultsd does not exist. - at org.apache.hadoop.hive.ql.exec.DDLTask.switchDatabase(DDLTask.java:3122) - at org.apache.hadoop.hive.ql.exec.DDLTask.execute(DDLTask.java:224) - at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:134) - at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57) - at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1332) - at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1123) - at org.apache.hadoop.hive.ql.Driver.run(Driver.java:931) - at org.apache.hive.hcatalog.cli.HCatDriver.run(HCatDriver.java:42) - at org.apache.hive.hcatalog.cli.HCatCli.processCmd(HCatCli.java:247) - at org.apache.hive.hcatalog.cli.HCatCli.processLine(HCatCli.java:203) - at org.apache.hive.hcatalog.cli.HCatCli.main(HCatCli.java:162) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) - at java.lang.reflect.Method.invoke(Method.java:597) - at org.apache.hadoop.util.RunJar.main(RunJar.java:156) - ", - "error": "FAILED: Error in metadata: ERROR: The database defaultsd does not exist.", - "errorCode": 500, - "database": "defaultsd" -} - - - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/loadstore.xml b/hcatalog/src/docs/src/documentation/content/xdocs/loadstore.xml deleted file mode 100644 index fddb270df397..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/loadstore.xml +++ /dev/null @@ -1,564 +0,0 @@ - - - - - -
- Load and Store Interfaces -
- - - -
- Set Up - -

The HCatLoader and HCatStorer interfaces are used with Pig scripts to read -and write data in HCatalog-managed tables. No HCatalog-specific setup is -required for these interfaces.

- -
- - -
- HCatLoader - -

HCatLoader is used with Pig scripts to read data from HCatalog-managed tables.

- -
- Usage - -

HCatLoader is accessed via a Pig load statement.

- -A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader(); - - -

Assumptions

- -

You must specify the table name in single quotes: LOAD 'tablename'. -If you are using a non-default database you must specify your input as -'dbname.tablename'. If you are using Pig 0.9.2 or earlier, you must create -your database and table prior to running the Pig script. Beginning with -Pig 0.10 you can issue these create commands in Pig using the SQL command.

- -

The Hive metastore lets you create tables without specifying a database; -if you created tables this way, then the database name is 'default' and is not -required when specifying the table for HCatLoader.

- -

If the table is partitioned, you can indicate which partitions to scan by -immediately following the load statement with a partition filter statement -(see Load Examples below).

-
- - -
- HCatalog Data Types - -

Restrictions apply to the types of columns HCatLoader can read from HCatalog-managed tables.

-

HCatLoader can read only the data types listed in the table below. -The table shows how Pig will interpret the HCatalog data type.

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

Primitives

-
-

-
-

HCatalog Data Type

-
-

Pig Data Type

-
-

int

-
-

int

-
-

long

-
-

long

-
-

float

-
-

float

-
-

double

-
-

double

-
-

string

-
-

chararray

-
-

boolean

-
-

boolean

-
-

binary

-
-

bytearray

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

Complex Types

-
-

-
-

HCatalog Data Type

-
-

Pig Data Type

-
-

map
(key type should be string)

-
-

map

-
-

List<any type>

-
-

bag

-
-

struct<any type fields>

-
-

tuple

-
- -


- -
- - -
- Running Pig with HCatalog - -

Pig does not automatically pick up HCatalog jars. To bring in the necessary -jars, you can either use a flag in the pig command or set the -environment variables PIG_CLASSPATH and PIG_OPTS as described below.

- -

The -useHCatalog Flag

-

To bring in the appropriate jars for working with HCatalog, -simply include the following flag:

- - -pig -useHCatalog - - -

Jars and Configuration Files

- -

For Pig commands that omit -useHCatalog, you need to -tell Pig where to find your HCatalog jars and the Hive jars used by the -HCatalog client. To do this, you must define the environment variable -PIG_CLASSPATH with the appropriate jars.

- -

HCatalog can tell you the jars it needs. In order to do this -it needs to know where Hadoop and Hive are installed. -Also, you need to tell Pig the URI -for your metastore, in the PIG_OPTS variable.

- -

In the case where you have installed Hadoop and HCatalog via tar, -you can do this:

- - -export HADOOP_HOME=<path_to_hadoop_install> - -export HCAT_HOME=<path_to_hcat_install> - -export HIVE_HOME=<path_to_hive_install> - -export PIG_CLASSPATH=$HCAT_HOME/share/hcatalog/hcatalog-*.jar:\ -$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\ -$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\ -$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/conf:$HADOOP_HOME/conf:\ -$HIVE_HOME/lib/slf4j-api-*.jar - -export PIG_OPTS=-Dhive.metastore.uris=thrift://<hostname>:<port> - - -

Or you can pass the jars in your command line:

- - -<path_to_pig_install>/bin/pig -Dpig.additional.jars=\ -$HCAT_HOME/share/hcatalog/hcatalog-*.jar:\ -$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\ -$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\ -$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/lib/slf4j-api-*.jar <script.pig> - - -

The version number found in each filepath will be substituted for *. For example, HCatalog release 0.5.0 uses these jars and conf files:

- -
    -
  • $HCAT_HOME/share/hcatalog/hcatalog-core-0.5.0.jar
  • -
  • $HCAT_HOME/share/hcatalog/hcatalog-pig-adapter-0.5.0.jar
  • -
  • $HIVE_HOME/lib/hive-metastore-0.10.0.jar
  • -
  • $HIVE_HOME/lib/libthrift-0.7.0.jar
  • -
  • $HIVE_HOME/lib/hive-exec-0.10.0.jar
  • -
  • $HIVE_HOME/lib/libfb303-0.7.0.jar
  • -
  • $HIVE_HOME/lib/jdo2-api-2.3-ec.jar
  • -
  • $HIVE_HOME/conf
  • -
  • $HADOOP_HOME/conf
  • -
  • $HIVE_HOME/lib/slf4j-api-1.6.1.jar
  • -
- -

Authentication

- - - - -

If you are using a secure cluster and a failure results in a message -like "2010-11-03 16:17:28,225 WARN hive.metastore ... - Unable to connect -metastore with URI thrift://..." in /tmp/<username>/hive.log, then make -sure you have run "kinit <username>@FOO.COM" to get a Kerberos ticket -and to be able to authenticate to the HCatalog server.

- - -
- - -
- Load Examples - -

This load statement will load all partitions of the specified table.

- -/* myscript.pig */ -A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader(); -... -... - -

If only some partitions of the specified table are needed, include a -partition filter statement immediately following the -load statement in the data flow. (In the script, however, a filter statement -might not immediately follow its load statement.) The filter statement can -include conditions on partition as well as non-partition columns.

- -/* myscript.pig */ -A = LOAD 'tablename' USING org.apache.hive.hcatalog.pig.HCatLoader(); - --- date is a partition column; age is not -B = filter A by date == '20100819' and age < 30; - --- both date and country are partition columns -C = filter A by date == '20100819' and country == 'US'; -... -... - - -

To scan a whole table, for example:

- - -a = load 'student_data' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = foreach a generate name, age; - - -

Notice that the schema is automatically provided to Pig; there's no need to -declare name and age as fields, as if you were loading from a file.

- -

To scan a single partition of the table web_logs partitioned by the column -datestamp, for example:

- - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp == '20110924'; - - -

Pig will push the datestamp filter shown here to HCatalog, so that HCatalog knows to just scan the partition where -datestamp = '20110924'. You can combine this filter with others via 'and':

- - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp == '20110924' and user is not null; - - -

Pig will split the above filter, pushing the datestamp portion to HCatalog -and retaining the 'user is not null' part to apply itself. -You can also give a more complex filter to retrieve a set of partitions.

- -

Filter Operators

- -

A filter can contain the operators 'and', 'or', '()', '==', '!=', '<', '>', '<=' -and '>='.

- -

For example:

- - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp > '20110924'; - - -

A complex filter can have various combinations of operators, such as:

- - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp == '20110924' or datestamp == '20110925'; - - -

These two examples have the same effect:

- - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp >= '20110924' and datestamp <= '20110925'; - - - -a = load 'web_logs' using org.apache.hive.hcatalog.pig.HCatLoader(); -b = filter a by datestamp <= '20110925' and datestamp >= '20110924'; - - -
- -
- - -
- HCatStorer - -

HCatStorer is used with Pig scripts to write data to HCatalog-managed tables.

- -
- Usage - -

HCatStorer is accessed via a Pig store statement.

- - -A = LOAD ... -B = FOREACH A ... -... -... -my_processed_data = ... - -STORE my_processed_data INTO 'tablename' - USING org.apache.hive.hcatalog.pig.HCatStorer(); - - -

Assumptions

- -

You must specify the table name in single quotes: LOAD 'tablename'. Both the database and table must be created prior to running your Pig script. If you are using a non-default database you must specify your input as 'dbname.tablename'. If you are using Pig 0.9.2 or earlier, you must create your database and table prior to running the Pig script. Beginning with Pig 0.10 you can issue these create commands in Pig using the SQL command.

-

The Hive metastore lets you create tables without specifying a database; if you created -tables this way, then the database name is 'default' and you do not need to specify the -database name in the store statement.

-

For the USING clause, you can have a string argument that represents key/value pairs -for partition. This is a mandatory argument when you are writing to a partitioned table -and the partition column is not in the output column. The values for partition keys -should NOT be quoted.

-

If partition columns are present in data they need not be specified as a STORE argument. Instead HCatalog will use these values to place records in the appropriate partition(s). It is valid to specify some partition keys in the STORE statement and have other partition keys in the data.

-

-

- -
-
- Store Examples - -

You can write to a non-partitioned table simply by using HCatStorer. The contents of the table will be overwritten:

- -store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer(); - -

To add one new partition to a partitioned table, specify the partition value in the store function. Pay careful -attention to the quoting, as the whole string must be single quoted and separated with an equals sign:

- -store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer('datestamp=20110924'); - -

To write into multiple partitions at once, make sure that the partition column is present in your data, then call -HCatStorer with no argument:

- -store z into 'web_data' using org.apache.hive.hcatalog.pig.HCatStorer(); - -- datestamp must be a field in the relation z - -
- - -
- HCatalog Data Types - -

Restrictions apply to the types of columns HCatStorer can write to HCatalog-managed tables.

-

HCatStorer can write only the data types listed in the table. -The table shows how Pig will interpret the HCatalog data type.

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

Primitives

-
-

-
-

Pig Data Type

-
-

HCatalog Data Type

-
-

int

-
-

int

-
-

long

-
-

long

-
-

float

-
-

float

-
-

double

-
-

double

-
-

chararray

-
-

string

-
-

boolean

-
-

boolean

-
-

bytearray

-
-

binary

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

Complex Types

-
-

-
-

Pig Data Type

-
-

HCatalog Data Type

-
-

map

-
-

map
(key type should be string)

-
-

bag

-
-

List<any type>

-
-

tuple

-
-

struct<any type fields>

-
- -


- -
- -
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/mapreducejar.xml b/hcatalog/src/docs/src/documentation/content/xdocs/mapreducejar.xml deleted file mode 100644 index af6045159780..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/mapreducejar.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - -
- POST mapreduce/jar -
- - - -
- Description -

Creates and queues a standard - - Hadoop MapReduce job.

-
- -
- URL -

http://www.myserver.com/templeton/v1/mapreduce/jar

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
jarName of the jar file for Map Reduce to use.RequiredNone
className of the class for Map Reduce to use.RequiredNone
libjarsComma separated jar files to include in the classpath.OptionalNone
filesComma separated files to be copied to the map reduce clusterOptionalNone
argSet a program argument.OptionalNone
defineSet an Hadoop configuration variable using the syntax - define=NAME=VALUEOptionalNone
statusdirA directory where Templeton will write the status of the - Map Reduce job. If provided, it is the caller's responsibility - to remove this directory when done.OptionalNone
enablelogCollecting hadoop job config and logs into $statusdir/logs folder. - statusdir must be set as well to use this feature.OptionalNone
callbackDefine a URL to be called upon job completion. You may embed a specific - job ID into this URL using $jobId. This tag - will be replaced in the callback URL with this job's job ID.OptionalNone
-
- -
- Results - - - - - - - - - - -
NameDescription
idA string containing the job ID similar to "job_201110132141_0001".
infoA JSON object containing the information returned when the job was queued. - See the Hadoop documentation - (Class - TaskController) for more information.
-
- -
- Example - -

Code and Data Setup

- -% hadoop fs -put wordcount.jar . -% hadoop fs -put transform.jar . - -% hadoop fs -ls . -Found 2 items --rw-r--r-- 1 ctdean supergroup 23 2011-11-11 13:29 /user/ctdean/wordcount.jar --rw-r--r-- 1 ctdean supergroup 28 2011-11-11 13:29 /user/ctdean/transform.jar - - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d jar=wordcount.jar \ - -d class=org.myorg.WordCount \ - -d libjars=transform.jar \ - -d arg=wordcount/input \ - -d arg=wordcount/output \ - 'http://localhost:50111/templeton/v1/mapreduce/jar' - - -

JSON Output

- -{ - "id": "job_201111121211_0001", - "info": { - "stdout": "templeton-job-id:job_201111121211_0001 - ", - "stderr": "", - "exitcode": 0 - } -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/mapreducestreaming.xml b/hcatalog/src/docs/src/documentation/content/xdocs/mapreducestreaming.xml deleted file mode 100644 index f69a5e75b0ec..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/mapreducestreaming.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - -
- POST mapreduce/streaming -
- - - -
- Description -

Create and queue an - Hadoop - streaming MapReduce job.

-
- -
- URL -

http://www.myserver.com/templeton/v1/mapreduce/streaming

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
inputLocation of the input data in Hadoop.RequiredNone
outputLocation in which to store the output data. If not specified, - Templeton will store the output in a location that can be discovered - using the queue resource.OptionalSee description
mapperLocation of the mapper program in Hadoop.RequiredNone
reducerLocation of the reducer program in Hadoop.RequiredNone
fileAdd an HDFS file to the distributed cache.OptionalNone
defineSet an Hadoop configuration variable using the syntax - define=NAME=VALUEOptionalNone
cmdenvSet an environment variable using the syntax - cmdenv=NAME=VALUEOptionalNone
argSet a program argument.OptionalNone
statusdirA directory where Templeton will write the status of the - Map Reduce job. If provided, it is the caller's responsibility - to remove this directory when done.OptionalNone
enablelogCollecting hadoop job config and logs into $statusdir/logs folder. - statusdir must be set as well to use this feature.OptionalNone
callbackDefine a URL to be called upon job completion. You may embed a specific - job ID into this URL using $jobId. This tag - will be replaced in the callback URL with this job's job ID.OptionalNone
-
- -
- Results - - - - - - - - - - -
NameDescription
idA string containing the job ID similar to "job_201110132141_0001".
infoA JSON object containing the information returned when the job was queued. - See the Hadoop documentation - (Class - TaskController) for more information.
-
- -
- Example - -

Code and Data Setup

- -% cat mydata/file01 mydata/file02 -Hello World Bye World -Hello Hadoop Goodbye Hadoop - -% hadoop fs -put mydata/ . - -% hadoop fs -ls mydata -Found 2 items --rw-r--r-- 1 ctdean supergroup 23 2011-11-11 13:29 /user/ctdean/mydata/file01 --rw-r--r-- 1 ctdean supergroup 28 2011-11-11 13:29 /user/ctdean/mydata/file02 - - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d input=mydata \ - -d output=mycounts \ - -d mapper=/bin/cat \ - -d reducer="/usr/bin/wc -w" \ - 'http://localhost:50111/templeton/v1/mapreduce/streaming' - - -

JSON Output

- -{ - "id": "job_201111111311_0008", - "info": { - "stdout": "packageJobJar: [] [/Users/ctdean/var/hadoop/hadoop-0.20.205.0/share/hadoop/contrib/streaming/hadoop-streaming-0.20.205.0.jar... - templeton-job-id:job_201111111311_0008 - ", - "stderr": "11/11/11 13:26:43 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments - 11/11/11 13:26:43 INFO mapred.FileInputFormat: Total input paths to process : 2 - ", - "exitcode": 0 - } -} - - -

Results

- -% hadoop fs -ls mycounts -Found 3 items --rw-r--r-- 1 ctdean supergroup 0 2011-11-11 13:27 /user/ctdean/mycounts/_SUCCESS -drwxr-xr-x - ctdean supergroup 0 2011-11-11 13:26 /user/ctdean/mycounts/_logs --rw-r--r-- 1 ctdean supergroup 10 2011-11-11 13:27 /user/ctdean/mycounts/part-00000 - -% hadoop fs -cat mycounts/part-00000 - 8 - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/notification.xml b/hcatalog/src/docs/src/documentation/content/xdocs/notification.xml deleted file mode 100644 index 66fa459409ed..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/notification.xml +++ /dev/null @@ -1,241 +0,0 @@ - - - - - -
- Notification -
- - -

Since version 0.2, HCatalog provides notifications for certain events happening in the system. This way applications such as Oozie can wait for those events and schedule the work that depends on them. The current version of HCatalog supports two kinds of events:

-
    -
  • Notification when a new partition is added
  • -
  • Notification when a set of partitions is added
  • -
- -

No additional work is required to send a notification when a new partition is added: the existing addPartition call will send the notification message.

- - -
-Notification for a New Partition - -

To receive notification that a new partition has been added, you need to follow these three steps.

- -
    -
  1. To start receiving messages, create a connection to a message bus as shown here: - -ConnectionFactory connFac = new ActiveMQConnectionFactory(amqurl); -Connection conn = connFac.createConnection(); -conn.start(); - -
  2. - -
  3. Subscribe to a topic you are interested in. When subscribing on a message bus, you need to subscribe to a particular topic to receive the messages that are being delivered on that topic. -
      -
    • The topic name corresponding to a particular table is stored in table properties and can be retrieved using the following piece of code: - -HiveMetaStoreClient msc = new HiveMetaStoreClient(hiveConf); -String topicName = msc.getTable("mydb", - "myTbl").getParameters().get(HCatConstants.HCAT_MSGBUS_TOPIC_NAME); - -
    • - -
    • Use the topic name to subscribe to a topic as follows: - -Session session = conn.createSession(true, Session.SESSION_TRANSACTED); -Destination hcatTopic = session.createTopic(topicName); -MessageConsumer consumer = session.createConsumer(hcatTopic); -consumer.setMessageListener(this); - -
    • -
    -
  4. - -
  5. To start receiving messages you need to implement the JMS interface MessageListener, which, in turn, will make you implement the method onMessage(Message msg). This method will be called whenever a new message arrives on the message bus. The message contains a partition object representing the corresponding partition, which can be retrieved as shown here: - -@Override -public void onMessage(Message msg) { - // We are interested in only add_partition events on this table. - // So, check message type first. - if(msg.getStringProperty(HCatConstants.HCAT_EVENT).equals(HCatConstants.HCAT_ADD_PARTITION_EVENT)){ - Object obj = (((ObjectMessage)msg).getObject()); - } -} - -
  6. -
- -

You need to have a JMS jar in your classpath to make this work. Additionally, you need to have a JMS provider’s jar in your classpath. HCatalog is tested with ActiveMQ as a JMS provider, although any JMS provider can be used. ActiveMQ can be obtained from: http://activemq.apache.org/activemq-550-release.html.

-
- - -
-Notification for a Set of Partitions - -

Sometimes you need to wait until a collection of partitions is finished before proceeding with another operation. For example, you may want to start processing after all partitions for a day are done. However, HCatalog has no notion of collections or hierarchies of partitions. To support this, HCatalog allows data writers to signal when they are finished writing a collection of partitions. Data readers may wait for this signal before beginning to read.

- -

The example code below illustrates how to send a notification when a set of partitions has been added.

- -

To signal, a data writer does this:

- - -HiveMetaStoreClient msc = new HiveMetaStoreClient(conf); - -// Create a map, specifying partition key names and values -Map<String,String> partMap = new HashMap<String, String>(); -partMap.put("date","20110711"); -partMap.put("country","*"); - -// Mark the partition as "done" -msc.markPartitionForEvent("mydb", "mytbl", partMap, PartitionEventType.LOAD_DONE); - - -

To receive this notification, the consumer needs to do the following:

-
    -
  1. Repeat steps one and two from above to establish the connection to the notification system and to subscribe to the topic.
  2. -
  3. Receive the notification as shown in this example: - -HiveMetaStoreClient msc = new HiveMetaStoreClient(conf); - -// Create a map, specifying partition key names and values -Map<String,String> partMap = new HashMap<String, String>(); -partMap.put("date","20110711"); -partMap.put("country","*"); - -// Mark the partition as "done" -msc.markPartitionForEvent("mydb", "mytbl", partMap, PartitionEventType.LOAD_DONE); - -
  4. -
- - - -

If the consumer has registered with the message bus and is currently live, it will get the callback from the message bus once the producer marks the partition as "done". Alternatively, the consumer can ask explicitly for a particular partition from the metastore. The following code illustrates the usage from a consumer's perspective:

- - -// Enquire to metastore whether a particular partition has been marked or not. -boolean marked = msc.isPartitionMarkedForEvent("mydb", "mytbl", partMap, PartitionEventType.LOAD_DONE); - -// Or register to a message bus and get asynchronous callback. -ConnectionFactory connFac = new ActiveMQConnectionFactory(amqurl); -Connection conn = connFac.createConnection(); -conn.start(); -Session session = conn.createSession(true, Session.SESSION_TRANSACTED); -Destination hcatTopic = session.createTopic(topic); -MessageConsumer consumer = session.createConsumer(hcatTopic); -consumer.setMessageListener(this); - - -public void onMessage(Message msg) { - - - MapMessage mapMsg = (MapMessage)msg; - Enumeration<String> keys = mapMsg.getMapNames(); - - // Enumerate over all keys. This will print key-value pairs specifying the - // particular partition 44which was marked done. In this case, it will print: - // date : 20110711 - // country: * - - while(keys.hasMoreElements()){ - String key = keys.nextElement(); - System.out.println(key + " : " + mapMsg.getString(key)); - } - System.out.println("Message: "+msg); - - -
- - -
- Server Configuration -

To enable notification, you need to configure the server (see below).

-

To disable notification, you need to leave hive.metastore.event.listeners blank or remove it from hive-site.xml.

- -
- Enable JMS Notifications - -

You need to make (add/modify) the following changes to the hive-site.xml file of your HCatalog server to turn on notifications.

- - -<property> -<name>hive.metastore.event.expiry.duration</name> -<value>300L</value> -<description>Duration after which events expire from events table (in seconds)</description> -</property> - -<property> -<name>hive.metastore.event.clean.freq</name> -<value>360L</value> -<description>Frequency at which timer task runs to purge expired events in metastore (in seconds).</description> -</property> - -<property> -<name>msgbus.brokerurl</name> -<value>tcp://localhost:61616</value> -<description></description> -</property> - -<property> -<name>msgbus.username</name> -<value></value> -<description></description> -</property> - -<property> -<name>msgbus.password</name> -<value></value> -<description></description> -</property> - - -

For the server to start with support for notifications, the following must be in the classpath:

-

   (a) activemq jar

-

   (b) jndi.properties file with properties suitably configured for notifications

- -

Then, follow these guidelines to set up your environment:

-
    -
  1. The HCatalog server start script is $YOUR_HCAT_SERVER/share/hcatalog/scripts/hcat_server_start.sh.
  2. -
  3. This script expects classpath to be set by the AUX_CLASSPATH environment variable.
  4. -
  5. Therefore set AUX_CLASSPATH to satisfy (a) and (b) above.
  6. -
  7. The jndi.properties file is located at $YOUR_HCAT_SERVER/etc/hcatalog/jndi.properties.
  8. -
  9. You need to uncomment and set the following properties in the jndi.properties file: -
      -
    • java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
    • -
    • java.naming.provider.url = tcp://localhost:61616    (This is the ActiveMQ URL in your setup.) -
    • -
    -
  10. -
-
- -
- Topic Names -

If tables are created while the server is configured for notifications, a default topic name is automatically set as a table property. To use notifications with tables created previously (either in other HCatalog installations or prior to enabling notifications in the current installation) you will have to manually set a topic name. For example:

- -$YOUR_HCAT_CLIENT_HOME/bin/hcat -e "ALTER TABLE access SET hcat.msgbus.topic.name=$TOPIC_NAME" - - -

You then need to configure your ActiveMQ Consumer(s) to listen for messages on the topic you gave in $TOPIC_NAME. A good default policy is TOPIC_NAME = "$database.$table" (that is a literal dot).

- -
-
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/pig.xml b/hcatalog/src/docs/src/documentation/content/xdocs/pig.xml deleted file mode 100644 index b9099f383668..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/pig.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - - -
- POST pig -
- - -
- Description -

Create and queue a Pig job.

-
- -
- URL -

http://www.myserver.com/templeton/v1/pig

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
executeString containing an entire, short pig program to run.One of either "execcute" or "file" is requiredNone
fileHDFS file name of a pig program to run.One of either "exec" or "file" is requiredNone
argSet a program argument.OptionalNone
filesComma separated files to be copied to the map reduce clusterOptionalNone
statusdirA directory where Templeton will write the status of the - Pig job. If provided, it is the caller's responsibility - to remove this directory when done.OptionalNone
enablelogCollecting hadoop job config and logs into $statusdir/logs folder. - statusdir must be set as well to use this feature.OptionalNone
callbackDefine a URL to be called upon job completion. You may embed a specific - job ID into this URL using $jobId. This tag - will be replaced in the callback URL with this job's job ID.OptionalNone
-
- -
- Results - - - - - - - - - - -
NameDescription
idA string containing the job ID similar to "job_201110132141_0001".
infoA JSON object containing the information returned when the job was queued. - See the Hadoop documentation - (Class - TaskController) for more information.
-
- -
- Example - -

Code and Data Setup

- -% cat id.pig -A = load 'passwd' using PigStorage(':'); -B = foreach A generate $0 as id; -dump B; - -% cat fake-passwd -ctdean:Chris Dean:secret -pauls:Paul Stolorz:good -carmas:Carlos Armas:evil -dra:Deirdre McClure:marvelous - -% hadoop fs -put id.pig . -% hadoop fs -put fake-passwd passwd - - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d file=id.pig \ - -d arg=-v \ - 'http://localhost:50111/templeton/v1/pig' - - -

JSON Output

- -{ - "id": "job_201111101627_0018", - "info": { - "stdout": "templeton-job-id:job_201111101627_0018 - ", - "stderr": "", - "exitcode": 0 - } -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/queue.xml b/hcatalog/src/docs/src/documentation/content/xdocs/queue.xml deleted file mode 100644 index c5771fd51bdc..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/queue.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -
- GET queue/:jobid -
- - -
- Description -

Check the status of a job and get related job information given its job ID. - Substitute ":jobid" with the job ID received when the job was created.

-
- -
- URL -

http://www.myserver.com/templeton/v1/queue/:jobid

-
- -
- Parameters - - - - - - - - -
NameDescriptionRequired?Default
:jobidThe job ID to check. This is the ID received when the - job was created.RequiredNone
-
- -
- Results - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
statusA JSON object containing the job status information. - See the Hadoop documentation - (Class - JobStatus) for more information.
profileA JSON object containing the job profile information. - See the Hadoop documentation - (Class - JobProfile) for more information. -
idThe job ID.
parentIdThe parent job ID.
percentCompleteThe job completion percentage, for example "75% complete".
exitValueThe job's exit value.
userUser name of the job creator.
callbackThe callback URL, if any.
completedA string representing completed status, for example "done".
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/queue/job_201112212038_0003?user.name=ctdean' - - -

JSON Output

- -{ - "status": { - "startTime": 1324529476131, - "username": "ctdean", - "jobID": { - "jtIdentifier": "201112212038", - "id": 4 - }, - "jobACLs": { - }, - "schedulingInfo": "NA", - "failureInfo": "NA", - "jobId": "job_201112212038_0004", - "jobPriority": "NORMAL", - "runState": 2, - "jobComplete": true - }, - "profile": { - "url": "http://localhost:50030/jobdetails.jsp?jobid=job_201112212038_0004", - "jobID": { - "jtIdentifier": "201112212038", - "id": 4 - }, - "user": "ctdean", - "queueName": "default", - "jobFile": "hdfs://localhost:9000/tmp/hadoop-ctdean/mapred/staging/ctdean/.staging/job_201112212038_0004/job.xml", - "jobName": "PigLatin:DefaultJobName", - "jobId": "job_201112212038_0004" - }, - "id": "job_201112212038_0004", - "parentId": "job_201112212038_0003", - "percentComplete": "100% complete", - "exitValue": 0, - "user": "ctdean", - "callback": null, - "completed": "done", - "userargs" => { - "callback" => null, - "define" => [], - "enablelog" => "false", - "execute" => "select a,rand(b) from mynums", - "file" => null, - "files" => [], - "statusdir" => null, - "user.name" => "hadoopqa", - }, -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/queuedelete.xml b/hcatalog/src/docs/src/documentation/content/xdocs/queuedelete.xml deleted file mode 100644 index 39dfdbff7cc9..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/queuedelete.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -
- DELETE queue/:jobid -
- - -
- Description -

Kill a job given its job ID. - Substitute ":jobid" with the job ID received when the job was created.

-
- -
- URL -

http://www.myserver.com/templeton/v1/queue/:jobid

-
- -
- Parameters - - - - - - - - -
NameDescriptionRequired?Default
:jobidThe job ID to delete. This is the ID received when the job - job was created.RequiredNone
-
- -
- Results - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
statusA JSON object containing the job status information. - See the Hadoop documentation - (Class - JobStatus) for more information.
profileA JSON object containing the job profile information. - See the Hadoop documentation - (Class - JobProfile) for more information. -
idThe job ID.
parentIdThe parent job ID.
percentCompleteThe job completion percentage, for example "75% complete".
exitValueThe job's exit value.
userUser name of the job creator.
callbackThe callback URL, if any.
completedA string representing completed status, for example "done".
-
- - -
- Example - -

Curl Command

- -% curl -s -X DELETE 'http://localhost:50111/templeton/v1/queue/job_201111111311_0009?user.name=ctdean' - - -

JSON Output

- -{ - "status": { - "startTime": 1321047216471, - "username": "ctdean", - "jobID": { - "jtIdentifier": "201111111311", - "id": 9 - }, - "jobACLs": { - }, - "schedulingInfo": "NA", - "failureInfo": "NA", - "jobId": "job_201111111311_0009", - "jobPriority": "NORMAL", - "runState": 1, - "jobComplete": false - }, - "profile": { - "url": "http://localhost:50030/jobdetails.jsp?jobid=job_201111111311_0009", - "user": "ctdean", - "jobID": { - "jtIdentifier": "201111111311", - "id": 9 - }, - "queueName": "default", - "jobFile": "hdfs://localhost:9000/tmp/hadoop-ctdean/mapred/staging/ctdean/.staging/job_201111111311_0009/job.xml", - "jobName": "streamjob3322518350676530377.jar", - "jobId": "job_201111111311_0009" - } - "id": "job_201111111311_0009", - "parentId": "job_201111111311_0008", - "percentComplete": "10% complete", - "exitValue": 0, - "user": "ctdean", - "callback": null, - "completed": "false" -} - -

Note: The job is not immediately deleted, therefore the - information returned may not reflect deletion, as in our example. - Use GET queue/:jobid - to monitor the job and confirm that it is eventually deleted.

-
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/queuelist.xml b/hcatalog/src/docs/src/documentation/content/xdocs/queuelist.xml deleted file mode 100644 index 656d1e819716..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/queuelist.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - -
- GET queue -
- - -
- Description -

Return a list of all job IDs registered to the user.

-
- -
- URL -

http://www.myserver.com/templeton/v1/queue

-
- -
- Parameters -

Only the standard parameters - are accepted.

-
- -
- Results - - - - - -
NameDescription
idsA list of all job IDs registered to the user.
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/queue?user.name=ctdean' - - -

JSON Output

- -{ - "job_201111111311_0008", - "job_201111111311_0012" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/readerwriter.xml b/hcatalog/src/docs/src/documentation/content/xdocs/readerwriter.xml deleted file mode 100644 index d83a849c31cc..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/readerwriter.xml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -
- Reader and Writer Interfaces -
- - -

HCatalog provides a data transfer API for parallel input and output -without using MapReduce. This API provides a way to read data from a -Hadoop cluster or write data into a Hadoop cluster, using a basic storage -abstraction of tables and rows.

-

The data transfer API has three essential classes:

-
    -
  • HCatReader – reads data from a Hadoop cluster
  • -
  • HCatWriter – writes data into a Hadoop cluster
  • -
  • DataTransferFactory – generates reader and writer instances
  • -
-

Auxiliary classes in the data transfer API include:

-
    -
  • ReadEntity
  • -
  • ReaderContext
  • -
  • WriteEntity
  • -
  • WriterContext
  • -
-

The HCatalog data transfer API is designed to facilitate integration -of external systems with Hadoop.

- - -
-HCatReader - -

Reading is a two-step process in which the first step occurs on -the master node of an external system. The second step is done in -parallel on multiple slave nodes.

- -

Reads are done on a “ReadEntity”. Before you start to read, you need to define -a ReadEntity from which to read. This can be done through ReadEntity.Builder. You -can specify a database name, table name, partition, and filter string. -For example:

- - -ReadEntity.Builder builder = new ReadEntity.Builder(); -ReadEntity entity = builder.withDatabase(“mydb”).withTable("mytbl").build(); - - -

The code snippet above defines a ReadEntity object ("entity"), -comprising a table named “mytbl” in a database named “mydb”, which can be used -to read all the rows of this table. -Note that this table must exist in HCatalog prior to the start of this -operation.

- -

After defining a ReadEntity, you obtain an instance of HCatReader -using the ReadEntity and cluster configuration:

- - -HCatReader reader = DataTransferFactory.getHCatReader(entity, config); - - -

The next step is to obtain a ReaderContext from reader -as follows:

- - -ReaderContext cntxt = reader.prepareRead(); - - -

All of the above steps occur on the master node. The master node then -serializes this ReaderContext object and sends it to all the slave nodes. -Slave nodes then use this reader context to read data.

- - -for(InputSplit split : readCntxt.getSplits()){ -HCatReader reader = DataTransferFactory.getHCatReader(split, -readerCntxt.getConf()); - Iterator<HCatRecord> itr = reader.read(); - while(itr.hasNext()){ - HCatRecord read = itr.next(); - } -} - - -
- - -
-HCatWriter - -

Similar to reading, writing is also a two-step process in which the first -step occurs on the master node. Subsequently, the second step occurs in -parallel on slave nodes.

- -

Writes are done on a “WriteEntity” which can be constructed in a fashion -similar to reads:

- - -WriteEntity.Builder builder = new WriteEntity.Builder(); -WriteEntity entity = builder.withDatabase(“mydb”).withTable("mytbl").build(); - - -

The code above creates a WriteEntity object ("entity") which can be used -to write into a table named “mytbl” in the database “mydb”.

- -

After creating a WriteEntity, the next step is to obtain a WriterContext:

- - -HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config); -WriterContext info = writer.prepareWrite(); - - -

All of the above steps occur on the master node. The master node then -serializes the WriterContext object and makes it available to all the -slaves.

- -

On slave nodes, you need to obtain an HCatWriter using WriterContext -as follows:

- - -HCatWriter writer = DataTransferFactory.getHCatWriter(context); - - -

Then, writer takes an iterator as the argument for -the write method:

- - -writer.write(hCatRecordItr); - - -

The writer then calls getNext() on this iterator in a loop -and writes out all the records attached to the iterator.

-
- - -
- Complete Example Program -

A complete java program for the reader and writer examples above can be found at: https://svn.apache.org/repos/asf/hive/trunk/hcatalog/core/src/test/java/org/apache/hive/hcatalog/data/TestReaderWriter.java.

- -
- - - - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/renametable.xml b/hcatalog/src/docs/src/documentation/content/xdocs/renametable.xml deleted file mode 100644 index eef8f918abe9..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/renametable.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -
- POST ddl/database/:db/table/:table -
- - -
- Description -

Rename an HCatalog table.

-
- -
- URL -

http://www.myserver.com/templeton/v1/ddl/database/:db/table/:table

-
- -
- Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequired?Default
:dbThe database nameRequiredNone
:tableThe existing (old) table nameRequiredNone
renameThe new table nameRequiredNone
groupThe user group to useOptionalNone
permissionsThe permissions string to use. The format is - "rwxrw-r-x".OptionalNone
-
- -
- Results - - - - - - - - - - - -
NameDescription
tableThe new table name
databaseThe database name
-
- -
- Example - -

Curl Command

- -% curl -s -d user.name=ctdean \ - -d rename=test_table_2 \ - 'http://localhost:50111/templeton/v1/ddl/database/default/table/test_table' - - -

JSON Output

- -{ - "table": "test_table_2", - "database": "default" -} - - -

JSON Output (error)

- -{ - "error": "Table test_table does not exist", - "errorCode": 404, - "database": "default", - "table": "test_table_2" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/resources.xml b/hcatalog/src/docs/src/documentation/content/xdocs/resources.xml deleted file mode 100644 index b9a690e551af..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/resources.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -
- Templeton Resources -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ResourceDescription
:versionReturns a list of supported response types.
statusReturns the Templeton server status.
versionReturns the a list of supported versions and the current version.
ddlPerforms an HCatalog DDL command.
ddl/databaseList HCatalog databases.
ddl/database/:db (GET)Describe an HCatalog database.
ddl/database/:db (PUT)Create an HCatalog database.
ddl/database/:db (DELETE)Delete (drop) an HCatalog database.
ddl/database/:db/tableList the tables in an HCatalog database.
ddl/database/:db/table/:table (GET)Describe an HCatalog table.
ddl/database/:db/table/:table (PUT)Create a new HCatalog table.
ddl/database/:db/table/:table (POST)Rename an HCatalog table.
ddl/database/:db/table/:table (DELETE)Delete (drop) an HCatalog table.
ddl/database/:db/table/:existingtable/like/:newtable (PUT)Create a new HCatalog table like an existing one.
ddl/database/:db/table/:table/partionList all partitions in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (GET)Describe a single partition in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (PUT)Create a partition in an HCatalog table.
ddl/database/:db/table/:table/partion/:partition (DELETE)Delete (drop) a partition in an HCatalog table.
ddl/database/:db/table/:table/columnList the columns in an HCatalog table.
ddl/database/:db/table/:table/column/:column (GET)Describe a single column in an HCatalog table.
ddl/database/:db/table/:table/column/:column (PUT)Create a column in an HCatalog table.
ddl/database/:db/table/:table/property (GET)List table properties.
ddl/database/:db/table/:table/property/:property (GET)Return the value of a single table property.
ddl/database/:db/table/:table/property/:property (PUT)Set a table property.
mapreduce/streamingCreates and queues Hadoop streaming MapReduce jobs.
mapreduce/jarCreates and queues standard Hadoop MapReduce jobs.
pigCreates and queues Pig jobs.
hiveRuns Hive queries and commands.
queueReturns a list of all jobids registered for the user.
queue/:jobid (GET)Returns the status of a job given its ID.
queue/:jobid (DELETE)Kill a job given its ID.
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/responsetypes.xml b/hcatalog/src/docs/src/documentation/content/xdocs/responsetypes.xml deleted file mode 100644 index a54cbd377c1e..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/responsetypes.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - -
- GET :version -
- - -
- Description -

Returns a list of the response types supported by Templeton.

-
- -
- URL -

http://www.myserver.com/templeton/:version

-
- -
- Parameters - - - - - - - - -
NameDescriptionRequired?Default
:versionThe Templeton version number. (Currently this must be "v1")RequiredNone
-
- -
- Results - - - - - - - -
NameDescription
responseTypesA list of all supported response types
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1' - - -

JSON Output

- -{ - "responseTypes": [ - "application/json" - ] -} - - -

JSON Output (error)

- -{ - "error": "null for uri: http://localhost:50111/templeton/v2" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/rest.xml b/hcatalog/src/docs/src/documentation/content/xdocs/rest.xml deleted file mode 100644 index 2c23bff34b1a..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/rest.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -
- HCatalog REST API -
- - -
- Introduction -

This document describes HCatalog REST API. - As shown in the figure below, developers make HTTP requests to access - Hadoop MapReduce, - Pig, - Hive, and - - HCatalog DDL from within applications. - Data and code used by this API is maintained in - HDFS. HCatalog DDL commands - are executed directly when requested. - MapReduce, Pig, and Hive jobs are placed in queue by - and can be monitored for progress or stopped as required. - Developers specify a location - in HDFS into which Pig, Hive, and MapReduce results should be placed.

-
-
- -
- URL format -

HCatalog's REST resources are accessed using the following URL format:

-

http://yourserver/templeton/v1/resource

-

where "yourserver" is replaced with your server name, and - "resource" is replaced by the HCatalog - resource name.

-

For example, to check if the server is running you could - access the following URL:

-

http://www.myserver.com/templeton/v1/status

-
- -
- Security -

The current version supports two types of security:

-
    -
  • Default security (without additional authentication)
  • -
  • Authentication via - Kerberos
  • -
-
- Standard Parameters -

Every REST resource can accept the following parameters to - aid in authentication:

-
    -
  • user.name: The user name as a string. - Only valid when using default security.
  • -
  • SPNEGO credentials: When running with Kerberos authentication.
  • -
-
- -
- Security Error Response -

If the user.name parameter is not supplied when required, - the following error will be returned:

- -{ - "error": "No user found. Missing user.name parameter." -} - -
- -
- -
- WebHDFS and Code Push -

Data and code that are used by HCatalog's REST resources must first be placed in - Hadoop. When placing files into HDFS is required you can use - whatever method is most convienient for you. We suggest WebHDFS since it provides - a REST interface for moving files into and out of HDFS.

-
- -
- Error Codes and Responses -

The server returns the following HTTP status codes.

-
    -
  • 200 OK: Success!
  • -
  • 400 Bad Request: The request was invalid.
  • -
  • 401 Unauthorized: Credentials were missing or incorrect.
  • -
  • 404 Not Found: The URI requested is invalid or the - resource requested does not exist.
  • -
  • 500 Internal Server Error: We received an unexpected result.
  • -
  • 503 Busy, please retry: The server is busy.
  • -
-

Other data returned directly by the server is returned in JSON format. - JSON responses are limited to 1MB in size. Responses over this limit must be - stored into HDFS using provided options instead of being directly returned. - If an HCatalog DDL command might return results greater than 1MB, it's - suggested that a corresponding Hive request be executed instead.

-
- -
- Log Files -

The server creates three log files when in operation:

-
    -
  • templeton.log is the log4j log. This the main log the application - writes to.
  • -
  • templeton-console.log is what Java writes to stdout when the server is - started. It is a small amount of data, similar to "hcat.out".
  • -
  • tempelton-console-error.log is what Java writes to stderr, similar to - "hcat.err".
  • -
-

In the tempelton-log4j.properties file you can set the location of these logs using the - variable templeton.log.dir. This log4j.properties file is set in the server startup script.

-
- -
- Project Name -

The original work to add REST APIs to HCatalog was called Templeton. For backward compatibility - the name still appears in URLs, log file names, etc. The Templeton name is taken from a character - in the award-winning children's novel Charlotte's Web, by E. B. White. The novel's protagonist is a pig named - Wilber. Templeton is a rat who helps Wilber by running errands and making deliveries as - requested by Charlotte while spinning her web.

-
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/rest_server_install.xml b/hcatalog/src/docs/src/documentation/content/xdocs/rest_server_install.xml deleted file mode 100644 index ae4814a24814..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/rest_server_install.xml +++ /dev/null @@ -1,258 +0,0 @@ - - - - - -
- Installation -
- - -
- Procedure -
    -
  1. Ensure that the - required related installations - are in place, and place required files into the - Hadoop distributed cache.
  2. -
  3. Download and unpack the HCatalog distribution.
  4. -
  5. Set the TEMPLETON_HOME environment variable to the base of the - HCatalog REST server installation. This will usually be same as - HCATALOG_HOME. - This is used to find the Templeton - configuration.
  6. -
  7. Set JAVA_HOME,HADOOP_PREFIX, and HIVE_HOME environment variables
  8. -
  9. Review the configuration - and update or create webhcat-site.xml as required. Ensure that - site specific component installation locations are accurate, especially - the Hadoop configuration path. Configuration variables that use a filesystem - path try to have reasonable defaults, but it's always safe to specify a full - and complete path.
  10. -
  11. Verify that HCatalog is installed and that the hcat - executable is in the PATH.
  12. -
  13. Build HCatalog using the command ant jar from the - top level HCatalog directory.
  14. -
  15. Start the REST server with the command - sbin/webhcat_server.sh start.
  16. -
  17. Check that your local install works. Assuming that the server is running - on port 50111, the following command would give output similar to that shown. - -% curl -i http://localhost:50111/templeton/v1/status -HTTP/1.1 200 OK -Content-Type: application/json -Transfer-Encoding: chunked -Server: Jetty(7.6.0.v20120127) - -{"status":"ok","version":"v1"} -% -
  18. -
-
- -
- Server Commands -
    -
  • Start the server: sbin/webhcat_server.sh start
  • -
  • Stop the server: sbin/webhcat_server.sh stop
  • -
  • End-to-end build, run, test: ant e2e
  • -
-
- -
- Requirements -
    -
  • Ant, version 1.8 or higher
  • -
  • Hadoop, version 1.0.3 or higher
  • -
  • ZooKeeper is required if you are using - the ZooKeeper storage class. (Be sure to review - and update the ZooKeeper related Templeton - configuration.)
  • -
  • - HCatalog. - Version 0.5.0 or higher. The hcat executable must be both in the - PATH and properly configured in the Templeton configuration. -
  • -
  • - Permissions must be given to the user running the server. - (see below) -
  • -
  • - If running a secure cluster, Kerberos keys and principals must be - created. (see below) -
  • -
  • Hadoop Distributed Cache. - To use the Hive, - Pig, or - hadoop/streaming - resources, see instructions below for placing the required files in the - Hadoop Distributed Cache.
  • -
-
- -
- Hadoop Distributed Cache - -

The server requires some files be accessible on the - - Hadoop distributed cache. For example, to avoid the installation of Pig and Hive - everywhere on the cluster, the server gathers a version of Pig or Hive from the - Hadoop distributed cache whenever those resources are invoked. After placing the - following components into HDFS please update the site configuration as required for - each.

- -
    -
  • Hive: - Download - the hive tar.gz file and place it in HDFS. - -hadoop fs -put /tmp/hive-0.10.0.tar.gz /apps/templeton/hive-0.10.0.tar.gz - -
  • - -
  • Pig: - Download - the Pig tar.gz file and place it into HDFS. For example: - -hadoop fs -put /tmp/pig-0.10.1.tar.gz /apps/templeton/pig-0.10.1.tar.gz - -
  • - -
  • Hadoop Streaming: - Place hadoop-streaming.jar into HDFS. For example, use the - following command, substituting your path to the jar for the one below. - -hadoop fs -put $HADOOP_PREFIX/hadoop-0.20.205.0/contrib/streaming/hadoop-streaming-0.20.205.0.jar \ - /apps/templeton/hadoop-streaming.jar - -
  • - -
  • Override Jars: - Place override jars required (if any) into HDFS. Note: Hadoop versions - prior to 1.0.3 require a patch (HADOOP-7987) to properly run Templeton. This patch is - distributed with Templeton (located at - templeton/src/hadoop_temp_fix/ugi.jar) - and should be placed into HDFS, as reflected in the current default configuration. - -hadoop fs -put ugi.jar /apps/templeton/ugi.jar - -
  • -
- -

The location of these files in the cache, and the location - of the installations inside the archives, can be specified using the following - Templeton configuration variables. (See the - Configuration documentation for more information - on changing Templeton configuration parameters.)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDefaultDescription
templeton.pig.archivehdfs:///apps/templeton/pig-0.10.1.tar.gzThe path to the Pig archive.
templeton.pig.pathpig-0.10.1.tar.gz/pig-0.10.1/bin/pigThe path to the Pig executable.
templeton.hive.archivehdfs:///apps/templeton/hive-0.10.0.tar.gzThe path to the Hive archive.
templeton.hive.pathhive-0.10.0.tar.gz/hive-0.10.0/bin/hiveThe path to the Hive executable.
templeton.streaming.jarhdfs:///apps/templeton/hadoop-streaming.jarThe path to the Hadoop streaming jar file.
templeton.override.jarshdfs:///apps/templeton/ugi.jarJars to add to the HADOOP_CLASSPATH for all Map Reduce jobs. - These jars must exist on HDFS.
-
- -
- Permissions -

- Permission must given for the user running the templeton - executable to run jobs for other users. That is, the templeton - server will impersonate users on the Hadoop cluster. -

- -

- Create (or assign) a Unix user who will run the Templeton server. - Call this USER. See the Secure Cluster section below for choosing - a user on a Kerberos cluster. -

- -

- Modify the Hadoop core-site.xml file and set these properties: -

- - - - - - - - - - - -
VariableValue
hadoop.proxyuser.USER.groups - A comma separated list of the Unix groups whose users will be - impersonated. -
hadoop.proxyuser.USER.hosts - A comma separated list of the hosts that will run the hcat and - JobTracker servers. -
-
- -
- Secure Cluster -

- To run Templeton on a secure cluster follow the Permissions - instructions above but create a Kerberos principal for the - Templeton server with the name USER/host@realm -

- -

- Also, set the templeton configuration variables - templeton.kerberos.principal and - templeton.kerberos.keytab -

-
- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/site.xml b/hcatalog/src/docs/src/documentation/content/xdocs/site.xml deleted file mode 100644 index 23e5e1c9a714..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/site.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/status.xml b/hcatalog/src/docs/src/documentation/content/xdocs/status.xml deleted file mode 100644 index 870ab79334e6..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/status.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -
- GET status -
- - -
- Description -

Returns the current status of the Templeton server. - Useful for heartbeat monitoring.

-
- -
- URL -

http://www.myserver.com/templeton/v1/status

-
- -
- Parameters -

Only the standard parameters - are accepted.

-
- -
- Results - - - - - - - - - - -
NameDescription
status"ok" if the Templeton server was contacted.
versionString containing the version number similar to "v1".
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/status' - - -

JSON Output

- -{ - "status": "ok", - "version": "v1" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/supportedformats.xml b/hcatalog/src/docs/src/documentation/content/xdocs/supportedformats.xml deleted file mode 100644 index f8e61d9a4487..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/supportedformats.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -
- Storage Formats -
- -

As of version 0.4, HCatalog uses Hive's SerDe class to serialize and deserialize data. SerDes are provided for RCFile, CSV text, JSON text, and SequenceFile formats.

- -

Users can write SerDes for custom formats using the instructions at https://cwiki.apache.org/confluence/display/Hive/SerDe.

- -

Usage from Hive

- -

As of 0.4, Hive and HCatalog share the same storage abstractions, and thus, you can read from and write to HCatalog tables from within Hive, and vice versa.

- -

However, Hive does not know where to find the HCatalog jar by default, so if you use any features that have been introduced by HCatalog, such as a table using the JSON SerDe, you might get a "class not found" exception. -In this situation, before you run Hive, set environment variable HIVE_AUX_JARS_PATH to the directory with your HCatalog jar. -(If the examples in the Installation document were followed, that should be /usr/local/hcat/share/hcatalog/).

- -

CTAS Issue with JSON SerDe

- -

Using the Hive CREATE TABLE ... AS SELECT command with a JSON SerDe -results in a table that has column headers such as "_col0", -which can be read by HCatalog or Hive but cannot be easily read by external users. -To avoid this issue, create the table in two steps instead of using CTAS:

-
    -
  1. CREATE TABLE ...
  2. -
  3. INSERT OVERWRITE TABLE ... SELECT ...
  4. -
- -

See HCATALOG-436 for details.

- - -
diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/tabs.xml b/hcatalog/src/docs/src/documentation/content/xdocs/tabs.xml deleted file mode 100644 index ea7e038b8a4d..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/tabs.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - diff --git a/hcatalog/src/docs/src/documentation/content/xdocs/versions.xml b/hcatalog/src/docs/src/documentation/content/xdocs/versions.xml deleted file mode 100644 index bfaf93664f13..000000000000 --- a/hcatalog/src/docs/src/documentation/content/xdocs/versions.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -
- GET version -
- - -
- Description -

Returns a list of supported versions and the current version.

-
- -
- URL -

http://www.myserver.com/templeton/v1/version

-
- -
- Parameters -

Only the standard parameters - are accepted.

-
- -
- Results - - - - - - - - - - - -
NameDescription
supportedVersionsA list of all supported versions.
versionThe current version.
-
- -
- Example - -

Curl Command

- -% curl -s 'http://localhost:50111/templeton/v1/version' - - -

JSON Output

- -{ - "supportedVersions": [ - "v1" - ], - "version": "v1" -} - -
- -
diff --git a/hcatalog/src/docs/src/documentation/resources/images/ellipse-2.svg b/hcatalog/src/docs/src/documentation/resources/images/ellipse-2.svg deleted file mode 100644 index 32df27eb791a..000000000000 --- a/hcatalog/src/docs/src/documentation/resources/images/ellipse-2.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Ellipse - - - diff --git a/hcatalog/src/docs/src/documentation/sitemap.xmap b/hcatalog/src/docs/src/documentation/sitemap.xmap deleted file mode 100644 index ca7a5353dac9..000000000000 --- a/hcatalog/src/docs/src/documentation/sitemap.xmap +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hcatalog/src/docs/src/documentation/skinconf.xml b/hcatalog/src/docs/src/documentation/skinconf.xml deleted file mode 100644 index e2d9f1de92fa..000000000000 --- a/hcatalog/src/docs/src/documentation/skinconf.xml +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - - - - - - true - - false - - true - - true - - - true - - true - - true - - true - .at. - - true - - - HCatalog - A table abstraction on top of data for use with java MapReduce programs, Pig scripts and Hive queryies. - - images/hcat-box.jpg - - - - - HCatalog - - - images/hcat.jpg - - - - - - - - - - - - false - - - 2012 - The Apache Software Foundation - - - http://www.apache.org/licenses/ - - - - - - - - - - - - - - - - - - - - p.quote { - margin-left: 2em; - padding: .5em; - background-color: #f0f0f0; - font-family: monospace; - } - p.cell { - margin-left: .5em; - padding: .25em; - } - p.center { - text-align: center; - padding: .25em; - } - - #footer a { color: #0F3660; } - #footer a:visited { color: #009999; } - - - - #content h1 { - margin-bottom: .5em; - font-size: 200%; color: black; - font-family: arial; - } - h2, .h3 { font-size: 195%; color: black; font-family: arial; } - h3, .h4 { font-size: 140%; color: black; font-family: arial; margin-bottom: 0.5em; } - h4, .h5 { font-size: 125%; color: black; font-style: italic; font-weight: bold; font-family: arial; } - h5, h6 { font-size: 110%; color: #363636; font-weight: bold; } - - pre.code { - margin-left: 0em; - padding: 0.5em; - background-color: rgb(241,239,231); - font-family: monospace; - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Page 1 - - - 1in - 1in - 1.25in - 1in - - - false - - false - - -