+ All Categories
Home > Documents > GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data...

GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data...

Date post: 28-May-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
46
Scalable Graph Construction using Apache TM Hadoop TM Intel Labs GraphBuilder Acknowledgements: Carlos Guestrin et al. (CMU/UW) (Collaboration through Intel Science and Technology Center) Ted Frank Jay
Transcript
Page 1: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Scalable Graph Construction using ApacheTM HadoopTM

Intel Labs

GraphBuilder

Acknowledgements: Carlos Guestrin et al. (CMU/UW)

(Collaboration through Intel Science and Technology Center)

Ted

Frank

Jay

Page 2: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

2

Data Analytics and Machine Learning Framework

Page 3: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

English translation of “Vielleicht noch mehr als der Berührung der Menschheit mit der Natur verdankt die Graphentheorie der Berührung der Menschen untereinander.”

“Perhaps even more than to the link between mankind and nature, graph theory owes to the link of human beings between each other.”

Dénes König

Image source: [Wikipedia]

From 1st Graph Theory Book (1936)

Page 4: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

1736

Leonhard Euler

1850

Francis Guthrie William Rowan Hamilton

1936

Dénes König

1969

Frank Harary

21st Century 1985+

Computing

Revolution

Internet

A

C

B

D

Bridges of Königsberg Frank Harary’s bibliography Wordle

Image source: [Wikipedia] [msclub.info] [divisbyzero.com] [Wordle.com] [nature.com]

Social links

Page 5: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Natural graphs Graphs derived from natural

phenomena.

Page 6: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Me You

Don’t have idealized structure

Page 7: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Vertex view

http://inmaps.linkedinlabs.com/

Don’t have regularized structure

Over lapping communities

Page 8: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Natural graphs follow

preferential attachments

They grow with time

“Rich get Richer”

Image source: [Wikipedia]

Page 9: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Twitter Follow Graph

|V| 41M, |E| 1.4B

Power-Law Degree Distribution

Top 1% of vertices are

adjacent to 50% of the edges!

High-Degree

Vertices

Nu

mb

er o

f V

erti

ces

More than 106 vertices

have one neighbor.

Out Degree Image source: [Wikipedia] [cmu.edu/~pegasus]

Page 10: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Graphs are omnipresent!

Internet Social Network

e-commerce

Human Brain

Online Services Science

100B Neuron

100T Relationships 1B Users

140B Friendships

1Trillion

Pages

100s T Links

Image source: [Wikipedia][alz.org] [Facebook]

Millions of

Products &

Users

27M Users

70K Movies

Large Biological

Cell Networks

Big in size and rich in metadata

Page 11: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Graphs are Essential to

Data Mining and Machine Learning

• Identify influential people and information

• Find communities

• Understand people’s shared interests

• Model complex data dependencies

11

Page 12: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Identifying influential people

Social Networking

Data

Graph Construction

Data-Parallel

Feature

Extraction

Graph

Formation

Graph

Image source: [Wikipedia]

Construct a graph

Page 13: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

PageRank:

[Page et al. 1998]

Need a Model (Algorithm)

Page 14: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Rank?

Depends on rank of who follows her

Depends on rank of who follows them…

Loops in graph - Must iterate!

What’s the rank of this user?

How many people are pointing to you and

what’s their relative importance?

Graphics source: [Joseph Gonzalez (CMU)]

Page 15: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Properties of Graph-Structured

Computation

Iterative

Computations

Similar properties for many other problems!

Dependency

Graph

Local

Update

Graphics source: [Joseph Gonzalez (CMU)]

Page 16: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

How do we program graph

computation?

“Think like a Vertex” Malewicz et al. [SIGMOD’10]

Page 17: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

The Graph-Parallel Abstraction A user-defined Vertex-Program runs on each vertex Graph constrains interaction along edges

Using messages

Through shared state

Parallelism: Run multiple vertex programs simultaneously

Graphics source: [Joseph Gonzalez (CMU)]

