Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MapReduce

 MapReduce

Treinamento Fundamentos de Big Data com Apache Hadoop.
Para mais informações acesse: http://nsl.net.br/

Eduardo Miranda

May 02, 2016
Tweet

More Decks by Eduardo Miranda

Other Decks in Education

Transcript

  1. 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
  2. • Modelo conceitual do MapReduce. • Como o MapReduce funciona

    em alto nível. • Fluxo de dados no MapReduce. Seção I Introdução ao MapReduce
  3. 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.
  4. ;;; 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.
  5. 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 <http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf>
  6. 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.
  7. 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 “ ”
  8. 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
  9. 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
  10. HDFS InputFormat Partes Partes Partes Record Readers Record Readers Record

    Readers Map Map Map Particionador Ordenação Reduce OutputFormat
  11. 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.
  12. 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.
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. • 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
  21. 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.
  22. 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.
  23. 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
  24. 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
  25. 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.
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. • Projetar e implementar ◦ Classe Mapper ◦ Classe Reducer

    ◦ Classe Driver Seção III MapReduce
  35. Autor Jules Verne Título Journey to the Center of the

    Earth País França Publicação 1864 Páginas 183
  36. 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
  37. public class WordCount { public static class Map extends Mapper<LongWritable,

    Text, Text, IntWritable> { 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
  38. public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } WordCount.java
  39. 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
  40. [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]
  41. [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
  42. [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
  43. 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
  44. 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
  45. 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
  46. 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
  47. # 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
  48. # 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
  49. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  50. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  51. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  52. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  53. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  54. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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
  55. 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
  56. public class ExemploReducer extends Reducer <Text,Text,Text,FloatWritable> { public void reduce(Text

    key, Iterable<Text> 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
  57. public class ExemploReducer extends Reducer <Text,Text,Text,FloatWritable> { public void reduce(Text

    key, Iterable<Text> 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
  58. public class ExemploReducer extends Reducer <Text,Text,Text,FloatWritable> { public void reduce(Text

    key, Iterable<Text> 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
  59. public class ExemploReducer extends Reducer <Text,Text,Text,FloatWritable> { public void reduce(Text

    key, Iterable<Text> 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
  60. Classe REDUCE public class ExemploReducer extends Reducer <Text,Text,Text,FloatWritable> { public

    void reduce(Text key, Iterable<Text> 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)); } }
  61. 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: <ArquivoEntrada> <DiretorioSaida>\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
  62. 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: <ArquivoEntrada> <DiretorioSaida>\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
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. $ 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
  72. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  73. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  74. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  75. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  76. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  77. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  78. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  79. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  80. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  81. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { 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 <Text,Text,Text,FloatWritable> { public void reduce(Text key, Iterable<Text> 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); … } }
  82. Dois parâmetros de entrada: Caminho completo para o dataset a

    ser processado e diretório para colocar os resultados
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. No código abaixo, o trecho em destaque representa? 1. Chave.

    2. Token. 3. Par Chave-Valor. 4. Valor. public class ExemploMapper extends Mapper <LongWritable,Text,Text,Text> { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { … context.write(new Text("summary"), new Text(year + "_" + delta)); } } Exercícios
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. 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 <LongWritable, Text, Text, IntWritable> { … } Exercícios
  96. 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
  97. $ 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