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