Page 18: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Distributed Graph Analytics System

Structured

Machine

Learning or

Data Mining

(Identify influential person)

Image source: [Wikipedia]

Value

Data

Graph Ingress mostly data-parallel

Graph-Structured

Computation graph-parallel

Efficient design requires balanced utilization

Graph

Construction (Feature Extraction, Graph

formation)

Graph

Page 19: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Too Big to fit (in system memory)

Balanced cut (Power-law graphs are difficult to cut)

Work imbalance (Execution on vertex is proportional to degree of vertex)

System-Level Challenges

1B User, 140B relationship

Image source: [Facebook]

Page 20: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

http://inmaps.linkedinlabs.com/

Difficult to Partition

Power-Law graphs do not have low-cost balanced cuts [Leskovec et al. 08, Lang 04]

Page 21: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Partitioning Approaches Impact on system performance

Edge cut:

Vertex cut:

Machine 1 Machine 2

Y Y Must synchronize

many edges

Machine 1 Machine 2

Y Y Must synchronize

a single vertex

Any edge cut can directly construct a vertex cut

which requires strictly less communications and

storage. [Gonzalez et al. 2012]

Percolation theory suggests that power law graphs

have good vertex cuts. [Albert et al. 2000]

Graphics source: [Joseph Gonzalez (CMU)]

Page 22: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Distributed Graph Analytics

Environment

Machine 1 Machine 2

Program

For This Run on This

Master Slave

Split High-Degree vertices

Graphics source: [Joseph Gonzalez (CMU)]

Page 23: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Graph-Structured Computational

Frameworks Pregel - Malewicz et al. [PODC’09, SIGMOD’10]

Carlos Guestrin et al. [UAI’10, OSDI’12]

Apache Giraph 2011

Others: Kineograph, Stanford GPS, Dryad, BoostPGL, Pegasus, Microsoft

Trinity, and Signal-Collect

Page 24: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

PageRank Performance

Twitter Graph |V| 41M |E| 1.4 Billion 8-node Intel Sandy Bridge E3-1280 Cluster, 16GB/node, 10GbE, 2x SSDs (550 MB/s each)

Hadoop

GraphLab

13.3 hrs

14 min 57x

Not a natural fit for Graph-Parallel Abstraction

Must store graph’s state after every iteration

Page 25: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Graph Construction

Page 26: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

“I spend more than half of my time integrating, cleansing and transforming data without doing any actual analysis.

Most of the time I’m lucky if I get to do any analysis at all.”

Anonymous Data Scientist from Jeff Heer’s (Stanford) interview study,

2012

Page 27: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Building Graphs for Practical Apps

XML

Docs

Extract

Doc & Words

Bipartite

(Doc, Words)

Word

Frequency

or TFIDF

Activity

Logs

Extract User

Item and

Rating

Bipartite

(User, item) Rating

Recommendation

System

Hidden Topic

analysis

Pre-

processing

Raw

Data

Graph

Formation

Add Network

Information

Influential

Person

Social

Networking Directed Graph

Extract User

and Relationship N/A

Page 28: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

• Minimize the use of system resources, like memory,

storage, etc.

• Natural Graph partitioning to ensure computational

effort is load balanced

• Do our best to ensure the graph we generated is the

one we intended to

And, in practice and at scale we must:

but the Data Scientist shouldn’t be responsible for

this domain expertise!

Pre-

processing

Raw

Data

Graph

Formation

Add Network

Information Finalize for Parallel

Computation

Page 29: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Data Store

Graph Abstraction

Graph Computation

Hidden

Topic Analysis Relative

Ranking Analysis

Graph Abstraction Library: GraphBuilder

Offloads domain expertise

Written in Java for easy use in

Hadoop MapReduce and

applications

Completes Graph Analytics

pipeline

Page 30: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

GraphBuilder Data flow

Extract Transform Load

App-Specific Code

GraphBuilder Library

Graph formation from

data source(s)

Apply cleaning and

transformation

Prepare for graph

analytics

