Slide 1

Slide 1 text

MapReduce Fundamentos de Big data com Apache Hadoop

Slide 2

Slide 2 text

Eduardo Miranda Consultor e arquiteto de Big Data, instrutor Hadoop /emiranda com br [email protected] /in/emiranda com br www.emiranda.com.br /emiranda com br

Slide 3

Slide 3 text

● Modelo conceitual do MapReduce. ● Como o MapReduce funciona em alto nível. ● Fluxo de dados no MapReduce. Seção I Introdução ao MapReduce

Slide 4

Slide 4 text

Em 2004 o Google publicou o artigo chamado MapReduce: Simplified Data Processing on Large Clusters. MapReduce é um modelo de programação para processamento de grandes volumes de dados. Esta abstração foi inspirada nas primitivas map e reduce do Lisp e outras linguagens funcionais.

Slide 5

Slide 5 text

;;; A primitiva map recebe como parâmetros um operador unário e uma lista, onde este operador será chamada para cada elemento da lista (map f list [list2 list3 …]) (map square ‘(1 2 3 4)) ;Resultado: (1 4 9 16) ;;; A primitiva reduce recebe como parâmetros um operador binário e uma lista, onde os elementos da lista serão combinados utilizando este operador (reduce + ‘(1 4 9 16)) ;Resultado: 30 Map e Reduce no Lisp Lisp é uma linguagem funcional, projetada por John McCarthy que apareceu pela primeira vez em 1958.

Slide 6

Slide 6 text

map(String key, String value): // key: Nome do documento // value: Conteúdo do documento for each word w in value: EmitIntermediate(w, "1"); reduce(String key, Iterator values): // key: Uma palavra // values: Uma lista de contagens int result = 0; for each v in values: result += ParseInt(v); Emit(AsString(result)); Pseudocódigo para contagem de palavras Fonte: MapReduce: Simplified Data Processing on Large Clusters

Slide 7

Slide 7 text

MapReduce em alto nível Reduce Shuffle Map Os dados na fase map são divididos entre os nós task tracker onde os dados estão localizados. Cada nó na fase map emite pares chave-valor com base no registro de entrada, um registro por vez. A fase shuffle é tratada pela estrutura Hadoop. Ela transfere os resultados dos dos mappers para os reducers juntando os resultados por meio chave. A saída dos mappers é enviado para os reducers. Os dados na fase reduce são divididos em partições onde cada reducer lê uma chave e uma lista de valores associados a essa chave. Os reducers emitem zero ou mais pares chave-valor com base na lógica utilizada.

Slide 8

Slide 8 text

Entrada Map Shuffle Reduce Saída

Slide 9

Slide 9 text

Entrada Map Shuffle Reduce Saída Chave Valor A 1 bela 1 jovem 1 saiu 1 com 1 um 1 belo 1 rapaz 1 para 1 um 1 belo 1 passeio 1 no 1 belo 1 parque 1 desta 1 bela 1 cidade 1 Chave Valor A 1 bela 1 bela 1 belo 1 belo 1 belo 1 cidade 1 com 1 desta 1 jovem 1 no 1 para 1 parque 1 passeio 1 rapaz 1 saiu 1 um 1 um 1 Chave Valor A 1 bela 1, 1 belo 1, 1, 1 cidade 1 com 1 desta 1 jovem 1 no 1 para 1 parque 1 passeio 1 rapaz 1 saiu 1 um 1, 1 Chave Valor A 1 bela 2 belo 3 cidade 1 com 1 desta 1 jovem 1 no 1 para 1 parque 1 passeio 1 rapaz 1 saiu 1 um 2 A bela jovem saiu com um belo rapaz para um belo passeio no belo parque desta bela cidade “ ”

Slide 10

Slide 10 text

Qual sentença abaixo é verdadeira sobre MapReduce? 1. Os dados na no map são divididos entre as task trackers onde os dados estão localizados. 2. A fase shuffle é implementada pelo próprio Hadoop. 3. Saída dos mappers são enviadas para os reducers como partições. 4. Reducers emitem zero ou mais chaves-valores baseado na lógica da aplicação. 5. Todas as anteriores. Exercícios

Slide 11

Slide 11 text

HDFS InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map Particionador Ordenação Reduce OutputFormat Nó 1 HDFS InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map Particionador Ordenação Reduce OutputFormat Nó 2 Shuffle

