Não consegui pensar em nenhum bom exemplo além da tarefa "como contar palavras em um texto longo com o MapReduce". Achei que esse não era o melhor exemplo para dar aos outros uma impressão de quão poderosa essa ferramenta pode ser.
Não estou procurando trechos de código, realmente apenas exemplos "textuais".
Eu acho que um exemplo semelhante, mas muito melhor, é contar palavras para todos os seus arquivos de texto que você possui no seu computador. É mais fácil entender e demonstrar o poder do MapReduce.
Peter Lee
5
Nas últimas quatro perguntas que pesquisei, as encontrei fechadas como não construtivas neste site. Por sorte, eles já têm respostas. Aos autores, agradeço minha gratidão e, a partir de agora, havia mais de 80 indivíduos que não entendem a política de fechamento. Não que isso importe para os outros, mas sou um programador profissional desde o início dos anos 80 e, a essa
Helder Velez
1
Vale a pena dar uma olhada nos padrões de design do MapReduce: por exemplo, alguns abordados nesses slides e muito mais podem ser vistos neste livro
Denis
Respostas:
297
A redução de mapa é uma estrutura desenvolvida para processar grandes quantidades de dados com eficiência. Por exemplo, se tivermos 1 milhão de registros em um conjunto de dados e ele for armazenado em uma representação relacional - é muito caro derivar valores e realizar qualquer tipo de transformação neles.
Por exemplo, no SQL, Dada a data de nascimento, para descobrir quantas pessoas têm mais de 30 anos para um milhão de registros, isso levaria um tempo e isso só aumentaria em ordem de aumento quando a complexidade da consulta aumentar. O Map Reduce fornece uma implementação baseada em cluster, na qual os dados são processados de maneira distribuída
Outro bom exemplo é Encontrar amigos via redução de mapa pode ser um exemplo poderoso para entender o conceito e um caso de uso bem usado.
Pessoalmente, achei este link bastante útil para entender o conceito
Copiando a explicação fornecida no blog (caso o link fique obsoleto)
Encontrando Amigos
O MapReduce é uma estrutura desenvolvida originalmente no Google que permite fácil computação distribuída em larga escala em vários domínios. O Apache Hadoop é uma implementação de código aberto.
Vou abordar os detalhes, mas tudo se resume à definição de duas funções: uma função de mapa e uma função de redução. A função de mapa pega um valor e gera a chave: pares de valores. Por exemplo, se definirmos uma função de mapa que pega uma string e gera o comprimento da palavra como chave e a própria palavra como valor, o mapa (steve) retornaria 5: steve e map (savannah) retornaria 8: savannah . Você deve ter notado que a função map é sem estado e requer apenas o valor de entrada para calcular seu valor de saída. Isso nos permite executar a função map contra valores em paralelo e fornece uma enorme vantagem. Antes de chegarmos à função de redução, a estrutura mapreduce agrupa todos os valores por chave, portanto, se as funções de mapa produzirem a seguinte chave: pares de valores:
3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research
Cada uma dessas linhas seria passada como argumento para a função de redução, que aceita uma chave e uma lista de valores. Nesse caso, podemos estar tentando descobrir quantas palavras de determinados comprimentos existem; portanto, nossa função de redução apenas conta o número de itens na lista e gera a chave com o tamanho da lista, como:
3 : 3
4 : 3
5 : 2
8 : 2
As reduções também podem ser feitas em paralelo, proporcionando novamente uma enorme vantagem. Podemos então olhar para esses resultados finais e ver que havia apenas duas palavras de comprimento 5 em nosso corpus, etc.
O exemplo mais comum de mapreduce é contar o número de vezes que as palavras ocorrem em um corpus. Suponha que você tenha uma cópia da Internet (tive a sorte de ter trabalhado em tal situação) e desejou uma lista de todas as palavras da Internet e quantas vezes isso ocorreu.
A maneira como você abordaria isso seria tokenizar os documentos que você possui (dividi-lo em palavras) e passar cada palavra para um mapeador. O mapeador cuspiria a palavra de volta juntamente com um valor de1 . A fase de agrupamento pegará todas as chaves (neste caso, palavras) e fará uma lista de 1s. A fase de redução pega uma chave (a palavra) e uma lista (uma lista de 1s para cada vez que a chave apareceu na internet) e resume a lista. O redutor então envia a palavra, juntamente com sua contagem. Quando tudo estiver dito e feito, você terá uma lista de todas as palavras na internet, além de quantas vezes ela apareceu.
Fácil né? Se você já leu sobre mapreduce, o cenário acima não é novidade ... é o "Olá, mundo" da mapreduce. Então, aqui está um caso de uso do mundo real (o Facebook pode ou não fazer o seguinte, é apenas um exemplo):
O Facebook tem uma lista de amigos (observe que os amigos são bidirecionais no Facebook. Se eu sou seu amigo, você é meu). Eles também têm muito espaço em disco e atendem a centenas de milhões de solicitações todos os dias. Eles decidiram pré-calcular os cálculos quando possível para reduzir o tempo de processamento de solicitações. Uma solicitação de processamento comum é o recurso "Você e Joe têm 230 amigos em comum". Quando você visita o perfil de alguém, vê uma lista de amigos que você tem em comum. Essa lista não muda frequentemente, portanto, seria um desperdício recalculá-la toda vez que você visitasse o perfil (com certeza você poderia usar uma estratégia de cache decente, mas não seria capaz de continuar escrevendo sobre mapreduce para esse problema). Vamos usar o mapreduce para que possamos calcular todos ' s amigos comuns uma vez por dia e armazene esses resultados. Mais tarde, é apenas uma pesquisa rápida. Temos muito disco, é barato.
Suponha que os amigos estejam armazenados como Pessoa -> [Lista de Amigos], nossa lista de amigos é então:
A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D
Cada linha será um argumento para um mapeador. Para cada amigo na lista de amigos, o mapeador produzirá um par de valores-chave. A chave será um amigo junto com a pessoa. O valor será a lista de amigos. A chave será classificada para que os amigos estejam em ordem, fazendo com que todos os pares de amigos sigam para o mesmo redutor. Isso é difícil de explicar com o texto, então vamos fazê-lo e ver se você pode ver o padrão. Após a execução de todos os mapeadores, você terá uma lista como esta:
For map(A -> B C D) :
(A B) -> B C D
(A C) -> B C D
(A D) -> B C D
For map(B -> A C D E) : (Note that A comes before B in the key)
(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :
(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :
(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):
(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:
(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)
Cada linha será passada como argumento para um redutor. A função de redução simplesmente cruza as listas de valores e gera a mesma chave com o resultado da interseção. Por exemplo, reduzir ((AB) -> (ACDE) (BCD)) produzirá (AB): (CD) e significa que os amigos A e B têm C e D como amigos comuns.
O resultado após a redução é:
(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)
Agora, quando D visita o perfil de B, podemos rapidamente olhar para cima (B D)e ver que eles têm três amigos em comum (A C E).
Outro exemplo seria analisar os dados climáticos de todo o mundo. Encontrar o máximo e o mínimo para qualquer região. Este é um exemplo muito bom.
rvphx
Gerar todas essas tuplas intermediárias e depois verificar a interseção de todas, não é entediante? Não seria melhor gerar todos os pares possíveis de amigos, como AB AC BC etc, e apenas passá-los com as listas inteiras de amigos, apenas dos dois amigos do par, para uma máquina específica e permitir calcular a interseção? O que estou perdendo aqui?
GrowinMan
8
E se A visitar o perfil de E? Não há (A, E) no resultado final, embora eles tenham amigos em comum.
Aperte
1
@ Pinch é porque A e E não são amigos. Nesse caso, essa abordagem parece realmente insuficiente (a menos que você leve em consideração que A ou E poderia ocultar sua lista de amigos para não-amigos :))
Pega88
1
@karthikr: Estou confuso sobre a fase de agrupamento. O Map and Reduce pode obviamente ser executado em paralelo, mas e a fase de agrupamento? Deve ser feito em um único thread ou estou faltando alguma coisa?
Lembre-se, porém, de que elas estão limitadas às implementações baseadas na chave-valor da idéia do MapReduce (portanto, são limitantes em aplicabilidade).
Você está certo. Mas a maioria dos problemas do mundo real são baseados em valores-chave ou podem ser / devem ser traduzidos para paradigmas de valores-chave.
Saisumanth Gopisetty
4
Um conjunto de operações familiares que você pode executar no MapReduce é o conjunto de operações SQL normais: SELECT, SELECT WHERE, GROUP BY, ect.
Outro bom exemplo é a multiplicação de matrizes, onde você passa uma linha de M e todo o vetor x e calcula um elemento de M * x.
De tempos em tempos, apresento conceitos de RM para as pessoas. Acho que as tarefas de processamento são familiares para as pessoas e, em seguida, mapeio-as para o paradigma de RM.
Normalmente, tomo duas coisas:
Agrupar por / agregações. Aqui, a vantagem do estágio de embaralhamento é clara. Uma explicação de que o embaralhamento também é uma classificação distribuída + uma explicação do algoritmo de classificação distribuída também ajuda.
Junção de duas tabelas. As pessoas que trabalham com DB estão familiarizadas com o conceito e seu problema de escalabilidade. Mostre como isso pode ser feito no MR.
Para explicar para não nerds, eu uso o método children: você tem um monte de crianças ansiosas e muitas cartas. você dá a cada criança uma quantidade de cartas dizendo para ordená-las pelo verso do baralho *, depois pelo número / imagem e depois pelo naipe - ou seja, a função de mapa que cada criança termina e leva a um conjunto de adultos, dois de cada vez. cada adulto "reduz" a pilha em uma pilha e, em seguida, cada dois adultos dá a um adulto livre lá as cartas. isto é, por definição, a função de redução que pode ser executada mais de uma vez, de acordo com o número de crianças / pilhas. a maioria das pessoas obtê-lo na primeira tentativa
Respostas:
A redução de mapa é uma estrutura desenvolvida para processar grandes quantidades de dados com eficiência. Por exemplo, se tivermos 1 milhão de registros em um conjunto de dados e ele for armazenado em uma representação relacional - é muito caro derivar valores e realizar qualquer tipo de transformação neles.
Por exemplo, no SQL, Dada a data de nascimento, para descobrir quantas pessoas têm mais de 30 anos para um milhão de registros, isso levaria um tempo e isso só aumentaria em ordem de aumento quando a complexidade da consulta aumentar. O Map Reduce fornece uma implementação baseada em cluster, na qual os dados são processados de maneira distribuída
Aqui está um artigo da Wikipedia explicando o que
map-reduce
é tudo issoOutro bom exemplo é Encontrar amigos via redução de mapa pode ser um exemplo poderoso para entender o conceito e um caso de uso bem usado.
Pessoalmente, achei este link bastante útil para entender o conceito
Copiando a explicação fornecida no blog (caso o link fique obsoleto)
fonte
Um dos melhores exemplos de implementação do MapReduce semelhante ao Hadoop .
Lembre-se, porém, de que elas estão limitadas às implementações baseadas na chave-valor da idéia do MapReduce (portanto, são limitantes em aplicabilidade).
fonte
Um conjunto de operações familiares que você pode executar no MapReduce é o conjunto de operações SQL normais: SELECT, SELECT WHERE, GROUP BY, ect.
Outro bom exemplo é a multiplicação de matrizes, onde você passa uma linha de M e todo o vetor x e calcula um elemento de M * x.
fonte
De tempos em tempos, apresento conceitos de RM para as pessoas. Acho que as tarefas de processamento são familiares para as pessoas e, em seguida, mapeio-as para o paradigma de RM.
Normalmente, tomo duas coisas:
Agrupar por / agregações. Aqui, a vantagem do estágio de embaralhamento é clara. Uma explicação de que o embaralhamento também é uma classificação distribuída + uma explicação do algoritmo de classificação distribuída também ajuda.
Junção de duas tabelas. As pessoas que trabalham com DB estão familiarizadas com o conceito e seu problema de escalabilidade. Mostre como isso pode ser feito no MR.
fonte