# Ricardo: Integrating R and Hadoop

←

**Page content transcription**

If your browser does not render page correctly, please read the page content below

Ricardo: Integrating R and Hadoop Sudipto Das1∗ Yannis Sismanis2 Kevin S. Beyer2 Rainer Gemulla2 Peter J. Haas2 John McPherson2 1 2 University of California IBM Almaden Research Center Santa Barbara, CA, USA San Jose, CA, USA sudipto@cs.ucsb.edu {syannis, kbeyer, rgemull, phaas, jmcphers}@us.ibm.com ABSTRACT 1. INTRODUCTION Many modern enterprises are collecting data at the most detailed Many of today’s enterprises collect data at the most detailed level level possible, creating data repositories ranging from terabytes to possible, thereby creating data repositories ranging from terabytes petabytes in size. The ability to apply sophisticated statistical anal- to petabytes in size. The knowledge buried in these enormous ysis methods to this data is becoming essential for marketplace datasets is invaluable for understanding and boosting business per- competitiveness. This need to perform deep analysis over huge formance. The ability to apply sophisticated statistical analysis data repositories poses a significant challenge to existing statistical methods to this data can provide a significant competitive edge in software and data management systems. On the one hand, statisti- the marketplace. For example, internet companies such as Amazon cal software provides rich functionality for data analysis and mod- or Netflix provide personalized recommendations of products to eling, but can handle only limited amounts of data; e.g., popular their customers, incorporating information about individual prefer- packages like R and SPSS operate entirely in main memory. On the ences. These recommendations increase customer satisfaction and other hand, data management systems—such as MapReduce-based thus play an important role in building, maintaining, and expanding systems—can scale to petabytes of data, but provide insufficient a loyal customer base. Similarly, applications like internet search analytical functionality. We report our experiences in building Ri- and ranking, fraud detection, risk assessment, microtargeting, and cardo, a scalable platform for deep analytics. Ricardo is part of the ad placement gain significantly from fine-grained analytics at the eXtreme Analytics Platform (XAP) project at the IBM Almaden level of individual entities. This paper is about the development of Research Center, and rests on a decomposition of data-analysis al- industrial-strength systems that support advanced statistical analy- gorithms into parts executed by the R statistical analysis system and sis over huge amounts of data. parts handled by the Hadoop data management system. This de- The workflow for a data analyst comprises multiple activities. composition attempts to minimize the transfer of data across system Typically, the analyst first explores the data of interest, usually via boundaries. Ricardo contrasts with previous approaches, which try visualization, sampling, and aggregation of the data into summary to get along with only one type of system, and allows analysts to statistics. Based on this exploratory analysis, a model is built. The work on huge datasets from within a popular, well supported, and output of the model is itself explored—often through visualization powerful analysis environment. Because our approach avoids the and also through more formal validation procedures—to determine need to re-implement either statistical or data-management func- model adequacy. Multiple iterations of model-building and evalua- tionality, it can be used to solve complex problems right now. tion may be needed before the analyst is satisfied. The final model is then used to improve business practices or support decision mak- ing. Feedback from model users can lead to further iterations of the Categories and Subject Descriptors model-development cycle. During this process, the data analyst’s indispensable toolkit is a H.4 [Information Systems Applications]: Miscellaneous statistical software package such as R, SPSS, SAS, or Matlab. Each of these packages provides a comprehensive environment for sta- tistical computation, including a concise statistical language, well General Terms tested libraries of statistical algorithms for data exploration and Algorithms, Design modeling, and visualization facilities. We focus on the highly pop- ular R statistical analysis program. The Comprehensive R Archive ∗ Network (CRAN) contains a library of roughly 2000 add-in pack- The author conducted parts of this work at the IBM Almaden Re- search Center. ages developed by leading experts and covering areas such as lin- ear and generalized linear models, nonlinear regression models, time series analysis, resampling methods, classical parametric and nonparametric tests, classification, clustering, data smoothing, and Permission to make digital or hard copies of all or part of this work for many more [13]. We refer to the application of these sophisticated personal or classroom use is granted without fee provided that copies are statistical methods as deep analytics. not made or distributed for profit or commercial advantage and that copies Most statistical software packages, including R, are designed to bear this notice and the full citation on the first page. To copy otherwise, to target the moderately-sized datasets commonly found in other areas republish, to post on servers or to redistribute to lists, requires prior specific of statistical practice (e.g., opinion polls). These systems operate permission and/or a fee. on a single server and entirely in main memory; they simply fail SIGMOD’10, June 6–11, 2010, Indianapolis, Indiana, USA. Copyright 2010 ACM 978-1-4503-0032-2/10/06 ...$10.00. when the data becomes too large. Unfortunately, this means that 987