Slide 12

Slide 12 text

HDFS InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map Particionador Ordenação Reduce OutputFormat

Slide 13

Slide 13 text

InputFormat Partes Partes Partes Record Readers Record Readers Record Readers O objeto InputFormat é responsável por validar a entrada, dividindo os arquivos entre os mappers e instanciando os objetos RecordReaders. Por padrão, o tamanho de uma parte é igual ao tamanho de um bloco que no Hadoop o padrão é 64 Mb. As partão possuem um conjunto de registros onde cada um deles será quebrado em pares chave-valor para o map. A separação dos registros é feita antes mesmo da instanciação do do processo map. O job que está executando a tarefa MapReduce tentará colocar a tarefa map o mais próximo dos dados possível, ou seja, executar o processo map no mesmo nó do cluster onde o dados está armazenado.

Slide 14

Slide 14 text

InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map O método map recebe como argumento 3 parâmetros: Writable chave, Writable valor e context. Por padrão, o RecordReader define a chave para o método map como sendo o byte offset do registro no arquivo de entrada e o valor é basicamente a linha inteira.

Slide 15

Slide 15 text

InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map O particionador recebe a saída gerada pelo método map e faz um hash da chave e cria uma partição com base no hash da chave. Cada partição se destina a um reducer, assim, todos os registros com a mesma chave serão enviados para a mesmo partição (e, portanto, enviados para o mesmo reducer). Particionador

Slide 16

Slide 16 text

InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map O método reduce é chamado para cada chave e a lista de valores associados a essa chave. O método reduce processa cada valor e grava o envia o resultado para o contexto. O OutputCommitter cria um arquivo de saída para cada reduce executado. Particionador Ordenação Reduce

Slide 17

Slide 17 text

InputFormat Partes Partes Partes Record Readers Record Readers Record Readers Map Map Map Os resultados de um job MapReduce são armazenados no diretório especificado pelo usuário. Um arquivo vazio chamado _SUCCESS é criado para indicar que o job foi concluído com sucesso (mas não necessariamente sem erros). O histórico do job é armazenado em _logs/history*. A saída do método reduce é salvo em arquivos denominados part-r-00000, part-r-00001, ... (um para cada reduce). Caso seja executada uma tarefa apenas de mapeamento, implementação apenas do map, os nomes dos arquivos de saída serão part-m-00000, part-m-00001, ... etc. Particionador Ordenação Reduce OutputFormat

Slide 18

Slide 18 text

As 3 fases do MapReduce são? 1. Map, Partitioner e Reduce. 2. Map, Shuffle e Partitioner. 3. Map, Shuffle e Reduce. 4. Shuffle, Partitioner e Reduce. Exercícios

Slide 19

Slide 19 text

Na etapa de map: 1. O resultado a partir de cada chave é lido e processado. 2. Pares chave-valor são emitidos com base na entrada, sendo um registro por vez. 3. Os resultados são transferidos para os reducers. 4. Os valores são salvos em um arquivo de saida. Exercícios

Slide 20

Slide 20 text

Qual a função do particionador? 1. Obter os resultados da etapa de reduce, fazer um hash do registro e criar uma partição com base no hash da chave. 2. Classificar e agrupar os dados a serem enviados para os reducers 3. Obter o resultado do map, fazer um hash do registro e criar uma partição com base no hash da chave. 4. Obter o resultado do TaskTracker a partir do reduce, fazer um hash do registro e criar uma partição com base no hash da chave. Exercícios

Slide 21

Slide 21 text

O método reduce lê: 1. Uma parte por vez. 2. Um registro por vez. 3. Uma partição por vez. 4. Chave-valor por vez. Exercícios

Slide 22

Slide 22 text

● Comparar o funcionamento do MapReduce v1 e MapReduce v2 (YARN). ● Como as tarefas são executadas no YARN. Seção II MapReduce v1 e v2

Slide 23

Slide 23 text

O cliente executa uma tarefa MapReduce que instancia um objeto JobClient Execução de uma tarefa MapReduce v1 child process TaskTracker JobTracker JobClient cliente Tempo O JobClient envia a tarefa para o JobTracker Instancia um objeto JobObject que é enviado para o TaskTracker. TaskTracker instancia um processo filho (child process) que por sua vez executa a tarefa de map ou reduce Solicita status Envia heartbeat, estado da tarefa, contadores e status de leitura e escrita.

