From dd2fe040e24cc95d763acbebc8cc97f2bc6b133a Mon Sep 17 00:00:00 2001 From: Adam Marcus Date: Wed, 11 Jan 2012 09:49:10 -0500 Subject: [PATCH 1/3] day3 --- lectures/day3.pptx | Bin 862232 -> 867660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lectures/day3.pptx b/lectures/day3.pptx index e6b1c7ff4823d8666b55cf77e717dec3e506de4a..ae5583619baa596040858cd3a6a986a3dbdc2839 100644 GIT binary patch delta 26828 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 dD7VmPqP1*av7#fZfS<^kOjlcUC%{|8U3JJkRH delta 22088 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 Date: Wed, 11 Jan 2012 09:51:00 -0500 Subject: [PATCH 2/3] fix hypothesis testing links --- day3/README.md | 4 +++- day3/hypothesis_testing.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/day3/README.md b/day3/README.md index a33fd05..b386f13 100644 --- a/day3/README.md +++ b/day3/README.md @@ -3,4 +3,6 @@ Today's lab is broken into two parts. 1. [Hypothesis testing and T-tests](./hypothesis_testing.html) -1. [Regressions](./regression.html) \ No newline at end of file +1. [Regressions](./regression.html) + + \ No newline at end of file diff --git a/day3/hypothesis_testing.py b/day3/hypothesis_testing.py index da0a851..2317870 100644 --- a/day3/hypothesis_testing.py +++ b/day3/hypothesis_testing.py @@ -378,3 +378,5 @@ # There's a lot more to statistics than T-Tests, which compare two # datasets' averages. Next, we'll cover correlation between two # datasets using [linear regression](regression.html). +# +# From af8c5816e50cc88062df569caf3702d72283618c Mon Sep 17 00:00:00 2001 From: Adam Marcus Date: Wed, 11 Jan 2012 10:42:49 -0500 Subject: [PATCH 3/3] checkpoint mapreduce --- day5/mapreduce.py | 194 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 day5/mapreduce.py diff --git a/day5/mapreduce.py b/day5/mapreduce.py new file mode 100644 index 0000000..44474b9 --- /dev/null +++ b/day5/mapreduce.py @@ -0,0 +1,194 @@ +""" +export AWS_ACCESS_KEY_ID='my_key_id' +export AWS_SECRET_ACCESS_KEY='my_access_id' + +python -m mrjob.tools.emr.create_job_flow --num-ec2-instances=5 +python -m mrjob.tools.emr.terminate_job_flow.py JOBFLOWID +python -m mrjob.tools.emr.audit_usage +python mr_my_job.py -r emr --emr-job-flow-id=JOBFLOWID input_file.txt > out +python mr_my_job.py -r emr --emr-job-flow-id=j-JOBFLOWID -o 's3://test_enron_json_123/output' --no-output 's3://test_enron_json_123/*.json' +python simple_wordcount.py < lay-k.json +python mr_wordcount.py < lay-k.json +""" +""" +In day 4, we saw how to process text data using the Enron email dataset. In reality, we only processed a small fraction of the entire dataset: about 20 megabytes of Kenneth Lay's emails. The entire dataset is $$$ gigabytes, a factor of $$$ larger than what we worked with. And what if we worked on GMail, Yahoo! Mail, or Hotmail? We'd have several petabytes worth of emails, a factor of at least $$$ the size of the data we dealt with. + +All that data would take a while to process, and it certainly couldn't fit on or be crunched by a single laptop. We'd have to store the data on many machines, and we'd have to process it (tokenize it, calculate tf-idf) using multiple machines. There are many ways to do this, but one of the more popular recent methods of _parallelizing data computation_ is on a programming framework called MapReduce, an idea that [Google presented to the world in $$$]($$$). Luckily, you do not have to work at Google to benefit from MapReduce: an open-source implementation called [Hadoop]($$$) is available for your use! + +But we don't have hundreds of machines sitting around for us to use them, you might say. Actually, we do! [Amazon Web Services]($$$) offers a service called Elastic Mapreduce$$$ (EMR) that gives us access to as many machines as we would like for about $$$ cents per hour of machine we use. Use $$$ machines for $$$ hours? Pay Amazon $$$. If you've ever heard the buzzword *cloud computing*, this elastic service is part of the hype. + +Let's start with a simple word count example, then rewrite it in MapReduce, then add TF-IDF calculation, and finally, run it on $$$ machines on Amazon's EMR! + +

Counting Words

