İyi MapReduce örnekleri [kapalı]


202

"Nasıl uzun bir metin MapReduce ile kelime saymak" görev dışında iyi örnekleri düşünemedim. Bunun, başkalarına bu aracın ne kadar güçlü olabileceğine dair bir izlenim vermek için en iyi örnek olmadığını buldum.

Kod parçacıkları aramıyorum, gerçekten sadece "metinsel" örnekler.


1
Benzer ama çok daha iyi bir örnek, bilgisayarınızda bulunan tüm metin dosyalarınız için sözcük saymak olduğunu düşünüyorum. MapReduce'un gücünü anlamak ve gücünü göstermek daha kolaydır.
Peter Lee

5
Aradığım son dört soruya kadar, bu sitede yapıcı olmayan kapalı buldum. Şans eseri zaten cevapları var. Yazarlara minnettarlığımı destekliyorum ve şu an itibariyle kapanış politikasını anlamayan 80'den fazla birey vardı. Başkaları için önemli değil, ama 80'lerin başından beri profesyonel bir programcıyım ve şimdiye kadar kendimi yanlış sorular sordum :)
Helder Velez

1
MapReduce tasarım desenlerine bir göz atmaya değer: örneğin, bu slaytlarda kapsanan ve daha fazlası bu kitapta
Denis

Yanıtlar:


297

Harita azaltma, büyük miktarda veriyi verimli bir şekilde işlemek için geliştirilmiş bir çerçevedir. Örneğin, bir veri kümesinde 1 milyon kayıt varsa ve ilişkisel bir temsilde depolanırsa - değer elde etmek ve bunlar üzerinde herhangi bir dönüşüm gerçekleştirmek çok pahalıdır.

Örneğin SQL'de, Doğum Tarihi göz önüne alındığında, bir milyon kayıt için kaç kişinin> 30 yaşından büyük olduğunu görmek biraz zaman alacaktır ve bu sadece sorgunun karmaşıklığı arttığında büyüklük sırasıyla artacaktır. Harita Azaltma, verilerin dağıtılmış bir şekilde işlendiği küme tabanlı bir uygulama sağlar

İşte ne hakkında olduğunu açıklayan bir wikipedia makalesimap-reduce

Başka bir iyi örnek, harita azaltma yoluyla Arkadaş Bulma kavramını anlamak için güçlü bir örnek ve iyi kullanılmış bir kullanım örneğidir.

Şahsen, bu bağlantıyı kavramı anlamak için oldukça yararlı buldum

Blogda sağlanan açıklamayı kopyalama (Bağlantının eski olması durumunda)

Arkadaş Bulma

MapReduce, başlangıçta Google'da geliştirilmiş ve bir dizi alanda kolay büyük ölçekli dağıtılmış hesaplama sağlayan bir çerçevedir. Apache Hadoop açık kaynaklı bir uygulamadır.

Ayrıntıları açıklayacağım, ancak iki fonksiyon tanımlamaya geliyor: bir harita fonksiyonu ve bir azaltma fonksiyonu. Map fonksiyonu bir değer alır ve key: değer çiftlerini çıkarır. Örneğin, bir dize alan ve sözcüğün uzunluğunu anahtar olarak ve sözcüğün kendisini değer olarak veren bir harita işlevi tanımlarsak, harita (steve) 5 döndürür: steve ve map (savannah) 8: savannah döndürür . Harita işlevinin durumsuz olduğunu ve yalnızca çıkış değerini hesaplamak için giriş değerini gerektirdiğini fark etmiş olabilirsiniz. Bu, harita işlevini değerlere paralel olarak çalıştırmamızı sağlar ve büyük bir avantaj sağlar. İndirgeme işlevine geçmeden önce, mapreduce çerçevesi tüm değerleri anahtarla birlikte gruplandırır; bu nedenle, harita işlevleri aşağıdaki anahtarı verirse: değer çiftleri:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

Şu şekilde gruplandırılırlar:

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