data analysts are unable to work with these packages on massive tified as a key requirement for competitive enterprise analyt- datasets. Practitioners try to avoid this shortcoming either by ex- ics [9]. ploiting vertical scalability—that is, using the most powerful ma- chine available—or by working on only subsets or samples of the • Integration of data processing into the analytical workflow. data. Both approaches have severe limitations: vertical scalabil- Analysts traditionally handle large data by preprocessing and ity is inherently limited and expensive, and sampling methods may reducing it—using either a DMS or shell scripts—and then lose important features of individuals and of the tail of the data manually loading the result into a statistical package, e.g., as distribution [9]. delimited text files. By using an integrated approach to data In parallel to the development of statistical software packages, processing, Ricardo frees data analysts from this tedious and the database community has developed a variety of large-scale data error-prone process, and allows them to leverage all available management systems (DMSs) that can handle huge amounts of data. data. Examples include traditional enterprise data warehouses and • Reliability and community support. Ricardo is built from newer systems based on MapReduce [11], such as Hadoop. The widely adopted open-source projects from both the data man- data is queried using high-level declarative languages such as SQL, agement community and the statistical community. It lever- Jaql, Pig, or Hive [14, 19, 23]. These systems leverage decades of ages the efforts of both communities and has a reliable, well research and development in distributed data management, and ex- supported, and state-of-the-art code base. cel in massively parallel processing, scalability, and fault tolerance. In terms of analytics, however, such systems have been limited pri- • Improved user code. Ricardo facilitates more concise, more marily to aggregation processing, i.e., computation of simple ag- readable, and more maintainable code than is possible with gregates such as SUM, COUNT, and AVERAGE, after using fil- previous approaches. tering, joining, and grouping operations to prepare the data for the aggregation step. For example, traditional reporting applications • Deep analytics. By exploiting R’s functionality, Ricardo can arrange high-level aggregates in cross tabs according to a set of hi- handle many kinds of advanced statistical analyses, includ- erarchies and dimensions. Although most DMSs provide hooks for ing principal and independent component analysis, k-means user-defined functions and procedures, they do not deliver the rich clustering, and SVM classification, as well as the fitting and analytic functionality found in statistical packages. application of generalized-linear, latent-factor, Bayesian, time- To summarize, statistical software is geared towards deep ana- series, and many other kinds of statistical models. lytics, but does not scale to large datasets, whereas DMSs scale to large datasets, but have limited analytical functionality. Enter- • No re-inventing of wheels. By combining existing statistical prises, which increasingly need analytics that are both deep and and DMS technology, each of which represents decades of scalable, have recently spurred a great deal of research on this prob- research and development, we can immediately start to solve lem; see Section 6. Indeed, the work in this paper was strongly mo- many deep analytical problems encountered in practice. tivated by an ongoing research collaboration with Visa to explore Ricardo is inspired by the work in [8], which shows that many approaches to integrating the functionality of R and Hadoop [10]. deep analytical problems can be decomposed into a “small-data As another example, Cohen at al. [9] describe how the Fox Audi- part” and a “large-data part.” In Ricardo, the small-data part is ex- ence Network is using statistical functionality built inside a large- ecuted in R and the large-data part is executed in the Hadoop/Jaql scale DMS. As discussed in Section 6, virtually all prior work at- DMS. A key requirement for the success of this combined approach tempts to get along with only one type of system, either adding is that the amount of data that must be communicated between both large-scale data management capability to statistical packages or systems be sufficiently small. Fortunately, this requirement holds adding statistical functionality to DMSs. This approach leads to so- for almost all of the deep analytics mentioned above. lutions that are often cumbersome, unfriendly to analysts, or waste- In the following sections, we show how Ricardo can facilitate ful in that a great deal of well established technology is needlessly some key tasks in an analyst’s typical workflow: data exploration, re-invented or re-implemented. model building, and model evaluation, all over a very large dataset. In this paper, we report our experience in building Ricardo, a For illustrative purposes, we use the dataset provided for the Net- scalable platform for deep analytics. Ricardo—which is part of the flix movie-recommendation competition [16]. Although the com- eXtreme Analytics Platform (XAP) project at the IBM Almaden petition itself was based on a subset of just 100M movie ratings, Research Center—is named after David Ricardo, a famous econo- our experiments on a Hadoop cluster in the Amazon Elastic Com- mist of the early 19th century who studied conditions under which pute Cloud (EC2) indicate that Ricardo can scale R’s functionality mutual trade is advantageous. Ricardo facilitates “trading” between to handle the billions of ratings found in practice—over a terabyte R and Hadoop, with R sending aggregation-processing queries to of data in our case. Hadoop (written in the high-level Jaql query language), and Hadoop We emphasize that an analyst who uses Ricardo need not neces- sending aggregated data to R for advanced statistical processing or sarily be an expert in Jaql nor understand exactly how to decompose visualization—each trading partner performs the tasks that it does all the deep analytics appropriately. Ricardo can potentially deliver best. In contrast to previous approaches, Ricardo has the following much of its deep-analytics functionality in the form of R packages advantages: and functions that hide most of the messy implementation details. • Familiar working environment. Analysts want to work within For example, we describe in the sequel how Ricardo can be used a statistical environment, and Ricardo lets them continue to to efficiently fit a latent-factor model of movie preferences over do so. a massive dataset stored in a Hadoop cluster, as well as how Ri- cardo can be used for large-scale versions of principal component • Data attraction. Ricardo uses Hadoop’s flexible data store analysis (PCA) and generalized linear models (GLMs). This func- together with the Jaql query language. This combination al- tionality can potentially be delivered to the analyst via high-level R lows analysts to work directly on any dataset in any format; functions called, e.g., jaqlLF, jaqlPCA, and jaqlGLM. Of course, this property of “attracting” data of any type has been iden- if existing Ricardo packages do not meet the needs of a particular 988