+ +We're going to start with a simple example that should be familiar to you from day 4's lecture. First, unzip the JSON-encoded Kenneth Lay email file: +""" + +unzip dataiap/datasets/emails$$$ + +""" + +This will result in a new file called $$$, which is JSON-encoded. What is JSON? You can think of it like a text representation of python dictionaries and lists. If you open up the file, you will see on each line something that looks like this: + +$$$ + +It's a dictionary representing an email sent to or received by Kenneth Lay. It contains the same content that we dealt with yesterday, but encoded into JSON, and rather than one file per email, we have a single file with one email per line. + +Why did we do this? Big data crunching systems like Hadoop don't deal well with lots of small files: they want to be able to send a large chunk of data to a machine and have to crunch on it for a while. So we've processed the data to be in this format: one big file, a bunch of emails one per line. If you're curious how we did this, check out $$$. + +Aside from that, processing the emails is pretty similar to what we did on day 4. Let's look at a script that counts the words in the text of each email (As an aside: it would help if you wrote and ran your code in `dataiap/day5/...` today, since several modules like `term_tools.py` are available in that directory). + +""" + +import sys +from collections import defaultdict +from mrjob.protocol import JSONValueProtocol +from term_tools import get_terms + +input = open(sys.argv[1]) +words = defaultdict(lambda: 0) +for line in input: + email = JSONValueProtocol.read(line)[1] + for term in get_terms(email['text']): + words[term] += 1 + +for word, count in words.items(): + print word, count + +""" + +You can save this script to `exercise1.py` and then run `python exercise2.py path/to/lay-k.json`. It will print the word count in due time. `get_terms` is similar to the word tokenizer we saw on day 4. `words` keeps track of the number of times we've seen each word. `email = JSONValueProtocol.read(line)[1]` uses a JSON decoder to convert each line into a dictionary called email, that we can then tokenize into individual terms. + +As we said before, running this process on several petabytes of data is infeasible because a single machine might not have petabytes of storage, and we would want to enlist multiple computers in the counting process to save time. + +We need a way to tell the system how to divide the input data amongst multiple machines, and then combine all of their work into a single count per term. That's where MapReduce comes in! + +

MapReduce

+MapReduce is named after its two most important bits of functionality: *map* and *reduce*. Let's explain this with an example. Say we have a JSON-encoded file with emails (1,000,000 emails on 1,000,000 lines), and we have 10 machines to process it. + +In the *map* phase, we are going to send each machine 100,000 lines, and have them break each of those emails into the words that make them up: + +$$$ + +Once each machine has tokenized all of the words in the email, they will *shuffle* each word to a machine pre-designated for that word (using a hash function$$$, if you're curious). This part is automatic, but it's important to know what's happening here: + +$$$ + +And finally, once each machine has received the words that its responsible for, the *reduce* phase will turn all of the occurrences of words it has received into counts of those words: + +$$$ + +MapReduce is more general-purpose than just serving to count words. Some people have used it to do exotic things like [process millions of songs]($$$), but we'll stick to the boring stuff. + +Without further ado, here's the wordcount example, but in MapReduce + +""" + +import sys +from mrjob.protocol import JSONValueProtocol +from mrjob.job import MRJob +from term_tools import get_terms + +class MRWordCount(MRJob): + INPUT_PROTOCOL = JSONValueProtocol + OUTPUT_PROTOCOL = JSONValueProtocol + + def mapper(self, key, email): + for term in get_terms(email['text']): + yield term, 1 + + def reducer(self, term, occurrences): + yield None, {'term': term, 'count': sum(occurrences)} + +if __name__ == '__main__': + MRWordCount.run() + +""" + +Too cool! Let's break this thing down. You'll notice the terms MRJob in a bunch of places. [MRJob]($$$) is a python package that makes writing MapReduce programs easy. To create a MapReduce program, you have to create a class (like `MRWordCount`) that has a `mapper` and `reducer` function. If the program is run from the command line, (the `if __name__ == '__main__':` part) we run the MRWordCount MapRedce program. + +Looking inside `MRWordCount`, we see `INPUT_PROTOCOL` being set to `JSONValueProtocol`. By default, map functions expect a line of text as input, but we've encoded our emails as JSON, so we let MRJob know that. Similarly, we explain that our reduce tasks will emit dictionaries, and set `OUTPUT_PROTOCOL` appropriately. + +The `mapper` function handles the functionality described in the first image of the last section. It takes each email, tokenizes it into terms, and `yield`s each term. You can `yield` a key and a value (`term` and `1`) in a mapper. We yield the term with the value `1`, meaning one instance of the word `term` was found. + +The `reducer` function implements the third image of the last section. We are given a word (the key emitted from mappers), and a list `occurrences` of all of the values emitted for each instance of `term`. Since we are counting occurrences of words, we emit a dictionary containing the term and a sum of the occurrences we've seen. + +Note that we `sum` instead of `len` the `occurrences`. This allows us to change the mapper implementation to emit the number of times each word occurs in a document, rather than `1` for each word. + +Both the `mapper` and `reducer` offer us the parallelism we wanted. There is no loop through our entire set of emails, so MapReduce is free to distribute the emails to multiple machines, each of which will run `mapper` on an email-by-email basis. We don't have a single dictionary with the count of every word, but instead have a `reduce` function that has to sum up the occurrences of a single word, meaning we can again distribute the work to several reducing machines. + +