Slide 24

Slide 24 text

Limitações do MapReduce v1 Escalabilidade Um único JobTracker tem um limite de 4000 nós o que limita a escalabilidade. Disponbilidade Um único JobTracker e namenode são pontos únicos de falha (Single point of failure - SPOF). Flexibilidade Slots de map e reduce não são configuráveis dinâmicamente. Existem duas propriedades mapred.tasktracker.map.tasks.maximum e mapred.tasktracker.reduce.tasks.maximum que limitam o número máximo possível de mappers e reducers sendo executados simultâneamente. Isso pode causar desperdício de recursos. Otimizador do agendador O framewrok não otimiza o agendamento de tarefas. Suporte O framework é restrito a tarefas apenas de map e reduce.

Slide 25

Slide 25 text

MapReduce v2 (YARN) cliente cliente ResourceManager NodeManager NodeManager Container Container Container Container Application Master NodeManager Status do MapReduce Submissão de tarefa Status do nó Solicitação de recurso Application Master

Slide 26

Slide 26 text

Aloca containers em outros nós do cluster Node Manager O cliente ao executar uma tarefa MapReduce, ele passa um objeto do tipo config do Application Manager para o Resource Manager Execução de uma tarefa MapReduce v2 (YARN) Node Manager Resource Manager Application Manager cliente Tempo Aloca para o Application Manager um container em um nó do cluster. Solicita mais containers para execução da tarefa. Solicita aos Node Managers que iniciem os containers status Application Manager se desregistra no Resource Meneger ao final da execução da tarefa. Solicita de volta os containers alocados

Slide 27

Slide 27 text

Cluster ZooKeeper Alta disponibilidade do ResourceManager zookeeper zookeeper zookeeper ResourceManager ativo ResourceManager standby ResourceManager ativo escreve o seu estado no ZooKeeper. Fail-over caso o ResourceManager ativo falhe.

Slide 28

Slide 28 text

Quais dos problemas abaixo o MapReduce gerencia? 1. Recuperação a partir de falhas das máquinas. 2. Shuffle dos dados entre as funções de Map e Reduce. 3. Executar funções Map Reduce em múltiplas máquinas. 4. Automaticamente paraliza um algoritmo. 5. Recuperação a partir de máquinas lentas. Exercícios

Slide 29

Slide 29 text

Quais são alguns dos desafios da solução de problemas por meio da abordagem por divisão e conquista? 1. Mover dados é computacionalmente "caro". 2. Usar uma única máquina é mais rápido que várias máquinas. 3. Utilizar muitas máquinas significa ter que le dar com muitas falhas. 4. Utilizar muitas máquinas significa ter que le dar com máquinas lentas. 5. Utilizar tabelas hash para documentos grandes funciona bem. Exercícios

Slide 30

Slide 30 text

Quais das opções abaixo são verdadeiras sobre o YARN? 1. Não existe configuração de slot no YARN. 2. O Job Tracker equivalente no YARN suporta multiplas instancias por cluster para escalar. 3. YARN suporta tarefas MapReduce e não MapReduce. 4. Todas as opções acima. Exercícios

Slide 31

Slide 31 text

Quais das opções abaixo são verdadeiras sobre o YARN? 1. YARN suporta apenas tarefas MapReduce. 2. A arquitetura do YARN limita o número de nós do cluster. 3. YARN utiliza uma API e um CLI (command line interface) diferente da versão MRv1. 4. A arquitetura YARN implementa separadamente o gerente de recursos (resource manager) do gerente de tarefas (job management). Exercícios

Slide 32

Slide 32 text

O heartbeat enviado do Task Tracker para o Job Tracker fornece infromações sobre: 1. Erros na rede. 2. Status da aplicação. 3. Saúde do CPU. 4. Status da tarefa. Exercícios

Slide 33

Slide 33 text

Na execução de uma aplicação MapReduce v1, o usuário roda o programa a partir de um nó cliente. Isso instancia: 1. Job Client. 2. Job Tracker. 3. Task Tracker. 4. Task Counter. Exercícios

Slide 34

Slide 34 text

No MapReduce v1, o gerente de recursos (resource manager) e o gerente de tarefas (job management) são ambos executados pelo: 1. Application Master. 2. Application Manager. 3. Job Tracker. 4. Resource Manager. Exercícios

