# Goal

This assignment provides an illustration of PageRank algorithms and Hadoop. You will then blend these applications by implementing a parallel version of PageRank using the programming interfaces of the Hadoop MapReduce framework.

## What is PageRank?

The web search engine is a typical distributed system on the Internet. It is designed to search for information on the World Wide Web. The search results are generally presented in a list of results and are often called hits. PageRank is a well-known web graph ranking algorithm that helps Internet users sort hits by their importance.
PageRank calculates a numerical value for each element of a hyperlinked set of webpages, which reflects the probability that a random surfer will access that page. The process of PageRank can be understood as a Markov Chain  which requires iterative calculations to converge. An iteration of PageRank calculates the new access probability for each webpage based on values calculated in the previous iteration. The process will repeat until the number of current iterations is bigger than predefined maximum iterations, or the Euclidian distance between rank values in two subsequent iterations is less than a predefined threshold that controls the accuracy of the output results. Figure 1. Mathematical PageRank for a simple network in Wikipedia

Figure 1 shows a web graph consisting of 11 vertices {A, B, C, D, E, F, G1, G2, G3, G4, G5}. Each vertex refers to a unique webpage, and the directed edge means there is one link from the source webpage to the target webpage. The percentage on each vertex represents the rank value of each webpage.

### Notes

You can implement a sequential PageRank that can run on desktops or laptops. But when processing larger input data, like web graphs containing more than a million webpages, you need to run the PageRank application in parallel so that it can aggregate the computing power of multiple compute nodes. Currently, in both industry and academia, the study of large-scale web or social graphs has become increasingly popular. In one published paper, the job execution engines that claim to support large-scale PageRank include: MPI, Hadoop, Dryad, Twister, Pregel.
Project #1 is divided into two parts. In the first part, you need to implement the sequential version of PageRank. In the second part, you will implement a parallel version of PageRank by using the programming interfaces of Hadoop MapReduce job execution engine.

### Formula

Eqn.1 is the formula to calculate the rank value for each webpage. We will learn this formula by applying it to the case in Fig.1. There are 11 webpages in Fig.1, which include: {A, B, C, D, E, F, G1, G2, G3, G4, G5}. Assuming the probability distribution for a web surfer accessing all these 11 pages in current iteration is {PR(A), PR(B), PR(C), … PR(G5)}, then the probability for the surfer to access Page B in the next iteration is:
PR(B) = PR(D)/2 + PR(E)/3 + PR(F)/2 + PR(C) + PR(G1)/2 + PR(G2)/2 + PR(G3)/2
In a general case, the PageRank value for any page u can be expressed as:
Eqn.1: The vertices seen in the right of the formula contain all the webpages that point to target webpage ‘u’. The L(v) refers to the out degree of each webpage in the vertices set. The initial rank values of each webpage, like PR’(u), can be any double value. After several iteration calculations, the rank values converge to the stationary distribution regardless of what their initial values are.

### Damping factor

The PageRank theory holds that even an imaginary surfer who is randomly clicking on links will eventually stop clicking. The probability, at any step, that the person will continue is a damping factor d. Various studies have tested different damping factors, but it is generally assumed that the damping factor will be around 0.85. The formula considering damping factor is shown in Eqn.2. N refers to the total number of unique urls.
Eqn.2: # Deliverables

You are required to turn in the following items in a zip file (groupId_project3.zip) in this assignment:

1. The source code of Hadoop PageRank you implemented.
2. Technical report (groupdId_HadoopPageRank_report.docx) that contains:
1. The description of the main steps and data flow in the program.
2. The output file (groupdId_HadoopPageRank_output.txt) which contains the first 10 url numbers.

Points will be reduced (maximum 0.5 points) if the filename or directory structure are different from instructed above.

# Evaluation

The point total for this project is 10, where the distribution is as follows:

1. Completeness of your code and output (7 points)
2. Correctness of written report (3 points)

# Introduction

In this project, we have provided a sketch code which contains three mapreduce jobs for you to implement:

1. CreateGraph (done): add one column, 'initial pagerank value', to the input pagerank adjacency matrix (AM). Then pass it to the PageRank program to calculate the pagerank values.
2. PageRank (your implementation): take the transformed AM matrix and calculate pagerank values for all pages.
3. Cleanup Results: remove the targetUrls column and output <sourceUrl, pagerank value> as the final result.

The detail dataflow can be seen in Figure 2. Part 1 and Part 3 are given as full solutions in this pipeline; you will implement the 2nd part of PageRank program. You need to complete two files in the provided pacakge inside "indiana/cgl/hadoop/pagerank/": PageRankMap.java and PageRankReduce.java. Code snapshots are shown below.

PageRankMap.java and PageRankReducer.java

# Edit

The sketch code is stored within the provided VirtualBox image . Use Eclipse or linux text editor vi/vim to add your code.

```\$ cd /root/MoocHomeworks/HadoopPageRank/
```

## Compile and run your code

Use the one-click script compileAndExecHadoopPageRank.sh provided below. Standard error messages such as “compile errors, execution errors, etc.” will be redirected on the screen. Debug them based on the returned messages.

```\$ cd /root/MoocHomeworks/HadoopPageRank/

# usage: ./compileAndExecHadoopPageRank.sh [PageRank Input File][Number of Urls][Number Of Iterations]
```\$ cd /root/MoocHomeworks/HadoopPageRank/