ware such as R offers a convenient and powerful environment for 4.0 ● ● Dat a performing this type of exploration. However, such software can- ● Fit not scale to the size of the datasets found in practice. Although, ● 3.9 ● ● ● ● for the competition, Netflix published only a small subset of its rat- ● ings (100M), the actual number of (explicit and implicit) ratings Average Rat ing ● ● ● ●● ● ● encountered in practice is orders of magnitude larger. Ricardo al- 3.8 ● ● ● ● ● ● ● ● lows such data to be efficiently preprocessed, aggregated, and re- ● ● ●● ● duced by Hadoop, and then passed to R for regression analysis and 3.7 ● ● ● ● ● ● ● ● ● ● ● visualization. ● ● ● During the evaluation phase the analyst wants to understand and ● ●● 3.6 ● ●●● quantify the quality of a trained model. In our second example, we ● ● assume that the analyst has built a model—such as a latent-factor recommendation model as described in the sequel—and wants to 3.5 identify the top-k outliers, i.e., to identify data items on which the 1950 1960 1970 1980 1990 2000 model has performed most poorly. Such an analysis, which must be Year of Release performed over all of the data, might lead to the inclusion of addi- tional explanatory variables (such as movie age) into the model, to Figure 1: Average rating of a movie depending on its age improve the model’s accuracy. Ricardo enables such outlier analy- sis by allowing the application of complex R-based statistical mod- els over massive data. It does so by leveraging the parallelism of analysis, then the analyst will have to implement the lower-level the underlying Hadoop DMS. functionality. The hope is that, over time, users will develop a large The foregoing examples illustrate “simple trading” scenarios be- library of Ricardo packages in the same way that the CRAN repos- tween R and Hadoop. In the first case, data is aggregated and pro- itory has been developed for in-memory analytical packages. The cessed before it is passed to R for advanced analysis; in the second XAP project team is trying to kick off this effort by providing pack- case, an R statistical model is passed to Hadoop for efficient paral- ages for the most common types of large-scale analyses. lel evaluation over the massive dataset. As discussed below, other The remainder of this paper is structured as follows. In Section 2, analyses require more intricate exchanges, which Ricardo also sup- we drill down into key aspects of a typical analytics workflow, us- ports. ing movie recommendation data as a running example. Section 3 briefly describes the systems of interest: the R package for statis- 2.2 Complex Trading tical computing, the Hadoop DMS, and the Jaql query language. Our third example illustrates the use of Ricardo during the mod- In Section 4, we describe Ricardo and illustrate its use on several eling phase of an analyst’s workflow. One approach to model build- analysis tasks. Section 5 describes our experimental study on the ing over a huge dataset might use a simple-trading scheme in which Netflix data. We discuss prior work in Section 6 and give our con- Hadoop reduces the data by aggregation or sampling, and then clusions in Section 7. passes the data to R for the model-building step. The downside of this approach is that detailed information, which must be ex- 2. MOTIVATING EXAMPLES ploited to gain a competitive edge, is lost. As shown below, Ri- We motivate Ricardo in the context of three examples that cover cardo permits a novel “complex trading” approach that avoids such key aspects of the analyst’s workflow. The examples are centered information loss. around the Netflix competition [5]. This competition was estab- The complex-trading approach, like simple trading, requires a lished in 2006 in order to improve the recommender system that decomposition of the modeling into a small-data part, which R han- Netflix uses to suggest movies to its ten million customers. Since dles, and a large-data part, which Hadoop handles—as mentioned recommendations play an important role in establishing, maintain- in Section 1, many deep analytical problems are amenable to such a ing and expanding a loyal customer base, such systems have be- decomposition. Unlike simple trading, however, a complex-trading come the backbone of many of the major firms on the web such algorithm involves multiple iterations over the data set, with trading as Amazon, eBay, and Apple’s iTunes [15, 25]. Unlike search en- back and forth between R and Hadoop occurring at each iteration. gines, which help find information that we know we are interested As an instructive example, we consider the problem of building a in, recommender systems help discover people, places, and things latent-factor model of movie preferences over massive Netflix-like previously unknown to us. We classify the examples by the degree data. This modeling task is central to the winning Netflix com- of complexity in the trading between R and Hadoop. petition technique [18], and enables accurate personalized recom- mendations for each individual user and movie, rather than global 2.1 Simple Trading recommendations based on coarse customer and movie segments. Our first two examples concern the exploration and evaluation Because such a model must discern each customer’s preferences phases of the analyst’s workflow. During the exploration phase, an from a relatively small amount of information on that customer, it analyst tries to gain preliminary insights about the dataset of inter- is clear that every piece of available data must be taken into ac- est. For example, Figure 1 depicts how movies are perceived with count. As with many other deep analytics problems, the sampling respect to their age. We can see that, on average, older movies are and aggregation used in a simple-trading approach is unacceptable perceived more positively than newer movies. To produce this sim- in this setting. ple data visualization, the analyst first performs a linear regression To understand the idea behind latent-factor models, consider the and then calls upon a plotting facility to display the raw data and data depicted in Figure 2, which shows the ratings of three cus- fitted model. The analyst might also want to formally verify that tomers and three movies in matrix form. The ratings are printed in the fitted trend is statistically significant by looking at summary boldface and vary between 1 (hated the movie) and 5 (loved it). For test statistics such as the t-statistic for the slope. Statistical soft- example, Michael gave a rating of 5 to the movie “About Schmidt” 989

About Schmidt Lost in Translation Sideways 3.1 The R Project for Statistical Computing (2.24) (1.92) (1.18) R was originally developed by Ross Ihaka and Robert Gentle- Alice ? 4 2 man, who were at that time working at the statistics department (1.98) (4.4) (3.8) (2.3) of the University of Auckland, New Zealand. R provides both an open-source language and an interactive environment for statisti- Bob 3 2 ? cal computation and graphics. The core of R is still maintained (1.21) (2.7) (2.3) (1.4) by a relatively small set of individuals, but R’s enormous popu- Michael 5 ? 3 larity derives from the thousands of sophisticated add-on packages (2.30) (5.2) (4.4) (2.7) developed by hundreds of statistical experts and available through CRAN. Large enterprises such as AT&T and Google have been supporting R, and companies such as REvolution Computing sell Figure 2: A simple latent-factor model for predicting movie versions of R for commercial environments. ratings. (Data points in boldface, latent factors and estimated As a simple example of R’s extensive functionality, consider the ratings in italics.) following small program that performs the regression analysis and data visualization shown previously in Figure 1. It takes as input a “data frame” df that contains the mean ratings of the movies in the and a rating of 3 to “Sideways”. In general, the ratings matrix is Netflix dataset by year of publication, performs a linear regression, very sparse; most customers have rated only a small set of movies. and plots the result: The italicized number below each customer and movie name is a latent factor. In this example, there is just one factor per entity: fit

3.3 Jaql: A JSON Query Language receive the results of such queries as R data frames, but also allows Perhaps the main drawback of Hadoop is that its programming Jaql queries to spawn R processes on Hadoop worker nodes. The interface is too low-level for most of its users. For this reason, a bridge comprises an R package that provides integration of Jaql into variety of projects aim at providing higher-level query interfaces R and a Jaql module that integrates R into Jaql. The latter module on top of Hadoop; notable examples include Jaql [14], Pig [19], allows worker nodes to execute R scripts in parallel and R functions Hive [23] and Cascading2 . Ricardo uses Jaql as its declarative inter- to be used inside Jaql queries. The key functions3 provided by the face to Hadoop. Jaql is an open-source dataflow language with rich R package are: data processing features such as transformation, filtering, join pro- jaqlConnect() Opens a channel connecting R to a cessing, grouping and aggregation. Jaql scripts are automatically Hadoop cluster. compiled into MapReduce jobs, which are then executed in paral- jaqlSave() Saves data from R to HDFS. lel by Hadoop. Since Jaql is built around the JSON data model and jaqlValue() Returns to R arbitrarily complex JSON is highly extensible, it enhances Hadoop’s usability while retaining results from Jaql queries. all of Hadoop’s flexibility. jaqlTable() Like jaqlValue() but optimized for Although Jaql operates directly on user data files, it makes use data frames (i.e. tabular data). of JSON views to facilitate data processing. For example, consider jaqlExport() Exports R objects from the R driver the following JSON view over the Netflix dataset: process to R processes running on the [ worker nodes. { The components of Ricardo work together to support an analyst’s customer: "Michael", movie: { name: "About Schmidt", year: 2002 }, workflow. The analyst typically starts by issuing Jaql queries from rating: 5 inside a top-level R process. These queries sample or aggregate the }, data to allow viewing and visualization of the data from within R. ... Next, the analyst builds models of the data. The building of these ], models—e.g., by training the model or fitting parameters—as well as the validation of their quality—e.g., by visualization, by cross Square brackets denote arrays (all ratings) and curly braces enclose validation, or by computing measures of fit or test statistics—is structured objects (individual rating or movie). The following Jaql performed as a joint effort of R, Jaql, and the R-Jaql bridge. In the query computes average ratings as a function of movie age; this following subsections, we give specific examples of how Ricardo data can then be “traded” to R, which can in turn process the data can be used in an analytic workflow. to produce Figure 1. 4.2 Simple Trading read("ratings") -> group by year = $.movie.year First recall the data-exploration example of Section 2.1. The fol- into { year, mean: avg($[*].rating) } lowing R script shows how the jaqlTable() function is used to -> sort by [ $.year ]. push the aggregation of the data to the Hadoop cluster using Jaql. It computes the data frame df that holds the average ratings for The operator -> pipes the output of the expression on the left movies of different ages; R then processes df using the code given hand side into the right hand side; the current record is accessed in Section 3.1 to fit a regression model and produce Figure 1. As via reference to the special variable $. Jaql provides functionality discussed in Section 3, R can use the summary(fit) command to that would be tedious to implement using the native Hadoop API. determine the adequacy of the regression model. ch sort by [ $.year ] Figure 3 gives an overview of Ricardo’s design. Ricardo consists ’) of three components: an R driver process operated by the data ana- lyst, a Hadoop cluster that hosts the data and runs Jaql (and possi- Now recall the second example of Section 2.1, in which the an- bly also some R sub-processes), and an R-Jaql bridge that connects alyst wants to apply a trained model over all the data in order to these two components. compute the top-k outliers. The following R script shows how a R serves as an interactive environment for the data analyst, but in trained model can be invoked in parallel using jaqlExport(). In contrast to classical R usage, the data itself is not memory-resident this example, we use the linear model computed above. in R. Instead, the base data is stored in a distributed file system mymodel