Slide 35

Slide 35 text

Quando o Job Tracker para de receber heartbeats do Task Tracker, o Job Tracker: 1. Acusa o erro e para a execução. 2. Reinicia a Task Tracker que falhou. 3. Reagenda a tarefa para 5 segundos depois no mesmo Task Tracker. 4. Reagenda a tarefa que falhou em um outro Task Tracker. Exercícios

Slide 36

Slide 36 text

● Projetar e implementar ○ Classe Mapper ○ Classe Reducer ○ Classe Driver Seção III MapReduce

Slide 37

Slide 37 text

Exemplo Word Count

Slide 38

Slide 38 text

Autor Jules Verne Título Journey to the Center of the Earth País França Publicação 1864 Páginas 183

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.*; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; WordCount.java

Slide 52

Slide 52 text

public class WordCount { public static class Map extends Mapper { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { word.set(tokenizer.nextToken()); context.write(word, one); } } } WordCount.java

Slide 53

Slide 53 text

public static class Reduce extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } WordCount.java

Slide 54

Slide 54 text

public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf, "WordCount"); job.setJarByClass(WordCount.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } } WordCount.java

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

[cloudera@quickstart ~]$ cd Desktop/ [cloudera@quickstart Desktop]$ wget http://www.textfiles.com/etext/FICTION/center_earth --2016-03-29 02:48:49-- http://www.textfiles.com/etext/FICTION/center_earth Resolving www.textfiles.com... 208.86.224.90, 208.86.224.90 Connecting to www.textfiles.com|208.86.224.90|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 489319 (478K) Saving to: “center_earth” 100%[======================================>] 489,319 368K/s in 1.3s 2016-03-29 02:48:52 (368 KB/s) - “center_earth” saved [489319/489319]

Slide 82

Slide 82 text

[cloudera@quickstart Desktop]$ hadoop fs -mkdir -p /user/eduardo/data/wordcount/input [cloudera@quickstart Desktop]$ hadoop fs -copyFromLocal ./center_earth /user/eduardo/data/wordcount/input/ [cloudera@quickstart Desktop]$ hadoop fs -ls /user/eduardo/data/wordcount/input/ Found 1 items -rw-r--r-- 1 cloudera supergroup 489319 2016-03-29 02:53 /user/eduardo/data/wordcount/input/center_earth

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

No content

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

No content

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

[cloudera@quickstart Desktop]$ hadoop jar ./WordCount.jar WordCount /user/eduardo/data/wordcount/input/ /user/eduardo/data/wordcount/output/ 16/03/29 03:56:00 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 16/03/29 03:56:02 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 16/03/29 03:56:03 INFO input.FileInputFormat: Total input paths to process : 1 16/03/29 03:56:04 INFO mapreduce.JobSubmitter: number of splits:1 16/03/29 03:56:04 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1458437037802_0001 16/03/29 03:56:08 INFO impl.YarnClientImpl: Submitted application application_1458437037802_0001 16/03/29 03:56:08 INFO mapreduce.Job: The url to track the job: http://quickstart.cloudera:8088/proxy/application_1458437037802_0001/ 16/03/29 03:56:08 INFO mapreduce.Job: Running job: job_1458437037802_0001 16/03/29 03:56:41 INFO mapreduce.Job: Job job_1458437037802_0001 running in uber mode : false 16/03/29 03:56:41 INFO mapreduce.Job: map 0% reduce 0% 16/03/29 03:58:02 INFO mapreduce.Job: map 100% reduce 0% 16/03/29 03:58:32 INFO mapreduce.Job: map 100% reduce 100% 16/03/29 03:58:33 INFO mapreduce.Job: Job job_1458437037802_0001 completed successfully 16/03/29 03:58:33 INFO mapreduce.Job: Counters: 49

Slide 89

Slide 89 text

File System Counters FILE: Number of bytes read=1000216 FILE: Number of bytes written=2224003 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=489462 HDFS: Number of bytes written=140299 HDFS: Number of read operations=6 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=1 Launched reduce tasks=1 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=79031 Total time spent by all reduces in occupied slots (ms)=26631 Total time spent by all map tasks (ms)=79031 Total time spent by all reduce tasks (ms)=26631 Total vcore-seconds taken by all map tasks=79031 Total vcore-seconds taken by all reduce tasks=26631

