From 5becd8a5b2eb9d11f41152f50af40ec6233e007e Mon Sep 17 00:00:00 2001 From: Venkatesh Seetharam <venkatesh@apache.org> Date: Tue, 19 May 2015 16:13:43 -0700 Subject: [PATCH] Add Lineage Graph API --- repository/src/main/java/org/apache/hadoop/metadata/discovery/HiveLineageService.java | 37 ++++++++++++++++++++++++++++++++++++- repository/src/main/java/org/apache/hadoop/metadata/discovery/LineageService.java | 16 ++++++++++++++++ webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 122 insertions(+), 3 deletions(-) diff --git a/repository/src/main/java/org/apache/hadoop/metadata/discovery/HiveLineageService.java b/repository/src/main/java/org/apache/hadoop/metadata/discovery/HiveLineageService.java index 0c65dc3..6ade9eb 100644 --- a/repository/src/main/java/org/apache/hadoop/metadata/discovery/HiveLineageService.java +++ b/repository/src/main/java/org/apache/hadoop/metadata/discovery/HiveLineageService.java @@ -19,7 +19,6 @@ package org.apache.hadoop.metadata.discovery; import com.thinkaurelius.titan.core.TitanGraph; -import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.hadoop.metadata.MetadataException; import org.apache.hadoop.metadata.PropertiesUtil; @@ -116,6 +115,24 @@ public class HiveLineageService implements LineageService { } /** + * Return the lineage outputs graph for the given tableName. + * + * @param tableName tableName + * @return Outputs Graph as JSON + */ + @Override + public String getOutputsGraph(String tableName) throws DiscoveryException { + LOG.info("Fetching lineage outputs graph for tableName={}", tableName); + + HiveWhereUsedQuery outputsQuery = new HiveWhereUsedQuery( + HIVE_TABLE_TYPE_NAME, tableName, HIVE_PROCESS_TYPE_NAME, + HIVE_PROCESS_INPUT_ATTRIBUTE_NAME, HIVE_PROCESS_OUTPUT_ATTRIBUTE_NAME, + Option.empty(), SELECT_ATTRIBUTES, true, + graphPersistenceStrategy, titanGraph); + return outputsQuery.graph().toInstanceJson(); + } + + /** * Return the lineage inputs for the given tableName. * * @param tableName tableName @@ -141,6 +158,24 @@ public class HiveLineageService implements LineageService { } /** + * Return the lineage inputs graph for the given tableName. + * + * @param tableName tableName + * @return Inputs Graph as JSON + */ + @Override + public String getInputsGraph(String tableName) throws DiscoveryException { + LOG.info("Fetching lineage inputs graph for tableName={}", tableName); + + HiveLineageQuery inputsQuery = new HiveLineageQuery( + HIVE_TABLE_TYPE_NAME, tableName, HIVE_PROCESS_TYPE_NAME, + HIVE_PROCESS_INPUT_ATTRIBUTE_NAME, HIVE_PROCESS_OUTPUT_ATTRIBUTE_NAME, + Option.empty(), SELECT_ATTRIBUTES, true, + graphPersistenceStrategy, titanGraph); + return inputsQuery.graph().toInstanceJson(); + } + + /** * Return the schema for the given tableName. * * @param tableName tableName diff --git a/repository/src/main/java/org/apache/hadoop/metadata/discovery/LineageService.java b/repository/src/main/java/org/apache/hadoop/metadata/discovery/LineageService.java index f2638e5..72e4ff9 100644 --- a/repository/src/main/java/org/apache/hadoop/metadata/discovery/LineageService.java +++ b/repository/src/main/java/org/apache/hadoop/metadata/discovery/LineageService.java @@ -32,6 +32,14 @@ public interface LineageService { String getOutputs(String tableName) throws DiscoveryException; /** + * Return the lineage outputs graph for the given tableName. + * + * @param tableName tableName + * @return Outputs Graph as JSON + */ + String getOutputsGraph(String tableName) throws DiscoveryException; + + /** * Return the lineage inputs for the given tableName. * * @param tableName tableName @@ -40,6 +48,14 @@ public interface LineageService { String getInputs(String tableName) throws DiscoveryException; /** + * Return the lineage inputs graph for the given tableName. + * + * @param tableName tableName + * @return Inputs Graph as JSON + */ + String getInputsGraph(String tableName) throws DiscoveryException; + + /** * Return the schema for the given tableName. * * @param tableName tableName diff --git a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java index 108b4a9..a58cccc 100644 --- a/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java +++ b/webapp/src/main/java/org/apache/hadoop/metadata/web/resources/HiveLineageResource.java @@ -93,6 +93,40 @@ public class HiveLineageResource { } /** + * Returns the inputs graph for a given entity. + * + * @param tableName table name + */ + @GET + @Path("table/{tableName}/inputs/graph") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response inputsGraph(@Context HttpServletRequest request, + @PathParam("tableName") String tableName) { + Preconditions.checkNotNull(tableName, "table name cannot be null"); + LOG.info("Fetching lineage inputs graph for tableName={}", tableName); + + try { + final String jsonResult = lineageService.getInputsGraph(tableName); + + JSONObject response = new JSONObject(); + response.put(MetadataServiceClient.REQUEST_ID, Servlets.getRequestId()); + response.put("tableName", tableName); + response.put(MetadataServiceClient.RESULTS, new JSONObject(jsonResult)); + + return Response.ok(response).build(); + } catch (DiscoveryException e) { + LOG.error("Unable to get lineage inputs graph for table {}", tableName, e); + throw new WebApplicationException( + Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST)); + } catch (JSONException e) { + LOG.error("Unable to get lineage inputs graph for table {}", tableName, e); + throw new WebApplicationException( + Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); + } + } + + /** * Returns the outputs for a given entity. * * @param tableName table name @@ -117,11 +151,45 @@ public class HiveLineageResource { return Response.ok(response).build(); } catch (DiscoveryException e) { - LOG.error("Unable to get lineage inputs for table {}", tableName, e); + LOG.error("Unable to get lineage outputs for table {}", tableName, e); throw new WebApplicationException( Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST)); } catch (JSONException e) { - LOG.error("Unable to get lineage inputs for table {}", tableName, e); + LOG.error("Unable to get lineage outputs for table {}", tableName, e); + throw new WebApplicationException( + Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); + } + } + + /** + * Returns the outputs graph for a given entity. + * + * @param tableName table name + */ + @GET + @Path("table/{tableName}/outputs/graph") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response outputsGraph(@Context HttpServletRequest request, + @PathParam("tableName") String tableName) { + Preconditions.checkNotNull(tableName, "table name cannot be null"); + LOG.info("Fetching lineage outputs graph for tableName={}", tableName); + + try { + final String jsonResult = lineageService.getOutputs(tableName); + + JSONObject response = new JSONObject(); + response.put(MetadataServiceClient.REQUEST_ID, Servlets.getRequestId()); + response.put("tableName", tableName); + response.put(MetadataServiceClient.RESULTS, new JSONObject(jsonResult)); + + return Response.ok(response).build(); + } catch (DiscoveryException e) { + LOG.error("Unable to get lineage outputs graph for table {}", tableName, e); + throw new WebApplicationException( + Servlets.getErrorResponse(e, Response.Status.BAD_REQUEST)); + } catch (JSONException e) { + LOG.error("Unable to get lineage outputs graph for table {}", tableName, e); throw new WebApplicationException( Servlets.getErrorResponse(e, Response.Status.INTERNAL_SERVER_ERROR)); } -- libgit2 0.27.1