Figure 3: Overview of Ricardo’s architecture. error: pow( R("mymodel", [$.movie.year]) 4.3.1 Computing a Latent-Factor Model - rating, 2) } Recall from Section 2 that the latent-factor model for movie -> top 10 by [ $.error desc ] recommendations assigns a set of latent factors to each customer ’) and each movie. These factors are used to predict ratings that are unknown; movies with high predicted ratings can then be recom- Here mymodel() is an R function that implements the linear model mended to the customer. This general scheme also applies to other evaluation, outputting an estimated average rating corresponding recommendation problems. In general, our goal is to recommend an input movie age. The jaqlExport() invocations ensure that items (movies) to users (customers) based on known relationships both the computed model fit and the function mymodel() are between items and users. “known” by the R-processes that are spawned on the worker nodes. Indexes u and i denote users and items. Denote by pu the latent During execution of the Jaql query, the worker nodes, in parallel, factor associated with user u and by qi the latent factor for item i. each execute the mymodel() function and compute the correspond- Once learned, these factors allow us to compute a predicted rating ing squared errors. The errors are sorted in descending order (us- r̂ui of u for i via a simple product: ing the MapReduce framework), and the top-k outliers are returned back to R as a data frame. Note that the function mymodel() is r̂ui = pu qi . (1) simple enough to be implemented entirely in Jaql, without requir- ing R to evaluate it. In practice, however, this is seldom the case. The value of r̂ui predicts how much user u will like (or dislike) item See, for example, the time-series models discussed in Section 4.4. i. As mentioned previously, this latent-factor model is highly sim- plified for aid in understanding Ricardo; an industrial-strength rec- 4.3 Complex Trading ommender system would (1) maintain a vector of factors for each In this section, we describe in detail how Ricardo can be used user and items, (2) use additional information about the user and for building statistical models over massive data when simple trad- item (such as demographic information), and (3) would account for ing approaches do not suffice. We first illustrate our approach us- shifts of preferences over time [17]. All of these extensions can be ing the latent-factor model mentioned in Section 2.2, and then in handled by Ricardo. Section 4.4 we briefly indicate other types of analysis that can be Recent work [4, 7, 16] has suggested that the latent factors be handled by Ricardo. learned via an optimization-based approach that tries to minimize Recall that complex-trading scenarios arise when the model of the sum of squared errors between the observed ratings and the interest must incorporate all of the available (massive) data. Be- corresponding predicted ratings from the model. Thus we want to cause data reduction prior to modeling is not allowed, the data will solve the problem not fit in main memory. Ricardo does require that the model itself— X min (rui − pu qi )2 , (2) e.g., the set of latent factors in our Netflix example—fit into the {pu },{qi } u,i main memory of the analyst’s R process. This assumption holds for all but extremely large models (such as those in PageRank algo- where the sum is taken over the set of observed ratings.4 rithms). In the case of Netflix, the latent factors occupy on the order The above optimization problem is large and sparse, and has to of tens to hundreds of megabytes of memory, even after scaling up be solved using numerical methods. The general algorithm is as the numbers of customers and movies used in the competition by follows: several orders of magnitude. A model of this size can easily fit in main memory. In contrast, the base data on customers and movies 1. Pick (random) starting points for the values of pu and qi . ranges from hundreds of gigabytes to terabytes and is thus signifi- 4 In fact, (2) has been simplified; our actual implementation makes cantly larger than the model. Ricardo places no restrictions on the use of “regularization” techniques to avoid overfitting. For Netflix base-data size, as long as the Hadoop cluster is equipped with a data, a simple weight decay scheme—which amounts to adding a sufficient number of worker nodes to process the data. penalty term to (2)—has proven successful [16]. 992

