<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Generalized Parallel Join Algorithms and Designing Cost Models</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author role="corresp">
							<persName><forename type="first">Alice</forename><surname>Pigul</surname></persName>
							<email>m05pay@math.spbu.ru</email>
						</author>
						<title level="a" type="main">Generalized Parallel Join Algorithms and Designing Cost Models</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">7AF3D92627EED3FD8AE7C4F1637CFA23</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-25T07:31+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Applications for large-scale data analysis use such techniques as parallel DBMS, MapReduce (MR) paradigm, and columnar storage. In this paper we focus in a MapReduce environment. The aim of this work is to compare the different join algorithms and designing cost models for further use in the query optimizer.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>Data-intensive applications include large-scale data warehouse systems, cloud computing, data-intensive analysis. These applications have their own specific computational workload. For example, analytic systems produce relatively rare updates but heavy select operation with millions of records to be processed, often with aggregations.</p><p>There are the following architectures that are used to analyze massive amounts of data: MapReduce paradigm, parallel DBMSs, column-wise store, and various combinations of these approaches.</p><p>Applications of this type process multiple data sets. This implies need to perform several join operation. It's known join operation is one of the most expensive operations in terms both I / O and CPU costs.</p><p>Unfortunately, join algorithms is not directly supported in MapReduce. There are some approaches to solve this problem by using a high-level language PigLatin, HiveQL for SQL queries or implementing algorithms from research papers. The aim of this work is to generalize and compare existing equi-join algorithms with some optimization techniques and build cost model which could be used in a query optimizer for a distributed DBMS with MapReduce.</p><p>This paper is organized as follows the section 2 describe state of the art. Join algorithms and some optimization techniques were introduced in 3 section. The designing of cost models for join algorithms are presented in 4 section. Performance evaluation will be described in 5 section. Finally, future direction and some discussion of experiments will be given.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Related work 2.1 Architectural Approaches</head><p>Column storage is one of the architectural approaches to store data in columns, that the values of one field are stored physically together in a compact storage area. Column storage strategy improves performance by reducing the amount of unnecessary data from disk by excluding the columns that are not needed. Additional gains may be obtained using data compression. Storage method in columns outperforms row-based storage for workloads typical for analytical applications, which are characterized by heavy selection operation from millions of records, often with aggregation and by infrequent update operation. For this class of workloads I/O is major factor limited the performance. Comparison of column-wise and row-wise stores approaches is presented in <ref type="bibr" target="#b0">[1]</ref>.</p><p>Another architectural approach is a software framework MapReduce. Paradigm MapReduce was introduced in <ref type="bibr" target="#b10">[11]</ref> to process massive amounts of unstructured data.</p><p>Originally, this approach was contrasted with a parallel DBMS. Deep analysis of the advantages and disadvantages of these two architectures was presented in <ref type="bibr" target="#b24">[25,</ref><ref type="bibr" target="#b9">10]</ref>.</p><p>Later, hybrid systems appeared in <ref type="bibr" target="#b8">[9,</ref><ref type="bibr" target="#b1">2]</ref>. There are three ways to combine approaches MapReduce and parallel DBMS.</p><p> MapReduce inside a parallel DBMS. The main intention is to move computation closer to data. This architecture can be exemplified with hybrid database Greenplum with MAD approach <ref type="bibr" target="#b8">[9]</ref>.</p><p> DBMS inside MapReduce. The basic idea is to connect multiple single node database systems using MapReduce as the task coordinator and network communication layer. An example is a hybrid database HadoopDB <ref type="bibr" target="#b1">[2]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head></head><p>MapReduce aside of the parallel DBMS.</p><p>MapReduce is used to implement an ETL produced data to be stored in parallel DBMS.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Proceedings of the Spring Young Researcher's Colloquium On Database and Information Systems SYRCoDIS, Moscow, Russia, 2012</head><p>This approach is discussed in <ref type="bibr">[28]</ref> Vertica, which also supports the column-wise store.</p><p>Another group of hybrid systems combines MapReduce with column-wise store. MapReduce and column-wise store are effective in data-intensive applications. Hybrid systems based on this two techniques may be found in <ref type="bibr" target="#b19">[20,</ref><ref type="bibr" target="#b12">13]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.2">Algorithms for Join Operation</head><p>Detailed comparison of relational join algorithms was presented in <ref type="bibr" target="#b25">[26]</ref>. In our paper, the consideration is restricted to a comparison of joins in the context of MapReduce paradigm.</p><p>Papers which discuss equi-join algorithms can be divided into two categories which describe join algorithms and multi join execution plans. The former category deals with design and analyses join algorithm of two data sets. A comparative analysis of two-way join techniques is presented in <ref type="bibr" target="#b5">[6,</ref><ref type="bibr" target="#b3">4,</ref><ref type="bibr" target="#b20">21]</ref>. The cost model for two-way join algorithms in terms of cost I/O is presented in <ref type="bibr" target="#b6">[7,</ref><ref type="bibr" target="#b16">17]</ref>.</p><p>The basic idea of multi-way join is to find strategies to combine the natural join of several relations. Different join algorithms from relation algebra are presented in <ref type="bibr" target="#b28">[30]</ref>. The authors introduce the extension of MapReduce to facilitate implement relation operations. Several optimizations for multi-way join are described in <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b17">18]</ref>. Authors introduced a one-to-many shuffling strategy. Multi-way join optimization for column-wise store is considered in <ref type="bibr" target="#b19">[20,</ref><ref type="bibr" target="#b30">32]</ref>.</p><p>Theta-Joins and set-similarity joins using MapReduce are addressed in <ref type="bibr" target="#b22">[23]</ref> and <ref type="bibr" target="#b26">[27]</ref> respectively.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.3">Optimization techniques and cost models</head><p>In contrast to the sql queries in parallel database, the MapReduce program contains user-defined map and reduce functions. Map and reduce functions can be considered as a black-box, when nothing is known about these functions, or they can be written on sql-like languages, such as HiveQL, PigLatin, MRQL, or sql operations can be extracted from functions on semantic basis. Automatic finding good configuration settings for arbitrary program offered in <ref type="bibr" target="#b15">[16]</ref>. Theoretical designing cost models for arbitrary MR program for each phase separately presented in <ref type="bibr" target="#b14">[15]</ref>. If the MR program is similar to the semantics of SQL, it allows us to construct a more accurate cost model or adapt some of the optimization techniques from relational databases. HadoopToSQL <ref type="bibr" target="#b21">[22]</ref> allows to take advantage of two different data storages such as SQL database and the text format in MapReduce storage and to use index at right time by transforming the MR program to SQL. Manimal system <ref type="bibr" target="#b16">[17]</ref> uses static analysis for detection and exploiting selection, projection and data compression in MR programs and if needed to employ B+ tree index. New SQL-like query language and algebra is presented in <ref type="bibr" target="#b11">[12]</ref>. But they are needed cost model based on statistic. Detailed construction of the model to estimate the I/O cost for each phase separately is given in <ref type="bibr" target="#b23">[24]</ref>. Simple theoretical considerations for selecting a particular join algorithm are presented in <ref type="bibr" target="#b20">[21]</ref>. Another approach <ref type="bibr" target="#b6">[7]</ref> for selecting join algorithm is to measure the correlation between the input size and the join algorithm execution time with fixed cluster configuration settings.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Join algorithms and optimization techniques</head><p>In this section we consider various techniques of twoway joins in MapReduce framework. Join algorithms can be divided into two groups: Reduce-side join and Map-side join. The pseudo code presented in Listings, where R -right dataset, L -left dataset, V -line from file, Key -join key, that was parsed from a tuple, in this context tuple is V.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Reduce-Side join</head><p>Reduce-side join is an algorithm which performs data pre-processing in Map phase, and direct join is done during the Reduce phase. Join of this type is the most general without any restriction on the data. Reduce-side join is the most time-consuming, because it contains an additional phase and transmits data over the network from one phase to another. In addition, the algorithm has to pass information about source of data through the network. The main objective of the improvement is to reduce the data transmission over the network from the Map task to the Reduce task by filtering the original data through semi-joins. Another disadvantage of this class of algorithms is the sensitivity to the data skew, which can be addressed by replacing the default hash partitioner with a range partitioner.</p><p>There are three algorithms in this group:  General reducer-side join,  Optimized reducer-side join,  the Hybrid Hadoop join.</p><p>General reducer-side join is the simplest one. The same algorithms are called Standard Repartition Join in <ref type="bibr" target="#b5">[6]</ref>. The abbreviation is GRSJ.</p><p>Listing 1: GRSJ. This algorithm has both Map and Reduce phases. In the Map phase, data are read from two sources and tags are attached to the value to identify the source of a key/value pair. As the key is not effecting by this Map (K: null, V from R or L) Tag = bit from name of R or L; emit (Key, pair(V,Tag));</p><p>Reduce (K': join key, LV: list of V with key K') create buffers B r and B l for R and L; for t in LV do add t.v to B r or B l by t.Tag; for r in B r do for l in B l do emit (null, tuple(r.V,l.V));</p><p>tagging, so we can use the standard hash partitioner. In Reduce phase, data with the same key and different tags are joined with nested-loop algorithm. The problems of this approach are that the reducer should have sufficient memory for all records with a same key; and the algorithm sensitivity to the data skew. Optimized reducer-side join enhances previous algorithm by overriding sorting and grouping by the key, as well as tagging data source. Also known as Improved Repartition Join in <ref type="bibr" target="#b5">[6]</ref>, Default join in <ref type="bibr" target="#b13">[14]</ref>. The abbreviation is ORSJ. In the algorithm all the values of the first tag are followed by the values of the second one. In contrast with the General reducer-side join, the tag is attached to both a key and a value. Due to the fact that the tag is attached to a key, the partitioner must be overridden in order to split the nodes by the key only. This case requires buffering for only one of input sets. Optimized reducer-side join inherits major disadvantages of General reducer-side join namely the transferring through the network additional information about the source and the algorithm sensitivity to the data skew.</p><p>Listing 2: ORSJ. The Hybrid join <ref type="bibr" target="#b3">[4]</ref> combines the Map-side and Reduce-side joins. The abbreviation is HYB.</p><p>Listing 3: HYB.</p><p>In Map phase, we process only one set and the second set is partitioned in advance. The pre-partitioned set is pulled out of blocks from a distributed system in the Reduce phase, where it is joined with another data set that came from the Map phase. The similarity with the Map-side join is the restriction that one of the sets has to be split in advance with the same partitioner, which will split the second set. Unlike Map-side join, it is necessary to split in advance only one set. The similarity with the Reduce-side join is that algorithm requires two phases, one of them for pre-processing of data and one for direct join. In contrast with the Reduce-side join we do not need additional information about the source of data, as they come to the Reducer at a time.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Map-Side join</head><p>Map-side join is an algorithm without Reduce phase. This kind of join can be divided into two groups. First of them is partition join, when data previously partitioned into the same number of parts with the same partitioner. The relevant parts will be joined during the Map phase. This map-side join is sensitive to the data skew. The second is in memory join, when the smaller dataset send whole to all mappers and bigger dataset is partitioned over the mappers. The problem with this type of join occurs when the smaller of the sets can not fit in memory. There are three methods to avoid this problem:</p><p> JDBM-based map join,  Multi-phase map join,  Reversed map join.</p><p>Map-side partition join algorithm assumes that the two sets of data pre-partitioned into the same number of splits by the same partitioner. Also known as default map join. The abbreviation is MSPJ. At the Map phase one of the sets is read and loaded into the hash table, then two sets are joined by the hash table. This algorithm buffers all records with the same keys in memory, as is the case with skew data may fail due to lack of enough memory.</p><p>Listing 4: MSPJ.</p><p>Map-side partition merge join is an improvement of the previous version of the join. The abbreviation is MSPMJ. If data sets in addition to their partition are sorted by the same ordering, we apply merge join. The advantage of this approach is that the reading of the second set is on-demand, but not completely, thus memory overflow can be avoided. As in the previous cases, for optimization can be used the semi-join filtering and range partitioner. In-Memory Join does not require to distribute original data in advance unlike the versions of map joins discussed above. The same algorithms are called Mapside replication join in <ref type="bibr" target="#b6">[7]</ref>, Broadcast Join in <ref type="bibr" target="#b5">[6]</ref>, Memory-backed joins <ref type="bibr" target="#b3">[4]</ref>, Fragment-Replicate join in <ref type="bibr" target="#b13">[14]</ref>. The abbreviation is IMMJ. Nevertheless, this algorithm has a strong restriction on the size of one of the sets: it must fit completely in memory. The advantage of this approach is its resistance to the data skew because it sequentially reads the same number of tuples at each node. There are two options for transferring the smaller of the sets:</p><p> using a distributed cache,  reading from a distributed file system.</p><p>Listing 5: IMMJ.</p><p>The next three algorithms optimize the In-Memory Join for a case, when two sets are large and no of them fits into the memory. JDBM-based map join is presented in <ref type="bibr" target="#b20">[21]</ref>. In this case, JDBM library automatically swaps hash table from memory to disk.</p><p>Listing 6: JDBM.</p><p>Multi-phase map join <ref type="bibr" target="#b20">[21]</ref> is algorithm where the smaller of the sets is partitioned into parts that fit into memory, and for each part runs In-Memory join. The problem with this approach is that it has a poor performance. If the size of the set, which to be put in the memory is increased twice, the execution time of this join is also doubled. It is important to note that the set, which will not be loaded into memory, will be read many times from the disk.</p><p>Listing 7: Multi-phase map join.</p><p>Idea of Reversed map join <ref type="bibr" target="#b20">[21]</ref> approach is that the bigger of the sets, which is partitions during the Map phase, loading in the hash table. Also known as Broadcast Join in <ref type="bibr" target="#b5">[6]</ref>. The abbreviation is REV. The second dataset is read from a file line by line and joined using a hash table.</p><p>Listing 7: REV.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.3">Semi-Join</head><p>Sometimes a large portion of the data set does not take part in the join. Deleting of tuples that will not be used in join significantly reduces the amount of data transferred over the network and the size of the dataset for the join. This preprocessing can be carried out using semi-joins by selection or by a bitwise filter. However, these filtering techniques introduce some cost (an additional MR job), so the semi-join can improve the performance of the system only if the join key has low selectivity. There are three ways to implement the semijoin operation:  a semi-join using bloom-filter,  semi-join using selection,  an adaptive semi-join.</p><p>Bloom-filter is a bit array that defines a membership of element in the set. False positive answers are possible, but there are no false-negative responses in the solution of the containment problem. The accuracy of the containment problem solution depends on the size of the bitmap and on the number of elements in the set. These parameters are set by the user. It is known that for a bitmap of fixed size m and for the data set of n tuples, the optimal number of hash functions is k=0.6931*m/n. In the context of MapReduce, the semijoin is performed in two jobs. The first job consists of the Map phase, in which keys from one set are selected and added to the Bloom-filter. The Reduce phase combines several Bloom-filters from first phase into one. The second job consists only of the Map phase, which filters the second data set with a Bloom-filter constructed in previous job. The accuracy of this approach can be improved by increasing the size of the bitmap. However in this case, a larger bitmap consumes more amounts of memory. The advantage of this method is its the compactness. The performance of the semi-join using Bloom-filter highly depends on the balance between the Bloom-filter size, which increases The Adaptive semijoin is performed in one job, but filters the original data on the flight during the join. Similar to the Reduce-side join at the Map phase the keys from two data sets are read and values are set equal to tags which identify the source of the keys. At the Reduce phase keys with different tags are selected.</p><p>The disadvantage of this approach is that additional information about the source of data is transmitted over the network.</p><p>Listing 8: Adaptive semi-join.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.4">Range Partitioners</head><p>All algorithms, except the In-Memory join and their optimizations are sensitive to the data skew. This section describes two techniques of the default hash partitioner replacement. A Simple Range-based Partitioner <ref type="bibr" target="#b3">[4]</ref> (this kind similar to the Skew join in <ref type="bibr" target="#b13">[14]</ref>) applies a range vector of dimension n constructed from the join keys before starting a MR job. By this vector join keys will be splitted into n parts, where n is the number of Reduce jobs. Ideally partitioner vector is constructed from the whole original set of keys, in practice a certain number of keys is chosen randomly from the data set. It is known that the optimal number of keys for the vector construction is equal to the square root of the total number of tuples. With a heavy data skew into a single key value, some elements of the vector may be identical. If the key belongs to multiple nodes, a node is selected randomly in the case of data on which to build a hash table, otherwise the key is sent to all nodes (to save memory as a hash table is contained in the memory). Virtual Processor Partitioner <ref type="bibr" target="#b3">[4]</ref> is an improvement of the previous algorithm based on increasing the number of partition. The number of parts is specified multiple of the tasks number. The approach tends to load the nodes with the same keys uniformly (compared with the previous version). The same keys are scattered on more nodes than in the previous case. Listing 8: The range partitioners.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.5">Distributed cache</head><p>The advantage of using distributed cache is that data set are copied only once at the node. It is especially effective if several tasks at one node need the same file.</p><p>In contrast the access to the global file system needs more communication between the nodes. Better performance of the joins without the cache can be achieved by increasing number of the files replication, so there's a good chance to access the file version locally.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Cost model</head><p>Due to significant differences between parallel DBMS and MapReduce, the MapReduce paradigm requires another optimization techniques based on indexing and compression, programming models, data distribution and query execution strategy. Therefore, we need a different strategy of designing model cost. There are two types of designing cost models: the task execution simulation <ref type="bibr" target="#b27">[29]</ref> and analytical cost calculation <ref type="bibr" target="#b14">[15,</ref><ref type="bibr" target="#b23">24]</ref>.</p><p>To measure the query parallelism effectiveness, it is need to build a cost model that can describe the behavior of each algorithm for parallel query. Analytical model is cost formulas that are used to calculate the query execution time, taking into account the specific of parallel algorithm. Below, analytical cost model for join algorithms and their optimizations will be constructed.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>4.1Configuration settings</head><p>Execution  Consider these costs in more detail as <ref type="bibr" target="#b14">[15,</ref><ref type="bibr" target="#b23">24]</ref>. Stages of reading input data from HDFS and writing into HDFS are calculated by:</p><formula xml:id="formula_0">h Write h read w out s c r split s с * ) ( , * ) (  </formula><p>, where split is input split for mapper task, out is the output data of job. The buffering phase is more complicated; during this stage three processes take place: partitioning, sorting and spilling to disk. Where outm is output from map functions, buf is buffer for this stage. The buffer is divided into two parts, there are serialization buffer (SB), that contains key-value pairs and an accounting buffer (AB) that contains the metadata. So, the number of pairs in buffer is: The number of spilled files (N) from this stage is:</p><formula xml:id="formula_1">       ) ( ) ( buf p out p N</formula><p>Then all spilled files must be merged with such features:</p><p> the number of spill files are merged at once is F,  assume that the following 2 F N  ,  at first pass it is merged so spill files that remain files is multiplies F  at final merge if needed the combiner will be used.</p><p>The number of spill files equal to sum of spill files at first pass (S1P), at intermediate pass (SIP) and at final pass (SFP): , When segment arrive to the reducer it is placed in shuffle buffer or if size of segment is greater than 25% of buffer size then it is spilled into disk without inmemory buffer. The buffer size is determined by the configuration parameters as:</p><formula xml:id="formula_2">            F N F N F F N N S                 2 , * 1 1 , 0 F N F F S N S F N SIP                   2 , 1 1 , F N SIP N F S N F N N SFP<label>1 ) 1 mod( ) 1 ( 0 ) 1 mod( ) 1 ( , , 1 </label></formula><p>. * ) ( memT shuBP buf s </p><p>If buffer reaches size threshold (s(thr)) or the number of segments is greater than memMT, then segments are merged, sort and spill into disk.  If the number of shuffle files is greater than (2*F-1) then all files are merged into one. So, all segments may be divided on three states: in-memory buffer (segMB), shuffle unmerged files (segUF) and shuffle merged files </p><formula xml:id="formula_3">                         | | | | | | | | , )<label>( * 25 , 0 ) ( , ) ( ) ( ) ( 25 , 0 ) ( , 1 |</label></formula><formula xml:id="formula_4">(segMF). | | * | | | | 1 1 * 2 | | 1 * 2 | | , 0 | | | | mod | | | | segMF F shF segUF F F shF F shF segMF segF map segMB                     The cost of shuffle stage is:            0 ) ( * 25 , 0 ) ( , 1 * ) ( * ) ( * | | * * ) ( * | | * | | ) 2 * | | | (| * * * ) ( * | |</formula><formula xml:id="formula_5">      F segMF segUF seg s segE m s | | | | , 0 ) ( * | | ) 1 (</formula><p>After the merging, the number of files from disk is: The final cost of this phase is:</p><formula xml:id="formula_6">         | | | | | | 0 ) 1 ( , 1 | | | | | |</formula><formula xml:id="formula_7">          wid mC rw m s m s m s с l mergeR * )) 3 ( ) 2 ( ) 1 ( (</formula><p>Since the join algorithms are known in advance we can more accurately than the approach in [28] is to estimate the cost of user-defined functions Map and Reduce.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3">Cost model for Reduce-Side join</head><p>In case of General reducer-side join, MR program consists of one job and cost for combining is equal to 0.</p><p>In map function source tag is assign to each pair (consider that input map pair is equal to output map pair): There are two ways to deliver full one dataset to the mapper: read file from HDFS or by using distributed cache. And if distributed cache is used then the necessary files are copied to the slave nodes before the job is started. So, the c tr cost is added. The costs of with and without distributed cache deliver are: </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.4">Cost model for Map-Side join</head><p>The join job doesn't have reducer phase. Map-side partition join consists of pre-processing jobs for two input datasets (or partitions are got from another job) and join job. The map function of join job is:  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.5">The semi-join cost</head><p>The semi-join with selection consists of two jobs: finding unique keys and filter the dataset by unique keys. The cost of map function of finding unique keys is sum of filling hash table and producing the output costs. The input for this job is one dataset.  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.1">Dataset</head><p>Data are the set of tuples, which attributes are separated by a comma. Tuple is split into a pair of a key and a value, where value is the remaining attributes. Generation of synthetic data was done as in <ref type="bibr" target="#b3">[4]</ref>. Join keys are distributed randomly.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.2">Cluster configuration</head><p>Cluster consists of three virtual machines, where one of them is master and slave at the same time, the remaining two are the slaves. Host configuration consists of 1 processor, 512 mb of memory for the master, for others nodes have by 512 mb, 5 gb is the disk size. Hadoop 20.203.0 runs on Ubuntu 10.10.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.3">The General Case</head><p>The base idea of this experiment is to compare executions time of different phases of various algorithms. Some parameters are fixed: the number of Map and Reduce tasks is 3, the input size is 10000*100000 and 1000000*1000000 tuples.  For a small amount of data, Map phase, in which all tuples are tagged, and Shuffle phase, in which data are transferred from one phase to another, are more costly in Reduce-Side joins. It should be noted that GRSJ is better than ORSJ on small data, but it is the same on big data. It is because in first case time does not spend on combining tuples. Possible, on the larger data ORSJ outperform GRSJ when the usefulness of grouping by key will be more significant. Also for algorithms with pre-processing more time are spent on partitioning data. The algorithms in memory (IMMJ and REV) are similar in small data. Two algorithms are not shown in the graph because of their bad times: JDBM-based map join and Multi-phase map join. In large data IMMJ algorithm could not be executed because of memory overflow.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.4">Semi-Join</head><p>The main idea of this experiment is to compare different semi-join algorithms. These parameters are fixed: the number of Map and Reduce tasks is 3, the bitmap size of Bloom-filter is 2500000, the number of hashfunctions in Bloom-filter is 173, built-in Jenkins hash algorithm is used in Bloom-filter. Adaptive semi-join (ASGRSJ) does not finish because of memory overflow. The abbreviation of Bloom-filter semi-join for GRSJ is BGRSJ. The abbreviation of semi-join with selection for GRSJ is SGRSJ respectively. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.5">Distributed cache</head><p>In <ref type="bibr" target="#b20">[21]</ref> was showed that using of distributed cache is not always good strategy. They suggested that the problem can be a high speed network. This experiment was carried out for Reversed Map-Side join, because for which a distributed cache can be important. Replication was varied as 1, 2, 3 and size of data is fixed -1000000*1000000 tuples. When data is small, the difference is not always visible. In large data algorithms with distributed cache outperform approach of reading from a globally distributed system. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.6">Skew data</head><p>It is known that many of the presented algorithms are sensitive to the data skew. In this experiment take part such algorithms as Reduce-side join with Simple Range-based Partitioner for GRSJ (GRSJRange) and Virtual Processor Partitionerfor GRSJ (GRSJVirtual), and also for comparing in memory join: IMMJ, REV because of resistant to the skew. Fixed parameters are used: size of two dataset is 2000000, one of the data set has skew 500000 of 5, and another has 10 or 1 of 5. In case with IMMJ was memory overflow. Although these experiments do not completely cover the tuneable set of Hadoop parameters, they are shown the advantages and disadvantages of the proposed algorithms. The main problems of these algorithms are time spent on pre-processing, transferring data, the data skew, and memory overflow.</p><p>Each of the optimization techniques introduces additional cost to the implementation of the join, so the algorithm based on the tuneable settings and specific data should be carefully chosen. Also important are the parameters of the network bandwidth when distributed cache are used or not used and a hardware specification of nodes because of it is importance when speculative executions are on. Speculative execution reduces negative effects of non-uniform performance of physical nodes.</p><p>Based on the collected statistics such as data size, how many keys will be taking part in the join, these statistics may be collected as well as the construction of a range partitioner, the query planner can choose an efficient variant of the join. For example, in <ref type="bibr" target="#b4">[5]</ref> was proposed what-if analyses and cost-based optimization.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Future work</head><p>The algorithms discussed in this paper, only two sets are joined. It is interesting to extend from binary operation to multi argument joins. Among the proposed algorithms, there is no effective universal solution. Therefore, it is necessary to evaluate the proposed cost models for join algorithms. And for this problem it is need to use real cluster with more than three nodes in it and more powerful to process bigger data, due to the fact that the execution time on the virtual machine may be different from the real cluster in reading/writing, transferring data over the network and so on.</p><p>Also the idea of processing the data skew in MapReduce applications from <ref type="bibr" target="#b18">[19]</ref> can be applied to the join algorithms. Another direction to future work is to extend algorithm to support a theta-join and outer join. An interesting area for future work is to develop, implement and evaluate algorithms or extended algebraic operations suitable for complex similarity queries in an open distributed heterogeneous environment. The reasons to evaluate complex structured queries are: a need to combine search criteria for different types of information; a query refinement e.g. based on user profile or feedback; advanced users may need query structuring. The execution model and algebraic operation to be implemented are outlined in <ref type="bibr" target="#b29">[31]</ref>. The main goal is to solve the problems presented in <ref type="bibr" target="#b7">[8]</ref> as a problem.</p><p>In addition, one of the issues is efficient physical representation of data. Binary formats are known to outperform the text both in speed reading and partitioning key / value pairs, and the transmission of compressed data over the network. Along with the binary data format, column storage has already been proposed for paradigm MapReduce. It is interesting to find the best representation for specific data.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Conclusion</head><p>In this work we describe the state of the art in the area of parallel processing, presented our comparative study of these algorithms, cost models and our outline directions of future work.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>C</head><label></label><figDesc>bad for the skew data, when one task is time consuming. Map and c reduce are the cost of user-define functions, so for each join algorithm it is calculated by the own formula. Another cost values from (c read , c Buffer , c Write , c merge , c mergeR, c shuffle, c t ) are common for join algorithms.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head></head><label></label><figDesc>After that stage map output transferred to the reducers (this cost includes the cost for all reducers).The data from mappers are transferred by segments to reducers. Without considering the data skew, it is assumed that the sizes of segments are the same.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>.</head><label></label><figDesc>The number of segments (|segF|) in shuffle file and the number of such files (|shF|) are:</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head></head><label></label><figDesc>,segUF, segMF files must be merged. Some segments from memory (segE) are spilled to disk by redBP constraint. the number of files from disk is less than F then segE files are merged separately.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head></head><label></label><figDesc>As opposite to General reducer-side join, the cost of Optimized reducer-side join includes the cost of combine function and the cost of reduce function is less then the previous join, MR program of the Hybrid Hadoop join consist of pre-processing job and join job. The pre-processing job is partition one dataset into |red| parts, and besides these partitions may be got from other MR job or from default MR job. The costs of default map and reduce functions are:</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_8"><head></head><label></label><figDesc>The map and reduce functions costs of join job are:</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_9"><head></head><label></label><figDesc>the datasets are reversed, in2 (the bigger one) is broadcast, in1 is split of smaller dataset and it is loaded in hash table.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_10"><head></head><label></label><figDesc>map join cost equal to sum of immj job costs. The number of summands is</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_11"><head>.</head><label></label><figDesc>The reduce function of that job is run on the one reducer and the same as default reduce function. The filtering job consists of one map phase, where the file with unique key from previous job is loaded into hash table and then the split of another dataset is probe. semi-join is similar to reduce-side join. The two datasets are read and tagged by label in map function. And at reducer the pairs with different tags are output. The cost is equal to default job. But at the actual join it is needed to add some cost of loading file with unique keys, filling hash table and filtering useless pairs as fil Map с .In case of semi-join with bloom-filter the program consists of two jobs: creating bloom filter and filtering the dataset. In the map function, bloom filter for split constructed and the output all filter as one pair.Where lo is the cost for processing bloom filter. The reducer is one and it is combine all bloom-filter into one.At another job the constructed bloom-filter is loaded and the second dataset is probed.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_13"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Executions time of different phases of various algorithms. Size 10000*100000.</figDesc><graphic coords="9,306.60,287.30,222.10,128.85" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_14"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: Executions time of different phases of various algorithms. Size 1000000*1000000.</figDesc><graphic coords="9,306.60,447.25,220.20,120.00" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_15"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Comparison of different semi-join implementations.</figDesc><graphic coords="10,63.00,236.65,225.60,120.85" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_16"><head>Figure 4 :</head><label>4</label><figDesc>Figure 4: Performance of Reversed Map-Side join with and without using distributed cache.</figDesc><graphic coords="10,63.00,505.80,225.60,120.10" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_17"><head>Figure 5 :</head><label>5</label><figDesc>Figure 5: Processing the data skew.</figDesc><graphic coords="10,306.60,99.85,221.15,130.55" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head></head><label></label><figDesc>for its reconstruction of the filter in the second job, and the number of false positive responses in the containment solution. The large size of the data set can seriously degrade the performance of the join.</figDesc><table><row><cell>Job 1: partition S dataset as in HYB the time needed</cell><cell></cell></row><row><cell>Job 2: partition B dataset as in HYB</cell><cell></cell></row><row><cell>Job 3: join two datasets</cell><cell></cell></row><row><cell>init() //for Map phase</cell><cell></cell></row><row><cell>find needed partition SP of output file from Job 1;</cell><cell></cell></row><row><cell>read first lines with the same key K2 from SP and add</cell><cell></cell></row><row><cell>to buffer B; Map(K:null, V from B) while (K &gt; K2) do read T from SP with key K2; while (K == K2) do add T to B; read T from SP with key K2; if (K == K2) then for r in B do emit(null, tuple(r,V));</cell><cell>init() //for Map phase read S from HDFS; add it to hashMap(Key, list(V)) H; map (K:null, V from S) add to hashMap(Key, V) H; close() //for Map phase find B in HDFS while (not end B) do read line T; K = join key from tuple T;</cell></row><row><cell></cell><cell>if (K in H) then</cell></row><row><cell></cell><cell>for l in H.get(K) do</cell></row><row><cell></cell><cell>emit(null, tuple(T,l));</cell></row><row><cell>init() // for Map phase</cell><cell></cell></row><row><cell>read S from HDFS;</cell><cell></cell></row><row><cell>add it to hashMap(Key, list(V)) H;</cell><cell></cell></row><row><cell>map (K:null, V from B)</cell><cell></cell></row><row><cell>if (K in H) then</cell><cell></cell></row><row><cell>for l in H.get(K) do</cell><cell></cell></row><row><cell>emit (null, tuple(v,l));</cell><cell></cell></row><row><cell>The same as IMMJ, but H is implemented by HTree</cell><cell></cell></row><row><cell>instead of hashMap .</cell><cell></cell></row></table><note>For part P from S that fit into memory do IMMJ(P,B).Listing 7: Semi-join using Bloom-filter.Semi-join with selection extracts unique keys and constructs a hash table. The second set is filtered by the hash table constructed in the previous step. In the context of MapReduce, the semi-join is performed in two jobs. Unique keys are selected during the Map phase of the first job and then they are combined into one file during the Map phase. The second job consists of only the Map phase, which filters out the second set. The semi-join using selection has some limitations. Hash table in memory, based on records of unique keys, can be very large, and depends on the key size and the number of different keys.Listing 8: Semi-join with selection.</note></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head>Job 1 :</head><label>1</label><figDesc>find keys which are present in two datasets Map (K:null, V from R or L) Tag = bit from name of R or L; emit (Key,Tag);</figDesc><table><row><cell>Job 1: construct Bloom filter</cell><cell></cell></row><row><cell>Map (K:null, V from L)</cell><cell></cell></row><row><cell>Add Key to BloomFilter Bl</cell><cell></cell></row><row><cell>close() //for Map phase</cell><cell></cell></row><row><cell>emit(null, Bl);</cell><cell>Reduce (K': join key, LV: list of V with key K')</cell></row><row><cell></cell><cell>Val = first value from LV;</cell></row><row><cell>Reduce (K': key, LV) //only 1 Reducer</cell><cell>for t in LV do</cell></row><row><cell>for l in LV do</cell><cell>if (not Val==Val2) then</cell></row><row><cell>union filters by operation Or</cell><cell>emit (null, K');</cell></row><row><cell>close() // for Reduce phase</cell><cell></cell></row><row><cell>write resulting filter into file;</cell><cell>Job 2: before joining it is necessary to filter the smaller</cell></row><row><cell></cell><cell>dataset by keys from the Job 1 that will be loaded into</cell></row><row><cell>Job 2: filter dataset</cell><cell>hash map. Then the bigger dataset is joined with filtered</cell></row><row><cell>init() //for Map phase</cell><cell>one.</cell></row><row><cell>read filter from file in Bl</cell><cell></cell></row><row><cell>Map (K:null, V from R)</cell><cell></cell></row><row><cell>if (Key in Bl) then</cell><cell></cell></row><row><cell>emit (null, V);</cell><cell></cell></row><row><cell>Job 3: do join with L dataset and filtered dataset from</cell><cell></cell></row><row><cell>Job 2.</cell><cell></cell></row><row><cell>Job 1: find unique keys</cell><cell></cell></row><row><cell>Map (K:null, V from L)</cell><cell></cell></row><row><cell>Create HashMap H;</cell><cell></cell></row><row><cell>if (not Key in H) then</cell><cell></cell></row><row><cell>add Key to H;</cell><cell></cell></row><row><cell>emit (Key, null);</cell><cell></cell></row><row><cell>Reduce (K': key, LV) //only one Reducer</cell><cell></cell></row><row><cell>emit (null,key);</cell><cell></cell></row><row><cell>Job 2: filter dataset</cell><cell></cell></row><row><cell>init() //for Map phase</cell><cell></cell></row><row><cell>add to HashMap H unique keys from job 1;</cell><cell></cell></row><row><cell>Map (K:null, V from R)</cell><cell></cell></row><row><cell>if (Key in H) then</cell><cell></cell></row><row><cell>emit (null,V);</cell><cell></cell></row><row><cell>Job 3: do join with L dataset and filtered dataset from</cell><cell></cell></row><row><cell>Job 2.</cell><cell></cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_3"><head></head><label></label><figDesc>Cost take into account the parallel threads of execution and compute the total cost of MR job, where c m and c r are costs of one task mapper or reducer respectively, MaxMN and MaxRN are maximum map tasks or reduce task per node.</figDesc><table><row><cell>//before the MR job starts through the cost of one task (one mapper and one</cell><cell></cell><cell></cell></row><row><cell>// optimal max = sqrt(|R|+|L|) reducer). The</cell><cell></cell><cell></cell></row><row><cell>getSamples (Red:the number of reducers, max: the max</cell><cell></cell><cell></cell></row><row><cell>number of samples)</cell><cell></cell><cell></cell></row><row><cell>C = max/Splits.length;</cell><cell></cell><cell></cell></row><row><cell>Create buffer B;</cell><cell></cell><cell></cell></row><row><cell>for s in Splits of R and L do</cell><cell></cell><cell></cell></row><row><cell>get C keys from s;</cell><cell></cell><cell></cell></row><row><cell>add it to B;</cell><cell></cell><cell></cell></row><row><cell>sort B; //in case simple range partitioner P == 1 //in case virtual range partitioner P &gt; 1</cell><cell cols="2">of MR program depends on input data statistic such as selectivity, skew, compression, on</cell></row><row><cell>for j&lt;(Red*P) do</cell><cell cols="2">cluster resource such as number of nodes, on</cell></row><row><cell>T = B.length/(Red*P)*(j+1);</cell><cell cols="2">configuration parameters, such as I/O cost, and on</cell></row><row><cell>write into file B[T];</cell><cell cols="2">properties of specific algorithm. Below, the parameters</cell></row><row><cell>Map(K:null, V from L or R)</cell><cell cols="2">used in the analysis are presented in table.</cell></row><row><cell>Tag = bit from name of R or L; read file with samples and add samples to Buffer B; //in case virtual partition it is needed to // each index mod |Reducers|</cell><cell cols="2">Variable Description s(x) Size of x in mb p(x) Number of pairs for split x</cell></row><row><cell>Ind = {i: B[i-1] &lt; Key &lt;= B[i]}</cell><cell>wid</cell><cell>Pair width</cell></row><row><cell>// Ind may be array of indexes in skew case if (Ind.length &gt;1) then if (V in L) then node = random(Ind); emit (pair(Key, node), pair(V, Tag)); else for i in Ind do</cell><cell>c t pC sC sortC cC</cell><cell>The average computation time needed per pair The cost for partition The cost for serialization The cost for sorting on keys The cost for executing combine function</cell></row><row><cell></cell><cell>mC</cell><cell>The cost for merge</cell></row><row><cell></cell><cell>selP</cell><cell>Selectivity of pairs</cell></row><row><cell></cell><cell>selC</cell><cell>Selectivity of combining</cell></row><row><cell></cell><cell>|red|</cell><cell>Number of reducers</cell></row><row><cell></cell><cell>|map|</cell><cell>Number of mappers</cell></row><row><cell></cell><cell>r h</cell><cell>The cost for reading from HDFS</cell></row><row><cell>Reducer (K': join key, LV: list of V' with key K')</cell><cell>w h</cell><cell>The cost for writing to HDFS</cell></row><row><cell>The same as GRSJ</cell><cell>rw l</cell><cell>The cost for local I/O operations</cell></row><row><cell></cell><cell>tC</cell><cell>The cost of network transfer</cell></row><row><cell></cell><cell>sortMB</cell><cell>io.sort.mb parameter in Hadoop</cell></row><row><cell></cell><cell></cell><cell>configuration</cell></row><row><cell></cell><cell>sortRP</cell><cell>io.sort.record.percent</cell></row><row><cell></cell><cell>sortSP</cell><cell>io.sort.spill.percent</cell></row><row><cell></cell><cell>F</cell><cell>io.sort.factor</cell></row><row><cell></cell><cell>shuBP</cell><cell>mapred.job.shuffle.input.buffer.percent</cell></row><row><cell></cell><cell>shuMP</cell><cell>mapred.job.shuffle.merge.percent</cell></row><row><cell></cell><cell cols="2">memMT mapred.inmem.merge.threshold</cell></row><row><cell></cell><cell>memT</cell><cell>mapred.child.java.opts</cell></row><row><cell></cell><cell>redBP</cell><cell>mapred.job.reduce.input.buffer.percent</cell></row><row><cell></cell><cell cols="2">4.2 Cost of arbitrary MR program</cell></row><row><cell></cell><cell cols="2">As mentioned above, the MR job consists of the</cell></row><row><cell></cell><cell cols="2">execution stages, thus it is possible to estimate each</cell></row><row><cell></cell><cell cols="2">phase separately. Job may contain the following stages:</cell></row><row><cell></cell><cell cols="2">Setup, Read (read map input), Map (map function),</cell></row><row><cell></cell><cell cols="2">Buffer (serializing to buffer, partitioning, sorting,</cell></row><row><cell></cell><cell cols="2">combining, compressing, write output data to local</cell></row><row><cell></cell><cell cols="2">disk), Merge (merging spill files), Shuffle (transferring</cell></row></table><note>map output to reducers), MergeR(merging received files), Reduce (reduce function), Write (writing result to the HDFS), Cleanup. Due to the fact that the job of MR program carried out in parallel or in waves, it is possible to calculate the approximate total cost of the job emit (pair(Key, i), pair(V, Tag)); else emit (pair(Key, Ind), pair(V, Tag));Partitioner (K:key, V:value, P:the number of reducers) return K.Ind; job</note></figure>
		</body>
		<back>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Column-stores vs. row-stores: how different are they really?</title>
		<author>
			<persName><forename type="first">J</forename><surname>Daniel</surname></persName>
		</author>
		<author>
			<persName><surname>Abadi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Samuel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Nabil</forename><surname>Madden</surname></persName>
		</author>
		<author>
			<persName><surname>Hachem</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2008 ACM SIGMOD international conference on Management of data, SIGMOD &apos;08</title>
				<meeting>the 2008 ACM SIGMOD international conference on Management of data, SIGMOD &apos;08<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="page" from="967" to="980" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Hadoopdb: an architectural hybrid of mapreduce and dbms technologies for analytical workloads</title>
		<author>
			<persName><forename type="first">Azza</forename><surname>Abouzeid</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Kamil</forename><surname>Bajda-Pawlikowski</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Daniel</forename><surname>Abadi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Avi</forename><surname>Silberschatz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Alexander</forename><surname>Rasin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. VLDB Endow</title>
				<meeting>VLDB Endow</meeting>
		<imprint>
			<date type="published" when="2009-08">August 2009</date>
			<biblScope unit="volume">2</biblScope>
			<biblScope unit="page" from="922" to="933" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Optimizing joins in a map-reduce environment</title>
		<author>
			<persName><forename type="first">N</forename><surname>Foto</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jeffrey</forename><forename type="middle">D</forename><surname>Afrati</surname></persName>
		</author>
		<author>
			<persName><surname>Ullman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 13th International Conference on Extending Database Technology, EDBT &apos;10</title>
				<meeting>the 13th International Conference on Extending Database Technology, EDBT &apos;10<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="99" to="110" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<title level="m" type="main">Implementation and analysis of join algorithms to handle skew for the hadoop mapreduce framework</title>
		<author>
			<persName><forename type="first">Fariha</forename><surname>Atta</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
		<respStmt>
			<orgName>MSc Informatics, School of Informatics, University of Edinburgh</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Master&apos;s thesis</note>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Towards automatic optimization of mapreduce programs</title>
		<author>
			<persName><forename type="first">Shivnath</forename><surname>Babu</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 1 st ACM symposium on Cloud computing, SoCC &apos;10</title>
				<meeting>the 1 st ACM symposium on Cloud computing, SoCC &apos;10<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="137" to="142" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">A comparison of join algorithms for log processing in mapreduce</title>
		<author>
			<persName><forename type="first">Spyros</forename><surname>Blanas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jignesh</forename><forename type="middle">M</forename><surname>Patel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Vuk</forename><surname>Ercegovac</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jun</forename><surname>Rao</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Eugene</forename><forename type="middle">J</forename><surname>Shekita</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Yuanyuan</forename><surname>Tian</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2010 international conference on Management of data, SIGMOD &apos;10</title>
				<meeting>the 2010 international conference on Management of data, SIGMOD &apos;10<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="975" to="986" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<title level="m" type="main">Designing a parallel query engine over map/reduce</title>
		<author>
			<persName><surname>Chatzistergiou</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
		<respStmt>
			<orgName>MSc Informatics, School of Informatics, University of Edinburgh</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Master&apos;s thesis</note>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Integrating db and ir technologies: What is the sound of one hand clapping?</title>
		<author>
			<persName><forename type="first">Surajit</forename><surname>Chaudhuri</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Raghu</forename><surname>Ramakrishnan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gerhard</forename><surname>Weikum</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">CIDR</title>
				<imprint>
			<date type="published" when="2005">2005</date>
			<biblScope unit="page" from="1" to="12" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Mad skills: new analysis practices for big data</title>
		<author>
			<persName><forename type="first">Jeffrey</forename><surname>Cohen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Brian</forename><surname>Dolan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Mark</forename><surname>Dunlap</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Joseph</forename><forename type="middle">M</forename><surname>Hellerstein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Caleb</forename><surname>Welton</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. VLDB Endow</title>
				<meeting>VLDB Endow</meeting>
		<imprint>
			<date type="published" when="2009-08">August 2009</date>
			<biblScope unit="volume">2</biblScope>
			<biblScope unit="page" from="1481" to="1492" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Mapreduce: a flexible data processing tool</title>
		<author>
			<persName><forename type="first">Jeffrey</forename><surname>Dean</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sanjay</forename><surname>Ghemawat</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Commun. ACM</title>
		<imprint>
			<biblScope unit="volume">53</biblScope>
			<biblScope unit="page" from="72" to="77" />
			<date type="published" when="2010-01">January 2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Mapreduce: simplified data processing on large clusters</title>
		<author>
			<persName><forename type="first">Jeffrey</forename><surname>Dean</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sanjay</forename><surname>Ghemawat</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Google</forename><surname>Inc</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">OSDI04: Proceedings of the 6 th conference on Symposium on Opearting Systems Design &amp; Implementation</title>
				<imprint>
			<publisher>USENIX Association</publisher>
			<date type="published" when="2004">2004</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">An optimization framework for map-reduce queries</title>
		<author>
			<persName><forename type="first">Leonidas</forename><surname>Fegaras</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Chengkai</forename><surname>Li</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Upa</forename><surname>Gupta</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">EDBT 2012</title>
				<imprint>
			<date type="published" when="2012-03">march 2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Column-oriented storage techniques for mapreduce</title>
		<author>
			<persName><forename type="first">Avrilia</forename><surname>Floratou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jignesh</forename><forename type="middle">M</forename><surname>Patel</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Eugene</forename><forename type="middle">J</forename><surname>Shekita</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sandeep</forename><surname>Tata</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. VLDB Endow</title>
				<meeting>VLDB Endow</meeting>
		<imprint>
			<date type="published" when="2011-04">April 2011</date>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="page" from="419" to="429" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<title level="m" type="main">Programming Pig</title>
		<author>
			<persName><forename type="first">Alan</forename><forename type="middle">F</forename><surname>Gates</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2011">2011</date>
			<publisher>O&apos;Reilly Media</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<monogr>
		<title level="m" type="main">Hadoop performance models</title>
		<author>
			<persName><forename type="first">Herodotos</forename><surname>Herodotou</surname></persName>
		</author>
		<idno>CoRR, abs/1106.0940</idno>
		<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Profiling, what-if analysis, and cost-based optimization of mapreduce programs</title>
		<author>
			<persName><forename type="first">Herodotos</forename><surname>Herodotou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Shivnath</forename><surname>Babu</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">PVLDB</title>
		<imprint>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="issue">11</biblScope>
			<biblScope unit="page" from="1111" to="1122" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">Automatic optimization for mapreduce programs</title>
		<author>
			<persName><forename type="first">Eaman</forename><surname>Jahani</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><forename type="middle">J</forename><surname>Cafarella</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Christopher</forename><surname>R´e</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proc. VLDB Endow</title>
				<meeting>VLDB Endow</meeting>
		<imprint>
			<date type="published" when="2011-03">mar 2011</date>
			<biblScope unit="volume">4</biblScope>
			<biblScope unit="page" from="385" to="396" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Map-join-reduce: Toward scalable and efficient data analysis on large clusters</title>
		<author>
			<persName><forename type="first">Dawei</forename><surname>Jiang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><forename type="middle">H</forename><surname>Anthony</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Gang</forename><surname>Tung</surname></persName>
		</author>
		<author>
			<persName><surname>Chen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on Knowledge and Data Engineering</title>
		<imprint>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="page" from="1299" to="1311" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">A study of skew in mapreduce applications</title>
		<author>
			<persName><forename type="first">Yongchul</forename><surname>Kwon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Magdalena</forename><surname>Balazinska</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Bill</forename><surname>Howe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Jerome</forename><surname>Rolia</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">the 5th Open Cirrus Summit</title>
				<meeting><address><addrLine>Moskow, Russia</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2011-06">june 2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Llama: leveraging columnar storage for scalable join processing in the mapreduce framework</title>
		<author>
			<persName><forename type="first">Yuting</forename><surname>Lin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Divyakant</forename><surname>Agrawal</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Chun</forename><surname>Chen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Beng</forename></persName>
		</author>
		<author>
			<persName><forename type="first">Chin</forename><surname>Ooi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Sai</forename><surname>Wu</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2011 international conference on Management of data, SIGMOD &apos;11</title>
				<meeting>the 2011 international conference on Management of data, SIGMOD &apos;11<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2011">2011</date>
			<biblScope unit="page" from="961" to="972" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<monogr>
		<title level="m" type="main">Adaptive join plan generation in hadoop</title>
		<author>
			<persName><forename type="first">Gang</forename><surname>Luo</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Liang</forename><surname>Dong</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
		<respStmt>
			<orgName>Duke University</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Technical report</note>