Slide 90

Slide 90 text

Total megabyte-seconds taken by all map tasks=80927744 Total megabyte-seconds taken by all reduce tasks=27270144 Map-Reduce Framework Map input records=8510 Map output records=86296 Map output bytes=827618 Map output materialized bytes=1000216 Input split bytes=143 Combine input records=0 Combine output records=0 Reduce input groups=13491 Reduce shuffle bytes=1000216 Reduce input records=86296 Reduce output records=13491 Spilled Records=172592 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=291 CPU time spent (ms)=14930 Physical memory (bytes) snapshot=322170880

Slide 91

Slide 91 text

Virtual memory (bytes) snapshot=3008438272 Total committed heap usage (bytes)=226037760 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=489319 File Output Format Counters Bytes Written=140299

Slide 92

Slide 92 text

No content

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

Exemplo prático MapReduce

Slide 97

Slide 97 text

1. Iniciar a partir um template para as classes driver, mapper e reducer A maior parte não-lógica de um código MapReduce é o mesmo em todas as aplicações. Isto inclui declarações de importação, definições de classe e assinaturas de método. 2. Modificar o template de acordo com as necessidades 3. Entender o fluxo de transformação dos dados O aspecto mais importante das aplicações MapReduce é entender como os dados são transformados a medida que são executado no framework MapReduce. Existem essencialmente quatro transformações do início ao fim ● Como os dados são transformados a partir dos arquivos de entrada e alimentados nos mappers. ● Como os dados são transformados pelos mapeadores. ● Como os dados são ordenados, mesclados, e apresentado ao reducer. ● Como os reducers transformam os dados e gravam os arquivos de saída. 4. Identificar os tipos adequados para as chaves e valores Construção de uma tarefa MapReduce

Slide 98

Slide 98 text

Dados de entrada

Slide 99

Slide 99 text

# Summary of Receipts, Outlays, and Surpluses or Deficits 1789–2014 $ column -t SummaryOfReceiptsOutlaysSurplusesDeficits.txt 2003 1782314 2159899 -377585 1258472 1796890 -538418 523842 363009 160833 2004 1880114 2292841 -412727 1345369 1913330 -567961 534745 379511 155234 2005 2153611 2471957 -318346 1576135 2069746 -493611 577476 402211 175265 2006 2406869 2655050 -248181 1798487 2232981 -434494 608382 422069 186313 2007 2567985 2728686 -160701 1932896 2275049 -342153 635089 453637 181452 2008 2523991 2982544 -458553 1865945 2507793 -641848 658046 474751 183295 2009 2104989 3517677 -1412688 1450980 3000661 -1549681 654009 517016 136993 2010 2162706 3457079 -1294373 1531019 2902397 -1371378 631687 554682 77005 2011 2303466 3603059 -1299593 1737678 3104453 -1366775 565788 498606 67182 2012 2450164 3537127 -1086963 1880663 3029539 -1148876 569501 507588 61913 2013 2775103 3454647 -679544 2101829 2820836 -719007 673274 633811 39463 2014 3021487 3506089 -484602 2285922 2800036 -514114 735565 706053 29512 Fonte: https://www.whitehouse.gov/omb/budget/Historicals Dados de entrada

Slide 100

Slide 100 text

# Summary of Receipts, Outlays, and Surpluses or Deficits 1789–2014 $ column -t SummaryOfReceiptsOutlaysSurplusesDeficits.txt 2003 1782314 2159899 -377585 1258472 1796890 -538418 523842 363009 160833 2004 1880114 2292841 -412727 1345369 1913330 -567961 534745 379511 155234 2005 2153611 2471957 -318346 1576135 2069746 -493611 577476 402211 175265 2006 2406869 2655050 -248181 1798487 2232981 -434494 608382 422069 186313 2007 2567985 2728686 -160701 1932896 2275049 -342153 635089 453637 181452 2008 2523991 2982544 -458553 1865945 2507793 -641848 658046 474751 183295 2009 2104989 3517677 -1412688 1450980 3000661 -1549681 654009 517016 136993 2010 2162706 3457079 -1294373 1531019 2902397 -1371378 631687 554682 77005 2011 2303466 3603059 -1299593 1737678 3104453 -1366775 565788 498606 67182 2012 2450164 3537127 -1086963 1880663 3029539 -1148876 569501 507588 61913 2013 2775103 3454647 -679544 2101829 2820836 -719007 673274 633811 39463 2014 3021487 3506089 -484602 2285922 2800036 -514114 735565 706053 29512 Fonte: https://www.whitehouse.gov/omb/budget/Historicals Dados de entrada