Bu satırların her biri, bir anahtarı ve bir değer listesini kabul eden azaltma işlevine bir argüman olarak iletilir. Bu durumda, belirli uzunluklarda kaç kelime olduğunu anlamaya çalışıyor olabiliriz, bu nedenle azaltma fonksiyonumuz listedeki öğelerin sayısını sayar ve anahtarı listenin boyutuyla çıkarır, örneğin:

3 : 3
4 : 3
5 : 2
8 : 2

İndirgemeler de yine büyük bir avantaj sağlayarak paralel olarak yapılabilir. Daha sonra bu nihai sonuçlara bakabilir ve cesetimizde 5 uzunluğunda sadece iki kelime olduğunu görebiliriz ...

Mapreduce'un en yaygın örneği, kelimelerin bir toplulukta kaç kez meydana geldiğini saymaktır. İnternetin bir kopyasına sahip olduğunuzu varsayalım (böyle bir durumda çalışabildiğim için şanslıyım) ve internetteki her kelimenin yanı sıra kaç kez meydana geldiğini istediğinizi varsayalım.

Buna yaklaşma şekliniz, sahip olduğunuz belgeleri tokenize etmek (kelimelere bölmek) ve her kelimeyi bir haritacıya aktarmak olacaktır. Haritacı daha sonra kelimeyi bir değerle birlikte tükürür 1. Gruplandırma aşaması tüm anahtarları (bu örnekte) alır ve 1'lerin listesini yapar. Küçültme aşaması daha sonra bir anahtar (kelime) ve bir liste (anahtar internette her göründüğünde 1'lerin listesi) alır ve listeyi toplar. Redüktör daha sonra sayımı ile birlikte kelimeyi çıkarır. Her şey söylendiğinde ve yapıldığında, internetteki her kelimenin bir listesi ve kaç kez göründüğüne sahip olacaksınız.

Kolay değil mi? Mapreduce hakkında daha önce okuduysanız, yukarıdaki senaryo yeni bir şey değildir ... mapreduce'un "Merhaba Dünyası" dır. İşte gerçek bir dünya kullanım örneği (Facebook aslında aşağıdakileri yapabilir veya etmeyebilir, bu sadece bir örnek):

Facebook'un bir arkadaş listesi vardır (arkadaşlarınızın Facebook'ta iki yönlü bir şey olduğunu unutmayın. Eğer arkadaşınız benim, sen benimsin). Ayrıca çok fazla disk alanı var ve her gün yüz milyonlarca talebe hizmet ediyorlar. Taleplerin işlenme süresini azaltmak için hesaplamaları önceden hesaplamaya karar verdiler. Yaygın bir işleme isteği, "Siz ve Joe'nun ortak 230 arkadaşı var" özelliğidir. Birinin profilini ziyaret ettiğinizde, ortak arkadaşlarınızın bir listesini görürsünüz. Bu liste sık sık değişmez, bu yüzden profili her ziyaret ettiğinizde yeniden hesaplamak israf olacaktır (iyi bir önbellek stratejisi kullanabileceğinizden emin olabilirsiniz, ancak daha sonra bu sorun için mapreduce hakkında yazmaya devam edemezdim). Herkesi hesaplayabilmemiz için mapreduce kullanacağız s ortak arkadaşları günde bir kez ve bu sonuçları saklayın. Daha sonra sadece hızlı bir arama. Çok fazla diskimiz var, ucuz.

Arkadaşlarınızın Kişi olarak depolandığını varsayalım -> [Arkadaş Listesi], arkadaş listemiz o zaman:

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

Her satır bir haritacı için bir argüman olacaktır. Arkadaş listesindeki her arkadaş için, haritacı bir anahtar / değer çifti çıkarır. Anahtar kişi ile birlikte bir arkadaş olacak. Değer, arkadaş listesi olacaktır. Anahtar, tüm arkadaş çiftlerinin aynı redüktöre gitmesine neden olacak şekilde sıralanacaktır. Bunu metinle açıklamak zordur, bu yüzden yapalım ve kalıbı görüp göremeyeceğinize bakalım. Tüm haritacıların çalışması bittikten sonra şöyle bir listeniz olur:

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)