HDFS

DB

XML Docs

Feature Extraction

Tabulation

Graph Checks

and Transformation

Graph Compression,

Partitioning, and

Serialization

Page 31: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Extract - Graph Formation

Extract features from data to construct relationship

(𝑅𝑒𝑐𝑜𝑟𝑑𝑅𝑒𝑎𝑑𝑒𝑟)

V (𝐺𝑟𝑎𝑝ℎ𝑇𝑜𝑘𝑒𝑛𝑖𝑧𝑒𝑟)

Reduce ( ) f(x) Y

Optional:

Program sequential, not parallel!

Write simple data-specific functions.

Document doc = builder.parse(new InputSource(new

StringReader(s)));

title = xpath.evaluate("//page/title/text()", doc);

title = title.replaceAll("\\s", "_");

id = xpath.evaluate("//page/id/text()", doc);

String text = xpath.evaluate("//page/revision/text/text()", doc);

parseLinks(text);

conf.set(XMLInputFormat.START_TAG_KEY, START_TAG);

conf.set(XMLInputFormat.END_TAG_KEY, END_TAG);

new XMLRecordReader((FileSplit) split, conf);

Read vertex object

Feature Extraction

Parser

Page 32: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Extract - Tabulation

D1

Cat

Rat

Bat

Net Mat

User Defined:

Reduce ( ) f(x) Y

Apply (f(x)) Y

D1

Cat

Rat

Bat

Net Mat

Built-in tabulation functions for TF, TFIDF, WC, ADD, MUL, DIV.

Interface for custom tabulation on source and/or target vertex

Example: Term Frequency

Page 33: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Would like the ability to: Optionally filter duplicate, dangling and/or self edges

Transform a directed graph into an undirected graph

Calculate graph statistics, compute sub-graphs, etc.

The library provides: Functions to perform self-, dangling- and duplicate-edge removal

Directionality transformation

Solutions are based on a distributed hashing algorithm

Transform – Graph Transforms & Checks

M1

M2

H(A, B)

H(C, D)

H(A, B)

H(C, D)

Detector

Steering function

Detector B A

A B

C D

D C

A B

Page 34: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

(5,4)

(3,2) (0,6) (1,7)

• We can save memory if we normalize it (e.g., compress Link

graph by 60%)

• But, seems to call for a global lookup in a framework that prefers independent subproblems

• A simple, scalable solution is to “shard” ordered lists:

(Aaron,0)

(AMD,4)

(Brad,1)

(CMU,2)

(Dan,5)

(Dave,3)

(IBM,6)

(Intel,7)

(Aaron,IBM) (Brad,Intel)

(AMD,5) (CMU,3)

(Aaron,0) (AMD,4) (Brad,1) (CMU,2)

(Dan,5)

(Dave,3) (IBM,6) (Intel,7)

Dictionary Dictionary Shard 1 Converted

Edge List

Dictionary Shard 2 (Dan,AMD) (Dave,CMU)

(IBM,0)

(Intel,1)

Unconverted

Edge List

(Source Sorted) (Dest Sorted)

Load - Graph Compression

M1

M2

Page 35: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Minimize communications by

minimizing the number of machines vertex spans

Place about the same number of edges on each

machine

A B

C D 1 1

1 2

2

Load - Graph Partitioning

Traditional graph-partitioning algorithms perform poorly

on Power-Law Graphs. [Abou-Rjeili et al. 06]

Page 36: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Random edge placement Edges are placed randomly by each system

Greedy edge placement Global coordination for edge placement to minimizes the vertex

spanned

Oblivious greedy placement implements a local version of the Greedy without global

coordination

Heuristic-Based Partitioning

Strategies

Page 37: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Greedy Algorithm

while ensuring balance loading.

Machine 1 Machine 2

B A C B E

B

Master Slave

Place edges on machines which already have the vertices on that edge

C

F

A

H

Page 38: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Partitioning Quality Twitter Graph: 41M vertices, 1.4B edges