Slide 101

Slide 101 text

Classe Map

Slide 102

Slide 102 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Classe MAP

Slide 103

Slide 103 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Chave 0 Valor Classe MAP

Slide 104

Slide 104 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Classe MAP

Slide 105

Slide 105 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Classe MAP

Slide 106

Slide 106 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Classe MAP

Slide 107

Slide 107 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // Cria um iterador assumindo que o espaço é o caracter separador dos campos StringTokenizer iterator = new StringTokenizer(value.toString()," "); // Obtém o ano String year = new String(iterator.nextToken()).toString(); // Pula as duas colunas após o ano iterator.nextToken(); iterator.nextToken(); // Obtém o superávit ou déficit String delta = new String(iterator.nextToken()).toString(); context.write(new Text("summary"), new Text(year + "_" + delta)); } } Classe MAP

Slide 108

Slide 108 text

Chave Valor summary 2008_-458553 summary 2009_-1412688 summary 2010_-1294373 summary 2011_-1299593 summary 2012_-1086963 summary 2013_-679544 summary 2014_-484602 Resultado após execução da classe MAP

Slide 109

Slide 109 text

Classe Reduce

Slide 110

Slide 110 text

public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long min=Long.MAX_VALUE; Text minYear=new Text(); long tempValue = 0L; Text tempYear=new Text(); String tempString; String[] keyString; for (Text value: values) { tempString = value.toString(); keyString = tempString.split("_"); tempYear = new Text( keyString[0] ); tempValue = new Long( keyString[1] ).longValue(); if(tempValue < min) { min=tempValue; minYear=tempYear; } } Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } Classe REDUCE

Slide 111

Slide 111 text

public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long min=Long.MAX_VALUE; Text minYear=new Text(); long tempValue = 0L; Text tempYear=new Text(); String tempString; String[] keyString; for (Text value: values) { tempString = value.toString(); keyString = tempString.split("_"); tempYear = new Text( keyString[0] ); tempValue = new Long( keyString[1] ).longValue(); if(tempValue < min) { min=tempValue; minYear=tempYear; } } Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } Classe REDUCE

Slide 112

Slide 112 text

public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long min=Long.MAX_VALUE; Text minYear=new Text(); long tempValue = 0L; Text tempYear=new Text(); String tempString; String[] keyString; for (Text value: values) { tempString = value.toString(); keyString = tempString.split("_"); tempYear = new Text( keyString[0] ); tempValue = new Long( keyString[1] ).longValue(); if(tempValue < min) { min=tempValue; minYear=tempYear; } } Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } Classe REDUCE

Slide 113

Slide 113 text

public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long min=Long.MAX_VALUE; Text minYear=new Text(); long tempValue = 0L; Text tempYear=new Text(); String tempString; String[] keyString; for (Text value: values) { tempString = value.toString(); keyString = tempString.split("_"); tempYear = new Text( keyString[0] ); tempValue = new Long( keyString[1] ).longValue(); if(tempValue < min) { min=tempValue; minYear=tempYear; } } Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } Classe REDUCE

Slide 114

Slide 114 text

Classe REDUCE public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { long min=Long.MAX_VALUE; Text minYear=new Text(); long tempValue = 0L; Text tempYear=new Text(); String tempString; String[] keyString; for (Text value: values) { tempString = value.toString(); keyString = tempString.split("_"); tempYear = new Text( keyString[0] ); tempValue = new Long( keyString[1] ).longValue(); if(tempValue < min) { min=tempValue; minYear=tempYear; } } Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } }

Slide 115

Slide 115 text

Classe Driver

Slide 116