Run It!

+Enough talk! Let's run this thing. + +""" + +$$$ (parallel input/output style to the EMR version if you can) + +""" + +That's going to do something similar to what the simple wordcount script did. The only difference you will notice is that the output comes out in dictionaries (`OUTPUT_PROTOCOL = JSONValueProtocol`), and in sorted term order (that's how all of the occurrences for a term end up on a single reducer). + +If we want to write the output to disk, we can instead write +""" + +$$$ + +""" +If you re-run the program, it take a look at $$$ for the output. + +You will notice we have not yet run tasks on large datasets (we're still using `lay-k.json`) and we are still running them locally on our computers. We will learn a few things before we move onto Amazon's machines, but this is an important lesson still: MapReduce tasks will take a long time to run and hold up several tens to several hundreds of machines. Test them locally like we just did to make sure you don't have bugs before going to the full dataset. + +

Show off What you Learned

+""" + +""" +** Exercise ** Create a second version of the MapReduce wordcounter that counts the number of each word emitted by each sender. You will need this for later, since we're going to be calculating TF-IDFimplementing terms per sender. You can accomplish this with a sneaky change to the `term` emitted by the `mapper`. You can either turn that term into a dictionary, or into a more complicated string, but either way you will have to encode both sender and term information in that `term`. +""" + +""" +** Bonus Exercise ** Grep. The [`grep` command]($$$) on UNIX-like systems allows you to search text files for some term or terms. Typing `grep hotdogs file1` will return all instances of the word `hotdogs` in the file `file1`. Implement a `grep` for emails. When a user uses your mapreduce program to find a word in the email collection, they will be given a list of the subjects and senders of all emails that contain the word. You might find you do not need a particularly smart reducer in this case: that's fine. If you're pressed for time, you can skip this exercise. +""" + +""" +

TF-IDF

+On [day 4](./day4/), we learned that counting words is not enough to summarize text: common words like `the` and `and` are too popular. In order to discount those words, we multiplied by the term frequency of `wordX` by `log(total # documents/# documents with wordX)`. Let's do that with MapReduce! + +We're going to emit a per-sender TF-IDF. To do this, we need three MapReduce tasks: + +* The first will calculate the number of documents, for the numerator in IDF. + +* The second will calculate the number of documents each term appears in, for the denominator of IDF, and emits the IDF (`log(total # documents/# documents with wordX)`). + +* The third calculates a per-sender IDF for each term after taking both the second MapReduce's term IDF and the email corpus as input. + +

MapReduce 1: Total Number of Documents

+ +Eugene and I are the laziest of instructors. We don't like doing work where we don't have to. If you'd like a mental exercise as to how to write this MapReduce, you can do so yourself, but it's simpler than the wordcount example. Our dataset is not so large that we can't just use the `wc` UNIX command to count the number of lines in our corpus: +""" + +wc -l lay-k.json + +""" + +Kenneth Lay has 5929 emails in his dataset. We ran wc -l on the entire Enron email dataset, and got 516893. This took a few seconds. Sometimes, it's not worth overengineering a simple task!:) + +

MapReduce 2: Per-Term IDF

+We recommend you stick to 516893 as your total number of documents, since eventually we're going to be crunching the entire dataset! + +What we want to do here is emit `log(516893.0 / # documents with wordX)` for each `wordX` in our dataset. Notice the decimal on 516893**.0**: that's so we do [floating point division]($$$) rather than integer division. + +We've put our answer in `per-term-idf.py` $$$, but try your hand at writing it yourself before you look at ours. It can be implemented with a two-line change to the original wordcount MapReduce we wrote. + +""" + + It first loads the term IDFs from step 2 into memory, and then emits, for each sender-word combination, the count of terms + + + + +""" + +""" +tf-idf: multiple mapreduces +mapreduce1: word frequency for all words +mapreduce2: word frequency per person, with mapper loading all of mapreduce1's input first.