</biblStruct>

<biblStruct xml:id="b21">
	<monogr>
		<title level="m">Proceedings of the 5th European conference on Computer systems, EuroSys 2010</title>
				<editor>
			<persName><forename type="first">Christine</forename><surname>Morin</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Gilles</forename><surname>Muller</surname></persName>
		</editor>
		<meeting>the 5th European conference on Computer systems, EuroSys 2010<address><addrLine>Paris, France</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2010">April 13-16, 2010. 2010</date>
		</imprint>
	</monogr>
	<note>European Conference on Computer Systems</note>
</biblStruct>

<biblStruct xml:id="b22">
	<analytic>
		<title level="a" type="main">Processing thetajoins using mapreduce</title>
		<author>
			<persName><forename type="first">Alper</forename><surname>Okcan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Mirek</forename><surname>Riedewald</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2011 international conference on Management of data, SIGMOD &apos;11</title>
				<meeting>the 2011 international conference on Management of data, SIGMOD &apos;11<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2011">2011</date>
			<biblScope unit="page" from="949" to="960" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b23">
	<monogr>
		<title level="m" type="main">A comparative analysis of join algorithms using the hadoop map/reduce framework</title>
		<author>
			<persName><forename type="first">Konstantina</forename><surname>Palla</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2009">2009</date>
		</imprint>
		<respStmt>
			<orgName>MSc Informatics, School of Informatics, University of Edinburgh</orgName>
		</respStmt>
	</monogr>
	<note type="report_type">Master&apos;s thesis</note>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">A comparison of approaches to large-scale data analysis</title>
		<author>
			<persName><forename type="first">Andrew</forename><surname>Pavlo</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Erik</forename><surname>Paulson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Alexander</forename><surname>Rasin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Daniel</forename><forename type="middle">J</forename><surname>Abadi</surname></persName>
		</author>
		<author>
			<persName><forename type="first">David</forename><forename type="middle">J</forename><surname>Dewitt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Samuel</forename><surname>Madden</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><surname>Stonebraker</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 35th SIGMOD international conference on Management of data, SIGMOD &apos;09</title>
				<meeting>the 35th SIGMOD international conference on Management of data, SIGMOD &apos;09<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="165" to="178" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<analytic>
		<title level="a" type="main">A performance evaluation of four parallel join algorithms in a shared-nothing multiprocessor environment</title>
		<author>
			<persName><forename type="first">Donovan</forename><forename type="middle">A</forename><surname>Schneider</surname></persName>
		</author>
		<author>
			<persName><forename type="first">David</forename><forename type="middle">J</forename><surname>Dewitt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">SIGMOD Rec</title>
		<imprint>
			<biblScope unit="volume">18</biblScope>
			<biblScope unit="page" from="110" to="121" />
			<date type="published" when="1989-06">June 1989</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b26">
	<analytic>
		<title level="a" type="main">Efficient parallel set-similarity joins using mapreduce</title>
		<author>
			<persName><forename type="first">Rares</forename><surname>Vernica</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Michael</forename><forename type="middle">J</forename><surname>Carey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Chen</forename><surname>Li</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2010 international conference on Management of data, SIGMOD &apos;10</title>
				<meeting>the 2010 international conference on Management of data, SIGMOD &apos;10<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2010">2010</date>
			<biblScope unit="page" from="495" to="506" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b27">
	<analytic>
		<title level="a" type="main">A simulation approach to evaluating design decisions in mapreduce setups</title>
		<author>
			<persName><forename type="first">Guanying</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ali</forename><forename type="middle">Raza</forename><surname>Butt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Prashant</forename><surname>Pandey</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Karan</forename><surname>Gupta</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">MASCOTS</title>
				<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="1" to="11" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b28">
	<analytic>
		<title level="a" type="main">Map-reduce-merge: simplified relational data processing on large clusters</title>
		<author>
			<persName><forename type="first">Hung-Chih</forename><surname>Yang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ali</forename><surname>Dasdan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Ruey-Lung</forename><surname>Hsiao</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">Stott</forename><surname>Parker</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2007 ACM SIGMOD international conference on Management of data, SIGMOD &apos;07</title>
				<meeting>the 2007 ACM SIGMOD international conference on Management of data, SIGMOD &apos;07<address><addrLine>New York, NY, USA</addrLine></address></meeting>
		<imprint>
			<publisher>ACM</publisher>
			<date type="published" when="2007">2007</date>
			<biblScope unit="page" from="1029" to="1040" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b29">
	<analytic>
		<title level="a" type="main">Processing complex similarity queries: A systematic approach</title>
		<author>
			<persName><forename type="first">Anna</forename><surname>Yarygina</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Boris</forename><surname>Novikov</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Natalia</forename><surname>Vassilieva</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">ABDIS 2011 Research Communications: Proceedings II of the 5th East-European Conference on Advances in Databases and Information Systems 20 -23</title>
				<editor>
			<persName><forename type="first">Maria</forename><surname>Bielikova</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Johann</forename><surname>Eder</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">Min</forename><surname>Tjoa</surname></persName>
		</editor>
		<meeting><address><addrLine>Vienna</addrLine></address></meeting>
		<imprint>
			<publisher>Austrian Computer Society</publisher>
			<date type="published" when="2011-09">September 2011. September 2011</date>
			<biblScope unit="page" from="212" to="221" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b30">
	<analytic>
		<title level="a" type="main">Join optimization in the mapreduce environment for column-wise data store</title>
		<author>
			<persName><forename type="first">Minqi</forename><surname>Zhou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Rong</forename><surname>Zhang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Dadan</forename><surname>Zeng</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Weining</forename><surname>Qian</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Aoying</forename><surname>Zhou</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2010 Sixth International Conference on Semantics, Knowledge and Grids, SKG &apos;10</title>
				<meeting>the 2010 Sixth International Conference on Semantics, Knowledge and Grids, SKG &apos;10<address><addrLine>Washington, DC</addrLine></address></meeting>
		<imprint>
			<biblScope unit="page" from="97" to="104" />
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