*Gonzalez et al., “PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs,” [OSDI’12]

2

4

6

8

10

12

14

16

18

8 16 24 32 40 48 56 64

# o

f V

ert

ex

co

pie

s

Number of Machines

Sm

alle

r is

be

tte

r

Greedy yields a quality cut, but what is the effect

on performance?

Page 39: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Performance Effect

*Gonzalez et al., “PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs,” [OSDI’12]

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

PageRankCollaborative

Filtering Shortest Path

Re

lati

ve

Ru

nti

me

Random

Oblivious Greedy

Greedy

Performance is inversely proportional to replication.

Page 40: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Load - Graph Serialization

• Self-describing data format − JSON +/- compression

• Extensible − Easy to connect with Graph

Databases

− Plug-in Graph Visualizers

Partitioning

JSON Encoding

Edge Lists Vertex Lists

{

“src_id”: 34,

“dest_id”: 45

“e-data”: 30

}

{

“ver_id”: 34,

“v-data”: 56,

“mirror”: [1,2,3],

“owner”: 1

}

Page 41: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

GraphBuilder Software stack

Linux Cluster Services (Amazon

AWS) Private Linux Cluster

Hadoop/HDFS

Hadoop/Map-Reduce Distributed Graph

Extract Transform Load

Built-in Parser/Tabulator Custom Parser/Tabulator

Page 42: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Speed of Graph Construction

Graph Compression Custom plug-in code

Link 60% 100 lines

Word-Doc 5% 130 lines

Hardware: 8 node cluster

1U Dual CPU (Intel SNB) Amazon build ZT systems

64 GB Memory, Four SATA Hard Drives

Intel 10G Adapter and Switch

Software:

Apache Hadoop 1.0.1

GraphLab v2.1

GraphBuilder beta

Extract Transform Load

Word-Doc Graph

Link Graph

45 min

13 min

|V| 54M, |E| 1.4B

|V| 20M, |E| 128M

Wikipedia Graphs

Execution time α O(|V|)

Page 43: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Summary

• Graphs are essential for structured ML and DM

• High-performing Graph-Analytics pipelines

requires careful system design • GraphBuilder solves the Graph Analytics ingress

challenge

Page 44: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Going forward…

Interested in collaboration – Would like to hear from you!

(Office hours: Thursday 10:50am)

Intel Booth (#27) – Real time Analytics, Hadoop Benchmarking www.intel.com/bigdata

Available soon (mid-Nov)!

Intel Open-Source Portal http://www.01.org

GraphLab is available at http://graphlab.org

Apache 2 license

Page 45: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Legal Notices

• INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL® PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL’S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER, AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL® PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. INTEL PRODUCTS ARE NOT INTENDED FOR USE IN MEDICAL, LIFE SAVING, OR LIFE SUSTAINING APPLICATIONS.

• Intel may make changes to specifications and product descriptions at any time, without notice.

• All products, dates, and figures specified are preliminary based on current expectations, and are subject to change without notice.

• Intel, processors, chipsets, and desktop boards may contain design defects or errors known as errata, which may cause the product to deviate from published specifications. Current characterized errata are available on request.

• Code names featured are used internally within Intel to identify products that are in development and not yet publicly announced for release. Customers, licensees and other third parties are not authorized by Intel to use code names in advertising, promotion or marketing of any product or services and any such use of Intel's internal code names is at the sole risk of the user

• Performance tests and ratings are measured using specific computer systems and/or components and reflect the approximate performance of Intel products as measured by those tests. Any difference in system hardware or software design or configuration may affect actual performance.

• Intel, Intel Inside, and the Intel logo are trademarks of Intel Corporation in the United States and other countries.

• *Other names and brands may be claimed as the property of others.

• Copyright © 2012 Intel Corporation.

Page 46: GraphBuilder - 01.org · Apache Giraph 2011 ... And, in practice and at scale we must: but the Data Scientist shouldn’t be responsible for this domain expertise! Pre- ... Collaborative

Recommended