All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aliyun.odps.graph.MutationContext Maven / Gradle / Ivy

/*
 * 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.
 */

package com.aliyun.odps.graph;

import java.io.BufferedInputStream;
import java.io.IOException;

import com.aliyun.odps.conf.Configuration;
import com.aliyun.odps.counter.Counter;
import com.aliyun.odps.data.TableInfo;
import com.aliyun.odps.io.Writable;
import com.aliyun.odps.io.WritableComparable;
import com.aliyun.odps.io.WritableRecord;

/**
 * MutationContext 定义了支持图拓扑变化的接口,包括增加/删除点或边.
 *
 * 

* MutationContext 接口可以在两个用户自定义方法中使用: *

    *
  • * {@link GraphLoader#load(com.aliyun.odps.io.LongWritable, com.aliyun.odps.Record, * MutationContext)} * 用于加载图; *
  • {@link Vertex#compute(ComputeContext, Iterable)} * 在每一轮超步中用于修改图的拓扑结构,图拓扑结构变化将在下一轮超步生效; *
*

* *

* 图拓扑结构的变化可能存在冲突,例如增加两个相同 ID 的点等等,可以提供冲突解决类自定义冲突处理方法: *

    *
  • * {@link GraphJob#setLoadingVertexResolverClass(Class)} 设置图加载过程的自定义冲突处理类; *
  • * {@link GraphJob#setComputingVertexResolverClass(Class)} 设置图迭代过程的自定义冲突处理类; *
*

* * @param * Vertex ID 类型 * @param * Vertex Value 类型 * @param * Edge Value 类型 * @param * Message 类型 * @see VertexResolver */ @SuppressWarnings("rawtypes") public interface MutationContext { /** * 获取作业配置. * * 在 {@link GraphJob} 设置的配置参数可以从作业配置中读取 * *

* 注意:这里只能get配置参数,而不能set配置参数 *

* * @return ODPS Graph 作业配置 */ public abstract Configuration getConfiguration(); /** * 获取 Worker 数目. * * @return Worker 数目 */ public abstract int getNumWorkers(); /** * 增加点请求,下一轮生效. * *

* 冲突处理需要提供 {@link VertexResolver} * * @param vertex * 待增加点的 Vertex 对象,应保证该对象不被复用,包括对象的成员变量 * @throws IOException */ public void addVertexRequest(Vertex vertex) throws IOException; /** * 删除点请求,下一轮生效. * *

* 冲突处理需要提供 {@link VertexResolver} * * @param vertexId * 待删除点的 ID * @throws IOException */ public void removeVertexRequest(I vertexId) throws IOException; /** * 增加边请求,下一轮生效。 * *

* 冲突处理需要提供 {@link VertexResolver} * * @param sourceVertexId * 待增加边的起点 * @param edge * 待增加边,应保证该对象不被复用,包括对象的成员变量 * @throws IOException */ public abstract void addEdgeRequest(I sourceVertexId, Edge edge) throws IOException; /** * 删除边请求,下一轮生效。 * *

* 冲突处理需要提供 {@link VertexResolver} * * @param sourceVertexId * 待删除边的起点 * @param targetVertexId * 待删除边的终点,应保证该对象不被复用 * @throws IOException */ public void removeEdgeRequest(I sourceVertexId, I targetVertexId) throws IOException; /** * 获取给定名称的Counter对象,name为{@link Enum} * * @param name * Counter名称 * @return */ public abstract Counter getCounter(Enum name); /** * 获取给定组名和名称的 Counter 对象. * * @param group * Counter 组名 * @param name * Counter 名 * @return */ public abstract Counter getCounter(String group, String name); /** * 读取文件类型资源,一次全部读取到内存,返回 byte[]. * *

* 如果资源文件比较大,应该使用{@link #readCacheFileAsStream(String)} * 获得一个带缓存的输入流,支持边读边处理,防止Java内存溢出 *

* *

* 使用文件类型资源步骤:
*

    *
  1. 上传资源文件: console < add file res_file.txt; *
  2. 运行 ODPS Graph 作业命令: console < jar -resources res_file.txt ...,或者使用API( * {@link JobConf#addCacheResources(String)}) *
  3. ODPS Graph 作业里读取资源:context.readCacheFile("res_file.txt"); *
*

* *

* 资源文件在运行时会下载到所在的节点机器上并缓存,类似于Hadoop的DistributedCache *

* * @param resourceName * 资源名称 * @return 资源内容 * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheFileAsStream(String) */ public abstract byte[] readCacheFile(String resourceName) throws IOException; /** * 读取文件类型资源,返回一个带缓存的输入流. * *

* readCacheFileAsStream * 支持边读边处理(常见的场景是读取一行处理一行),适合读取比较大的文件资源,防止Java内存溢出,如果文件资源比较小,也可以直接使用 * {@link #readCacheFile(String)} 方法一次性读取到内存。 *

* *

* 使用文件类型资源步骤类似{@link #readCacheFile(String)} *

* * @param resourceName * 资源名称 * @return 资源内容的BufferedInputStream * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheFile(String) */ public abstract BufferedInputStream readCacheFileAsStream(String resourceName) throws IOException; /** * 读取压缩档案类型资源,返回解压后的所有文件内容的迭代器. * *

* 如果文件内容比较大,应该使用 {@link #readCacheArchiveAsStream(String)} * ,支持边读边处理,防止Java内存溢出。 *

* *

* 使用压缩档案类型资源步骤:
*

    *
  1. 上传资源压缩包: console < add archive ref_archive.tar.gz; *
  2. 运行 ODPS Graph 作业命令: console < jar -resources ref_archive.tar.gz * ...,或者使用API( {@link JobConf#addCacheResources(String)}) *
  3. ODPS Graph 里读取资源:context.readCacheArchive("ref_archive.tar.gz"); *
*

* *

* 资源压缩包在Worker运行时会下载到所在的节点机器上并缓存,类似于Hadoop的DistributedCache *

* * @param resourceName * 资源名称 * @return 压缩包解压后的所有文件内容迭代器 * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheArchiveAsStream(String) */ public abstract Iterable readCacheArchive(String resourceName) throws IOException; /** * 读取压缩档案类型资源,可以传入一个相对路径读取部分文件. * *

* 与{@link #readCacheArchive(String)} 不同的是可以传入一个相对路径,用于读取压缩包里的部分文件的内容,更多说明见 * {@link #readCacheArchive(String)}方法 *

* *

* 读取压缩包内子目录的代码示例: * *

   * Iterable<byte[]> iter = context.readCacheArchiveAsStream(RESOURCE_ARCHIVE,
   *     "subdir/*");
   * for (byte[] content : iter) {
   * }
   * 
* *

* * @param resourceName * 资源名称 * @param relativePath * 读取资源的相对路径 * @return 文件内容迭代器 * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheArchiveAsStream(String) */ public abstract Iterable readCacheArchive(String resourceName, String relativePath) throws IOException; /** * 读取压缩档案类型资源,返回 BufferedInputStream 的迭代器. * * @param resourceName * 资源名称 * @return BufferedInputStream的迭代器 * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheArchive(String) */ public abstract Iterable readCacheArchiveAsStream( String resourceName) throws IOException; /** * 读取压缩档案类型资源,返回 BufferedInputStream 的迭代器. * * @param resourceName * 资源名称 * @param relativePath * 读取资源的相对路径 * @return BufferedInputStream的迭代器 * @throws IOException * 资源未声明、资源类型不匹配以及其他读取错误抛异常 * @see #readCacheArchive(String, String) */ public abstract Iterable readCacheArchiveAsStream( String resourceName, String relativePath) throws IOException; /** * 读取表类型资源,ODPS的小表(Table)也可以作为资源,大小限制参见ODPS的相关文档. * *

* 使用表类型资源步骤:
*

    *
  1. 增加资源表: console < add table my_table partition(ds='1') as res_table; *
  2. 运行 ODPS Graph 作业命令: console < jar -resources res_table ...,或者使用API( * {@link JobConf#addCacheResources(String)}) *
  3. ODPS Graph 里读取资源:context.readResourceTable("res_table"); *
*

* *

* 代码示例: * *

   * Iterable<WritableRecord> iter = context.readResourceTable("res_table");
   * for (WritableRecord record : iter) {
   *   // handle record
   * }
   * 
* * @param resourceName * 表类型资源名称 * @return 记录迭代器 * @throws IOException * 资源未声明、资源类型不匹配以及其他错误抛异常 */ public abstract Iterable readResourceTable(String resourceName) throws IOException; /** * 获取表类型资源对应的表信息,包括Project、表名称、分区等信息. * * @param resourceName * 表类型资源名称 * @return 表信息 * @throws IOException * 资源未声明、资源类型不匹配以及其他错误抛异常 */ public abstract TableInfo getResourceTable(String resourceName) throws IOException; }