Slide 116 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { // Verifica a passagem do arquivo de dados e do diretório de saída if (args.length != 2) { System.err.printf("Argumentos exigidos pela classe %s: \n", getClass().getSimpleName()); System.exit(1); } Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 117

Slide 117 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { // Verifica a passagem do arquivo de dados e do diretório de saída if (args.length != 2) { System.err.printf("Argumentos exigidos pela classe %s: \n", getClass().getSimpleName()); System.exit(1); } Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 118

Slide 118 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 119

Slide 119 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 120

Slide 120 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 121

Slide 121 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 122

Slide 122 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 123

Slide 123 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 124

Slide 124 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 125

Slide 125 text

public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { Job job = new Job(getConf(), "Exemplo de MapReduce"); job.setJarByClass(ExemploDriver.class); job.setMapperClass(ExemploMapper.class); job.setReducerClass(ExemploReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); // Passa o arquivo de entrada e o diretório de saída FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); // Executa a tarefa de forma síncrona return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); System.exit(ToolRunner.run(conf, new ExemploDriver(), args)); } } Classe DRIVER

Slide 126

Slide 126 text

Resultado

Slide 127

Slide 127 text

$ ls -l output/ -rw-r--r-- 1 cloudera cloudera 23 Apr 2 15:23 part-r-00000 -rw-r--r-- 1 cloudera cloudera 0 Apr 2 15:23 _SUCCESS $ cat output/part-r-00000 min(2009): -1412688.0 Resultado

Slide 128

Slide 128 text

Assinatura dos métodos

Slide 129

Slide 129 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 130

Slide 130 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 131

Slide 131 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 132

Slide 132 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 133

Slide 133 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 134

Slide 134 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values Context context) throws IOException, InterruptedException {, … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 135

Slide 135 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 136

Slide 136 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 137

Slide 137 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 138

Slide 138 text

public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } public class ExemploReducer extends Reducer { public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { … Text keyText=new Text("minimo" + "(" + minYear.toString() + "): "); context.write(keyText, new FloatWritable(min)); } } public class ExemploDriver extends Configured implements Tool { public int run(String[] args) throws Exception { … job.setInputFormatClass(TextInputFormat.class); job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(FloatWritable.class); … } }

Slide 139

Slide 139 text

Criando projeto Maven via Eclipse

Slide 140

Slide 140 text

No content

Slide 141

Slide 141 text

No content

Slide 142

Slide 142 text

Clique em Browse...

Slide 143

Slide 143 text

No content

Slide 144

Slide 144 text

No content

Slide 145

Slide 145 text

No content

Slide 146

Slide 146 text

Foi colocado o caminho completo com o dataset de entrada. Clique em Search...

Slide 147

Slide 147 text

Selecione a classe que possui o método main

Slide 148

Slide 148 text

No content

Slide 149

Slide 149 text

Dois parâmetros de entrada: Caminho completo para o dataset a ser processado e diretório para colocar os resultados

Slide 150

Slide 150 text

Execute o programa

Slide 151

Slide 151 text

No content

Slide 152

Slide 152 text

No content

Slide 153

Slide 153 text

Quais das opções abaixo são verdadeiras sobre a classe MAPPER? 1. Os 4 argumentos da classe MAPER são respectivamente: tipo da chave de entrada, tipo do valor de entrada, tipo da chave de saída e tipo do valor de saída. 2. A classe MAPPER chama o método MAP. 3. Os dois primeiros argumentos do método MAP são a chave e valor correspondentes aos tipos definidos na definição da classe MAPPER. 4. Todas as opções acima. Exercícios

Slide 154

Slide 154 text

Quais das opções abaixo são verdadeiras sobre a classe REDUCER? 1. Os 4 argumentos da classe REDUCER são respectivamente: tipo da chave de entrada, tipo do valor de entrada, tipo da chave de saída e tipo do valor de saída. 2. Se o valor de saída do MAPPER for Text, o valor de entrada do REDUCER deve ser LongWritable. 3. Se a chave de saida do MAPPER for Text, o valor da chave de entrada da classe REDUCER tambpém deve ser Text. 4. Todas as opções acima. 5. 1 e 3 apenas. Exercícios

Slide 155

Slide 155 text

Quais das opções abaixo são verdadeiras sobre a classe DRIVER? 1. A classe DRIVER inicialmente verifica a quantidade de argumentos fornecidos. 2. Ela define valores para a tarefa incluindo as classes para o DRIVER, MAPPER e REDUCER utilizados. 3. Na classe DRIVER, pode-se especificar como a tarefa deve ser executada, síncronamente ou assíncronamente. 4. Todas as opções anteriores. Exercícios

Slide 156

Slide 156 text

Qual é o fluxo de dados e transformações em uma tarefa MapReduce? 1. Arquivo de entrada → Mapper → Reducer → Shuffle → Arquivo de saída. 2. Arquivo de entrada → Shuffle → Mapper → Reducer → Arquivo de saída. 3. Arquivo de entrada → Mapper → Shuffle → Reducer → Arquivo de saída. 4. Mapper → Arquivo de entrada → Shuffle → Reducer → Arquivo de saída. Exercícios

Slide 157

Slide 157 text

Se o a chave de entrada e o valor de entrada do Mapper forem do tipo Text, qual das classes abaixo pode ser utilizada para separar os campos? 1. StringTokenizer. 2. Record Reader. 3. Job Tracker. 4. Task Tracker. Exercícios

Slide 158

Slide 158 text

Se a chave de saída da classe Mapper for Text, então a chave de entrada da classe Reducer deve ser do tipo? 1. Int. 2. Text. 3. FloatWritable. 4. LongWritable. Exercícios

Slide 159

Slide 159 text

No código abaixo, o trecho em destaque representa? 1. Chave. 2. Token. 3. Par Chave-Valor. 4. Valor. public class ExemploMapper extends Mapper { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } Exercícios

Slide 160

Slide 160 text

Os parâmetros da classe Reducer representam os tipos respectivamente do(a)? 1. Chave de saída, valor de saída, configuração e contexto. 2. Chave de entrada, valor de entrada, contexto e configuração. 3. Chave de entrada, valor de entrada, chave de saída e valor de saída. 4. Chave de entrada, chave de saída, valor de entrada e valor de saída. Exercícios

Slide 161

Slide 161 text

Na classe DRIVER, um objeto Job é instanciado. A classe Driver: 1. Também define valores para as classes driver, mapper e reducer utilizados. 2. Deve também definir os valores para o arquivo de entrada. 3. Verifica a sintaxe da linha de comando. 4. Deve também utilizar a interface ToolRunner. Exercícios

Slide 162

Slide 162 text

Quais das opções é verdadeira a respeito da classe Driver? 1. Ela organiza a saída dos mappers para os reducers. 2. Lê os dados no HDFS. 3. Instancia um objeto Job e suas configurações. 4. Processa a saída. Exercícios

Slide 163

Slide 163 text

O método map é chamado uma vez para cada par chave-valor e o resultado de cada mapper são coletados e enviados para: 1. Particionador. 2. Reducer. 3. Record Reader. 4. InputFormat. Exercícios

Slide 164

Slide 164 text

O é responsável por desmembrar os dados de entrada em pares chave-valor e de enviá-los para o Mapper. 1. Record Reader. 2. InputKey. 3. InputFormat. 4. InputValue. Exercícios

Slide 165

Slide 165 text

No código abaixo, o tipo do valor de entrada e o tipo da chave de saída são ambos Text. O tipo do valor de saída é? 1. LongWritable. 2. FloatWritable. 3. Text. 4. IntWritable. public class WordCountMapper extends Mapper { … } Exercícios

Slide 166

Slide 166 text

No content

Slide 167

Slide 167 text

1. Altere o exemplo de obtenção do maior déficit dos dados Summary of Receipts, Outlays, and Surpluses or Deficits: 1789–2014 para que seja obtido também o maior superávit. 2. Implemente uma aplicação MapReduce que conta o número de palavras existentes no livro Journey to the Center of the Earth. 3. Utilizando o dataset American player by year from 1871-2011, calcule a quantidade total de prêmios ganhos por cada jogador. Para isso utilize o arquivo AwardsPlayers.csv em lahman591-csv. Exercícios

Slide 168

Slide 168 text

$ head -10 AwardsPlayers.csv | sed -e 's/,,/, ,/g' | column -s, -t | less -#5 -N -S 1 playerID awardID yearID lgID tie notes 2 bondto01 Triple Crown 1877 NL 3 hinespa01 Triple Crown 1878 NL 4 heckegu01 Triple Crown 1884 AA 5 radboch01 Triple Crown 1884 NL 6 oneilti01 Triple Crown 1887 AA 7 keefeti01 Triple Crown 1888 NL 8 clarkjo01 Triple Crown 1889 NL 9 duffyhu01 Triple Crown 1894 NL 10 rusieam01 Triple Crown 1894 NL