2. Compute the squared error and the corresponding gradients 4.3.3 The Hadoop and Jaql Component with respect to each pu and qi , using the current values of pu In Ricardo, Hadoop and Jaql are responsible for data storage and and qi . large-scale aggregation processing. For the latent-factor example, this latter processing corresponds to the computation of e and de 3. Update the values of each pu and qi according to some up- at each step of the R-driven optimization algorithm. For the Net- date formula. flix data, the ratings are stored in a table r and the latent factors 4. Repeat steps 2 and 3 until convergence. are stored in tables p and q. For simplicity, we assume that the following JSON views have been defined over these datasets: The idea behind this “gradient descent” algorithm is to use the gra- dient information to try and reduce the value of the squared error as r: schema { u: long, i: long, rating: double } much as possible at each step. Observe that step 2 corresponds to a p: schema { u: long, factor: double } summation over the entire dataset and is thus data-intensive, while q: schema { i: long, factor: double } step 3 requires the use of a sophisticated optimization algorithm Each record in the ratings table corresponds to a single rating by that is able to deal with a large number of parameters. user u of item i. Each record in p or q corresponds to a latent 4.3.2 The R Component factor. We start with a simple “naive” Jaql implementation of the e and We next describe how R contributes to the model-fitting proce- de functions and then discuss some potential optimizations. Our dure described in Section 4.3.1 by using its sophisticated optimiza- goal is to compute the following quantities: tion algorithms. We assume the existence of two functions e and X de, which compute the squared error and the corresponding gradi- e= (rui − pu qi )2 , ents for specific values of the latent factors. Both functions take u,i a single argument pq, which holds the concatenation of the latent ∂e X factors for users and items. (The description of how we implement = −2 (rui − pu qi )qi , ∂pu these functions is deferred to Sections 4.3.3 and 4.3.4.) R can then i use its optim function to drive the overall optimization process. ∂e X = −2 (rui − pu qi )pu , The optim function operates by using the current squared error ∂qi u value and gradient computed by e and de. Then optim uses this information to update the pq values in such a manner as to reduce where, as before, the sums are taken over the observed ratings. For the squared error as much as possible. This process is repeated the computation of the squared error e, we have to bring together until the squared error no longer decreases significantly. The up- the rating from the r table and the corresponding factors from the dating process can be viewed as taking a “downhill step” in the p and q tables. The following Jaql query does the trick: space of possible pq values. Both the direction and size of the step join r, p, q are determined by the specific optimization method that is chosen, where r.u == p.u and r.i == q.i and can be quite complex. As discussed below, R has a number of into { pu : p.factor, qi : q.factor, rui : r.rating } optimization methods to choose from. -> transform { error: pow( $.rui - $.pu *$.qi , 2 )} The following snippet contains all of the high-level R code that -> sum( $.error ); is required to run the optimization: This query first performs a three-way join between r, p, and q, then model transform { u: $.u, or bounding the number of iterations. gradient: ($.rui -$.pu *$.qi )*$.qi } -> group by u = $.u Some popular optimization algorithms provided by R include the into { u, gradient: -2.0*sum($[*].gradient)}; conjugate-gradient method [3] and L-BFGS [6]. Optimization is a complex field and there are many different methods, each with its The query returns a table containing pairs of users u and the cor- own strengths and weaknesses. We experimented with many differ- responding gradient ∂e/∂pu . The query for the gradients with re- ent optimization methods and we found that the L-BFGS method spect to the movie factors is similar. is very effective. L-BFGS is an optimization technique for solv- In our actual implementation, we used an optimized query that ing large non-linear optimization problems; it implements a lim- computes the error and gradients simultaneously. This has the ad- ited memory quasi-Newtonian optimization algorithm based on the vantage that the number of MapReduce jobs generated by Jaql— Broyden-Fletcher-Goldfarb-Shanno (BFGS) method. The details and thus the number of passes over the data—is reduced from three of this method are beyond the scope of this paper; in essence, it to one. The optimized query is given by: makes use of the values of e and de to learn the “curvature” of the r -> hashJoin( fn(r) r.i, q, fn(q) q.i, objective function (the squared error in our case) by maintaining a fn(r,q) { r.*, qi : q.factor } ) low-memory approximation of the inverse of the Hessian Matrix. -> hashJoin( fn(r) r.u, p, fn(p) p.u, This information is then used to estimate the best direction and size fn(r,p) { r.*, pu : p.factor } ) for the next optimization step. -> transform { $.*, diff: $.rating-$.pu *$.qi } 993