Her çizgi bir redüktöre argüman olarak iletilecektir. Azaltma işlevi, değer listelerini keser ve kesişimin sonucu ile aynı anahtarı verir. Örneğin, ((AB) -> (ACDE) (BCD)) (AB): (CD) çıktısını verir ve A ve B arkadaşlarının ortak arkadaş olarak C ve D'ye sahip olduğu anlamına gelir.

İndirgeme sonrası sonuç:

(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)

Şimdi D, B'nin profilini ziyaret ettiğinde, hızlı bir şekilde arayabilir (B D)ve üç ortak müşterileri olduğunu görebiliriz (A C E).


4
Başka bir örnek, dünyanın her yerinden hava durumu verilerini analiz etmektir. Herhangi bir bölge için Maks ve min değerlerini bulma. Bu çok iyi bir örnek.
rvphx

Tüm bu ara kapları üretmek ve daha sonra kavşakları herkes için kontrol etmek, sıkıcı değil mi? AB AC BC gibi tüm olası arkadaş çiftlerini üretmek ve bu çiftleri sadece çiftteki iki arkadaşın tüm arkadaş listesiyle belirli bir makineye geçirmek ve kavşağı hesaplamasına izin vermek daha iyi olmaz mıydı? Burada ne eksik?
GrowinMan

8
A E kullanıcısının profilini ziyaret ederse ne olur? Sonuçta ortak arkadaşları olsa da (A, E) yoktur.
Çimdikle

1
@Pinch, çünkü A ve E arkadaş değiller. Bu durumda bu yaklaşım gerçekten yetersiz görünüyor (A veya E'nin arkadaş olmayanlar için arkadaş
listesini gizleyebileceğini hesaba katmadıkça

1
@karthikr: Gruplandırma aşaması hakkında kafam karıştı. Harita ve Küçültme açıkça paralel çalıştırılabilir, ancak gruplama aşaması ne olacak? Tek bir iş parçacığında mı yapılmalı yoksa bir şey mi eksik?
Dinaiz


4

MapReduce içinde yapabileceğiniz tanıdık işlemlerden biri normal SQL işlemleri kümesidir: SELECT, SELHER WHERE, GROUP BY, vb.

Başka bir iyi örnek, bir M satırını ve x vektörünün tamamını geçirdiğiniz ve M * x'in bir elemanını hesapladığınız matris çarpımıdır.


3

Zaman zaman MR kavramlarını insanlara sunuyorum. İnsanlara tanıdık gelen işleme görevleri buluyorum ve sonra bunları MR paradigmasına eşliyorum.

Genellikle iki şey alırım:

  1. Gruplama / Toplama. Burada karıştırma aşamasının avantajı açıktır. Karıştırmanın sıralama şeklinde dağıtıldığına dair bir açıklama + dağıtılmış sıralama algoritmasının açıklaması da yardımcı olur.

  2. İki masanın birleşimi. DB ile çalışan insanlar kavramı ve ölçeklenebilirlik problemini bilmektedir. MR'da nasıl yapılabileceğini gösterin.


non nerds için explian için çocuk yöntemi kullanın: istekli çocuklar bir sürü ve birçok kart var. her çocuğa, kart * destesinin arkasına, daha sonra numaraya / resme, sonra da takım elbise- ne göre sıralamalarını söyleyen bir miktar kart verirsiniz; yani, harita işlevi her çocuk biter ve her seferinde ikişer ayrılan bir yetişkin grubuna getirir. her yetişkin yığını bir yığın halinde "azaltır" ve daha sonra her iki yetişkin ücretsiz bir yetişkine kart destesi verir. tanımı gereği çocuk / yığın sayısına göre birden fazla çalıştırılabilen indirgeme fonksiyonudur. çoğu insan ilk denemede olsun
Mickey Perlstein
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.