-> expand [ { value: pow( $.diff, 2.0 ) }, For purposes of exposition, all of our examples so far have been { $.u, value: -2.0*$.diff*$.qi }, in the setting of the Netflix dataset, so that our focus has been a { $.i, value: -2.0*$.diff*$.pu } ] bit narrow. E.g., the latent-factor model, while certainly nontrivial -> group by g = { $.u, $.i } into { g.u?, g.i?, total: sum($[*].value) } and providing a good demonstration of the power of the Ricardo framework, is actually somewhat simple in terms of statistical so- This query, though compact in terms of lines of Jaql code, is rather phistication. In this section we briefly outline how Ricardo can subtle in the way it exploits the features of the underlying map- be used to perform a number of other, more complex analyses, by combine-reduce framework. To avoid going into onerous detail, leveraging R’s extensive library of statistical functions. we simply mention that hashJoin is an efficient function that in- As one example, we experimented with R’s time-series analy- cludes in its argument list a key-extractor function for the probe sis functions and incorporated them in the recommender system. side, a dataset for the build side, a key extractor for the build side, In this scenario, we took the time of the rating into account, since and a function that pairs matching tuples of the join. The first hash people often change preferences over time. (For simplicity, we take join joins r and p, and the second hash join takes the result and the “time” for a rating to be the total number of movies that the cus- joins it with q. The remainder of the query performs all of the ag- tomer has rated up to and including the current movie.) The follow- gregations at once. It works with three different kind of records: ing R/Jaql code shows how one computes, in parallel, an “autore- (1) records with only a u field, (2) records with only an i field, and gressive integrated moving average” (ARIMA) time-series model (3) records with neither u nor i. The records are distinguished us- for each individual customer: ing the existence operator (denoted as a question mark in the query my.arima

independent component analysis, support vector machines, classi- Property Value fication, and many more types of analysis. The general approach to mapred.child.java.opts -Xmx700m scaling up these analytical tasks is to reformulate them in terms of io.sort.factor 100 “summation forms”. These sums, which are inherently distributive, io.file.buffer.size 1048576 can be executed in parallel. Then the results flow into algorithms io.sort.mb 256 that typically perform small matrix operations, such as (pseudo)- mapred.reduce.parallel.copies 20 inversions or eigenvector decompositions, depending upon the spe- mapred.job.reuse.jvm.num.tasks -1 cific analysis. Thus, although a relatively small collection of scal- fs.inmemory.size.mb 100 able analytics has been implemented so far, Ricardo can potentially be applied much more generally. Table 1: Hadoop configuration used in experiments 4.5 Implementation Details The design philosophy of Ricardo is to minimize the transfer hand, Jaql and Hadoop are primarily row-oriented. Surprisingly, of functionality between R and Hadoop—letting each component when large R objects are serialized in a row-oriented format, the do what it does best—as well as the amount of data transferred. cost within R of reading these objects from disk (or from any I/O The data that crosses the boundary between R and Jaql is usu- channel) grows super-linearly in the number of columns transferred. ally aggregated information. As shown by our latent-factor ex- This realization led us to design the bridge to perform the transla- ample, complex trading involves multiple iterations over the data, tion from row-oriented to column-oriented formats and vice versa. with aggregates crossing the R-Jaql bridge many times. The bridge The Jaql wrapper translates the row-oriented results and outputs must therefore be very efficient so as not to become a performance one file per column of data, while the wrapper on the R side reads bottleneck. The design of the bridge turned out to be rather in- the files one column at a time, and constructs the data frame from tricate, for a couple of reasons. One challenge is that R is im- the individual columns. This approach ensures that cost of data plemented entirely in C and Fortran, whereas Hadoop and Jaql transfer is linear with respect to the number of rows and the num- belong to the Java world. An even greater challenge arises be- ber of columns. Similar approaches were used to circumvent the cause the data formats of R and Jaql differ considerably. For ex- remaining incompatibilities between R and JSON objects. ample, R uses a column-oriented structure (data frames), whereas Jaql and Hadoop are designed for row-oriented access to data. As another example, R freely intermingles references to data items 5. EXPERIMENTAL STUDY by position (e.g., customer[[3]]) and references by association In this section, we report experimental results and share our ex- (e.g., customer$income), whereas JSON objects represent data in periences in implementing the latent factor model for movie recom- a way that maintains either position or association, but not both. In mendations. Our discussion focuses on performance and scalability this section, we discuss some of the design choices that we made aspects, although, as we have argued, Ricardo’s technical approach in implementing the R-Jaql bridge and their impacts on the perfor- has many advantages beyond simply providing a workable solution. mance of data transfers across the bridge. 5.1 Test Setup Bridging C with Java The problem of interfacing Java and C has All performance experiments were conducted on a cluster of 50 been well studied, and the Java Native Interface (JNI) is a common nodes in the Amazon Elastic Compute Cloud (EC2). Each node solution for bridging these languages. A straightforward solution was of type “High CPU Extra Large,” i.e., a 64-bit virtual machine would be to use JNI to submit the query from R to the Jaql engine, with 7 GB of memory, 20 EC2 Compute Units CPU capacity (8 vir- and when Jaql finishes computation, use JNI calls to iteratively tual cores with 2.5 EC2 Compute Units each), and 1690GB of lo- fetch data from Jaql into R, one tuple at a time. But this approach cal storage. Aggregated over the cluster, this amounts to about 400 is inefficient for transferring even a few hundred data tuples, i.e., a CPU cores, 70TB of aggregated disk space, and 350 GB of main few megabytes of data. For the Netflix latent-factor model, com- memory. We installed Hadoop version 0.20.0 on each of the nodes. puting an aggregate rating for a movie (over the customers who One of the nodes was selected as master and ran the Hadoop name- rated the movie) requires about 17K data tuples to be transferred node and jobtracker processes; the rest of the nodes were worker from Jaql to R. Using a JNI call for each tuple, the transfer takes nodes and provided both storage and CPU. Each worker node was tens of minutes, making this approach infeasible for any real-world configured to run up to seven concurrent map tasks and one reduce applications. We therefore designed the bridge to pass only meta- task. This map-heavy configuration was chosen because the bulk of and control-information using JNI calls, and wrappers on both the the processing is performed during the map phase; reducers merely R side and the Jaql side use this information to perform bulk data aggregate the map output. Table 1 lists other Hadoop parameters transfers using shared files. For instance, when transferring results that we chose; the remaining parameters match the default config- of a Jaql query to R, a Jaql wrapper materializes the result into a uration of Hadoop. The R driver itself was running on a separate file in a format that can be directly loaded into R, and passes the EC2 gateway node of type “Standard Extra Large”, which differs location of this file to the R process through JNI. A wrapper on from the remaining nodes in that it had more memory (15GB) but the R side reads this file and constructs an R object from the data, less CPU power (8 EC2 Compute Units: 4 virtual cores with 2 EC2 which can then be used for further R processing and analysis. This Compute Units each). indirection through files (or even through shared memory) results Our experiments were performed on “inflated” versions of the in orders-of-magnitude improvement in performance—the forego- original Netflix competition dataset [5]. The original dataset con- ing 17K tuple transfer now takes only a few seconds. A similar tains data for 100M ratings, including anonymized customer iden- approach is used for transferring data from R to Jaql. tifiers (about 480K distinct), information about the movies (such Handling data-representation incompatibilities In R, large data as title and date of release; about 18K distinct), and the date that objects resembling relational tables are primarily manipulated as the rating was entered. The inflation process allowed us to evaluate data frames, which are column-oriented structures. On the other the performance of Ricardo on datasets having real-world scales. 995

Number of Rating Tuples Data Size in GB ● 500M 104.33 ● J aql 1B 208.68 Hadoop (handt uned) 2500 3B 625.99 T ime in seconds 5B 1,043.23 ● 1500 Table 2: Data set sizes used in the scale out experiments Specifically, we added six additional attributes to each tuple in or- 500 ● der to simulate a real recommender system, where the logged in- ● formation contains fine-grained information such as demographics 0 and navigation history. We also increased the number of ratings, with the largest inflated dataset containing 5B ratings (roughly 1TB 1 2 3 4 5 of raw data). Table 2 summarizes the various dataset sizes used Number of rat ings in billions in the scale-up experiments. The numbers of distinct customers and distinct movies were retained from the original data, which amounts to a space requirement of about 4MB per factor of the Figure 4: Performance comparison (single iteration) model. 5.2 Performance and Scalability ● Conjugat e gradient Virtually all of the processing time for computing the latent fac- ● L− BFGS Root mean square error tor model was spent on the Jaql/Hadoop side, rather than in R. This 1.10 ● ● is not surprising, since scanning, joining, and aggregating large datasets is both I/O and CPU intensive, whereas R’s adjustment ● ● of latent-factor values during the optimization procedure is compa- rably cheap. Nevertheless, the total system performance depends 1.05 ● ● on the time required per iteration over the data and on the number ● ● ● ● of iterations until convergence. Thus both the DMS and R play an ● integral part in overall performance. 1.00 Figure 4 shows the performance results for a single iteration— i.e., the computation of the squared error and the corresponding gradient—for various dataset sizes. Recall that we presented the 0 5 10 15 20 latent factor model using only a single latent factor per user and per movie. In the experiments, we actually fit a vector of latent Number of passes factors per user and per movie during a single pass. For simplic- ity we omit the details, since the overall response time was only Figure 5: Number of passes and RMSE using one latent factor slightly affected by the vector size. We used two different imple- mentations: a baseline implementation using a hand-tuned Hadoop job and a Jaql implementation as used by Ricardo. As can be seen 5.3 Optimization Evaluation in the figure, both implementations scale linearly with the size of the dataset and thus provide a scalable solution. The execution We experimented with many different optimization routines, in- plans used by raw Hadoop and Jaql are similar, but Jaql requires cluding naive gradient descent as well as more sophisticated al- about twice as much time as raw Hadoop. The reason for this dif- gorithms such as the conjugate-gradient method or L-BFGS. This ference lies in Jaql’s higher level of abstraction: Jaql is designed experimentation was easy to perform, since we could directly and to handle arbitrary queries, data formats, and data types, whereas easily take advantage of R’s large optimization library.5 our Hadoop implementation is specifically tailored to the problem Figure 5 displays the root-mean-squared error (RMSE) of the la- at hand. This is also reflected in code complexity: the Jaql code tent-factor model as a function of the number of iterations of the comprises roughly 10 lines per query, whereas the Hadoop imple- optimization algorithm, i.e., the number of passes over the data. mentation takes around 200 lines. Results are given for both the conjugate-gradient and L-BFGS op- The execution times as shown in Figure 4 should be taken with timization methods. The conjugate gradient method performs a a grain of salt, as both Hadoop and Jaql are under active develop- gradient computation followed by a line search and thus requires ment. Each iteration currently takes a relatively large amount of multiple passes over the data to arrive at a new point estimate. The time, up to an hour for large (1TB) data. We believe that with in- line searches account for the fluctuations in the RMSE curve that creasing maturity, both the relative difference between systems as can be seen in Figure 5. In contrast, L-BFGS is a quasi-Newton well as the total execution time will decrease further. Indeed, our method with low memory footprint and exhibits a completely dif- initial work on Ricardo has already led to multiple improvements ferent behavior. Both methods converge, but L-BFGS converges in Jaql, e.g., better schema support, efficient serialization code, and faster for this particular problem. runtime tuning. 5 http://cran.r-project.org/web/views/Optimization.html 996

6. RELATED WORK and thus alleviates some of these problems. Data processing oper- This section discusses prior work on alternative approaches to ators and their parallelization are not yet implemented, however. Ricardo. Unlike Ricardo, these approaches do not trade data and Thus, analysis tasks such as latent-factor modeling are currently functionality between a DMS and a statistical package, but rather easier to implement in Ricardo, and the Ricardo implementations try to either scale out R or incorporate deep analytics into a DMS. have better runtime properties. At the highest level, one would like a system that supports auto- 6.1 Scaling Out R matic parallelization of high-level R commands. Recently, there The R community is very active in improving the scalability of have been some promising results in this direction. Not all se- R and there are dozens of approaches that aim at parallelizing R quential R code can be parallelized automatically, of course, but across multiple processors or nodes. The main drivers for this work linear-algebra operations can be handled by some systems, includ- are increased dataset sizes and the increasing demands of scientific ing pR [20] and RIOT [26]. Both packages are similar to Ricardo research and high-performance computing [21]. in spirit, but instead of offloading data processing, they offload par- The existing approaches to parallelizing R can be classified by allel matrix computations to systems specifically designed for this their degree of abstraction. These range from low-level message purpose. passing to task- and data-parallel processing to high-level (largely) automatic parallelization. 6.2 Deepening a DMS Packages of the message-passing type include Rmpi and rpvm, Whereas the R community has tried to incorporate large-scale both of which are wrappers for their respective parallel computing DMS functionality, the DMS community has tried to incorporate middlewares. Direct use of message-passing systems requires sig- analytics. Early efforts in this direction incorporated some sim- nificant expertise in parallel programming. More importantly, these ple statistical analyses into parallel relational database systems [1]; packages require a “tightly” connected cluster, where fault toler- indeed, the SQL standard now covers computation of basic sum- ance, redundancy and elasticity are not provided. This restriction mary statistics such as standard deviation and covariance, as well limits scalability to relatively small clusters. In contrast, Hadoop as simple (single-variable) linear regression. Moreover, the ma- (and hence Ricardo), provides all of the foregoing functionality, jor commercial vendors have all incorporated some simple vendor- and hence can scale to very large clusters. specific analytic extensions. Cohen et al. [9] describe an attempt Higher-level task- and data-parallel computing systems for par- to incorporate into a relational DBMS such analytical functionality allelizing R are usually built on top of a message-passing package, as vector and matrix operations, ordinary least squares, statistical and are easier to use. The most popular representative R package tests, resampling techniques, and parameter fitting via the conju- of this type is SNOW [24] (for Simple Network Of Workstations). gate-gradient method. The implementation exploits the extensible SNOW provides functionality to spawn a cluster (using, for exam- datatype facilities of Postgres. Although the resulting SQL queries ple, MPI), to distribute values across the cluster, and to apply in par- are closer to what an analyst would use than classical SQL, it is un- allel a given function to a large set of alternative arguments. SNOW clear whether an analyst would ever be truly comfortable enough can be used to implement task parallelism (arguments are tasks) or with the quasi-SQL syntax to abandon the familiar constructs of R, data parallelism (arguments are data). SNOW’s data-parallelism SPSS, SAS, or Matlab. The statistical functionality would probably functionality is similar to the map operator in Hadoop; reduce op- need to be hidden in stored procedures. erations, however, require more elaborate solutions. Moving away from relational databases, we come to the Mahout In general, SNOW appears to be too low-level for conveniently project [2], which directly implements various machine-learning implementing scalable deep analytics. This assertion is based on algorithms in Hadoop. The Mahout implementation currently nei- our experience in using the SNOW package to implement the com- ther exploits high-level data processing languages built on top of putation of the latent-factor model for movie recommendations. Hadoop nor does it make use of any statistical software. However, The implementation involved the following steps: Mahout is still at an early stage. As more and more sophisticated methods are added, leveraging such existing functionality adds to 1. Distribution of data. The base data had to be distributed the stability and simplicity of the implementation. across the cluster so that worker nodes can access it. This Arguably, the functionality of statistically enriched DMSs will was achieved by using a distributed file system and by split- always lag behind that of statistical software packages, and will not ting the data into smaller chunks, which are then handled by enjoy the same level of community support as can be found, for the individual nodes. example, in the CRAN repository. Statistical packages also pro- vide analysts with a more comfortable interface to access this func- 2. Data processing. Operations such as the filter, group-by and tionality. In contrast, expressing statistical functionality in a query join were implemented in R. language is tedious. For example, the SQL implementation of the Mann-Whitney U Test in [9] is much more complex and difficult to 3. Parallelization. The data processing operations were broken read than a call to a function like wilcox.test as provided by R. down into fragments, executed in parallel, and then the re- For these reasons, it is highly likely that data analysts will always sults where combined. want to work with statistical software. It is evident that the above steps constitute the core functionality of We conclude this section by mentioning SciDB [22]. This sys- a large-scale DMS. Our implementation of latent-factor computa- tem embodies a very interesting and radical approach that attempts tion using SNOW required 50% more code than the implementa- to completely redesign the data model—by using multidimensional tion in Ricardo, while at the same time being much more compli- arrays for storage and making vectors and arrays first-class objects— cated and error prone. Additional features such as scalability to a and scale both data management and computation by executing large number of nodes, fault tolerance and elasticity were so tedious functions and procedures in parallel and as close to the data as pos- to implement using R and SNOW that they were dropped from sible. our implementation. A recent package called RHIPE [12] provides SNOW-like functionality using Hadoop as the runtime environment 997

7. CONCLUSION C. Welton. MAD skills: New analysis practices for big data. We have presented Ricardo, a scalable platform for deep analyt- PVLDB, 2(2):1481–1492, 2009. ics. Ricardo combines the data management capabilities of Hadoop [10] J. Cunningham. Hadoop@Visa, Hadoop World NY, 2009. and Jaql with the statistical functionality provided by R. Compared http://www.slideshare.net/cloudera/ to previous approaches, Ricardo provides a feature-rich and scal- hw09-large-scale-transaction-analysis. able working environment for statistical computing, and benefits [11] J. Dean and S. Ghemawat. MapReduce: simplified data from decades of experience from both the statistical and the data processing on large clusters. In OSDI, pages 137–150, 2004. management communities. Although our experiments indicated [12] S. Guha. RHIPE - R and Hadoop Integrated Processing that the performance of both Hadoop and Jaql is still suboptimal, Environment. http://ml.stat.purdue.edu/rhipe/. we expect significant performance improvements in the future as [13] K. Hornik. The R FAQ, 2009. this technology matures. Our work has focused on Hadoop and R, http://CRAN.R-project.org/doc/FAQ/R-FAQ.html. but it is evident that our approach is potentially applicable to other [14] JAQL: Query Language for JavaScript Object Notation statistical packages and other DMSs. (JSON). http://code.google.com/p/jaql, 2009. In ongoing work, we are identifying and integrating additional [15] J. A. Konstan. Introduction to recommender systems. In statistical analyses that are amenable to the Ricardo approach. Al- SIGMOD Conference, pages 1373–1374, 2008. though Ricardo currently requires knowledge of the Jaql query lan- [16] Y. Koren. Factorization meets the neighborhood: a guage, a tighter and transparent integration into the R language multifaceted collaborative filtering model. In KDD, pages is possible using packages and functions that hide the underly- 426–434, 2008. ing data-management details from the analyst. For certain types [17] Y. Koren. Collaborative filtering with temporal dynamics. In of analyses, it may be possible to combine our work with auto- KDD, pages 447–456, 2009. matic compilation technology to integrate R and Hadoop even more [18] Y. Koren, R. Bell, and C. Volinsky. Matrix factorization seamlessly. Our ultimate vision is to enable analysts to work with techniques for recommender systems. Computer, massive data just as they work with main-memory-size data today; 42(8):30–37, 2009. Ricardo can be seen as a first step in this direction. [19] C. Olston, B. Reed, U. Srivastava, R. Kumar, and A. Tomkins. Pig latin: a not-so-foreign language for data 8. REFERENCES processing. In SIGMOD, pages 1099–1110, 2008. [1] N. R. Alur, P. J. Haas, D. Momiroska, P. Read, N. H. [20] N. F. Samatova. pR: Introduction to Parallel R for Statistical Summers, V. Totanes, and C. Zuzarte. DB2 UDB’s High Computing. In CScADS Scientific Data and Analytics for Function Business Intelligence in e-Business. IBM Redbook Petascale Computing Workshop, pages 505–509, 2009. Series, ISBN 0-7384-2460-9, 2002. [21] M. Schmidberger, M. Morgan, D. Eddelbuettel, H. Yu, [2] Apache Mahout. http://lucene.apache.org/mahout/. L. Tierney, and U. Mansmann. State of the art in parallel [3] M. Avriel. Nonlinear Programming: Analysis and Methods. computing with R. Journal of Statistical Software, Dover Publishing, 2003. 31(1):1–27, June 2009. [4] R. Bell, Y. Koren, and C. Volinsky. Modeling relationships at [22] M. Stonebraker, J. Becla, D. J. DeWitt, K.-T. Lim, D. Maier, multiple scales to improve accuracy of large recommender O. Ratzesberger, and S. B. Zdonik. Requirements for science systems. In KDD, pages 95–104, 2007. data bases and SciDB. In CIDR, 2009. [5] J. Bennett and S. Lanning. The Netflix prize. In KDD Cup [23] A. Thusoo, J. S. Sarma, N. Jain, Z. Shao, P. Chakka, and Workshop, 2007. S. Anthony, H. Liu, P. Wyckoff, and R. Murthy. Hive - a [6] R. H. Byrd, P. Lu, J. Nocedal, and C. Zhu. A limited memory warehousing solution over a Map-Reduce framework. algorithm for bound constrained optimization. SIAM J. Sci. PVLDB, 2(2):1626–1629, 2009. Comput., 16(5):1190–1208, 1995. [24] L. Tierney, A. J. Rossini, N. Li, and H. Sevcikova. snow: [7] J. Canny. Collaborative filtering with privacy via factor Simple network of workstations. analysis. In SIGIR, pages 238–245, 2002. http://cran.r-project.org/web/packages/snow/. [8] C.-T. Chu, S. K. Kim, Y.-A. Lin, Y. Yu, G. R. Bradski, A. Y. [25] M. Wedel, R. T. Rust, and T. S. Chung. Up close and Ng, and K. Olukotun. Map-Reduce for machine learning on personalized: a marketing view of recommendation systems. multicore. In NIPS, pages 281–288, 2006. In RecSys, pages 3–4, 2009. [9] J. Cohen, B. Dolan, M. Dunlap, J. M. Hellerstein, and [26] Y. Zhang, H. Herodotou, and J. Yang. RIOT: I/O-efficient numerical computing without SQL. In CIDR, 2009. 998

You can also read