MapReduce ne tür problemler çözüyor?


61

Bir süredir MapReduce hakkında okuyordum - fakat anlayamadığım şey, birinin MapReduce'u nasıl kullanacağına (kullanmayacağına veya kullanmayacağına) nasıl karar vereceği.

Demek istediğim, MapReduce'un kullanılabileceğini belirten problem kalıpları nelerdir?

Yanıtlar:


47

Temelde çok büyük ama zor olmayan sorunlar var. Seyahat eden satıcı , herhangi bir şehir çifti arasındaki mesafeye büyük ölçüde bağlıdır, bu nedenle birçok parçaya bölünebilirken, kısmi sonuçlar, global olarak en uygun çözümün ortaya çıkması için yeniden birleştirilemez (muhtemelen, bilmiyorum; Lütfen şimdi Alan madalyası için başvurunuz).

Öte yandan, devasa bir korpustaki kelimelerin frekanslarını saymak önemsiz bir şekilde bölümlere ayrılabilir ve önemsiz bir şekilde yeniden birleştirilebilir (sadece corpusun bölümleri için hesaplanan vektörleri eklersiniz), bu nedenle harita azaltma açık bir çözümdür.

Uygulamada, daha fazla sorun kolay bir şekilde yeniden birleştirilebilir olma eğilimindedir, bu nedenle bir işi paralelleştirmek ya da yapmama kararı, görevin ne kadar büyük olduğu ile daha fazla ve daha az zor olmasıyla ilgilidir.


Seyahat eden satıcı sorununa yaklaşık bir cevap arıyorsanız, cevabı birleştirilecek minimum mesafeyle önemsizce seçebilirsiniz.
dan_waterworth

MapReduce'un Traveling Salesman için neden uygun olmadığını açıkladığınızı anlamadım.

9
Bir çözüm bulmak , hatta belki de çok iyi bir çözüm bulmak için uygundur - sadece şehirler kümesini daha küçük kümelere ayırın, örneğin 1-10, 11-20, 21-30, aralarındaki en uygun rotaları bulun ve bunlara atlayın. 10-> 11, 20-> 21 ve 30-> 1. Ancak, sorunun amacı en uygun rotayı bulmak ve en uygun rotanın bu şekilde bölümlendiğine dair hiçbir garanti yok - aslında 1-> 25 ile başlayabilir! Başka bir deyişle, doğru bölümlemeyi bulmak için, çözümü zaten bilmeniz gerekir! Bu nedenle, en uygun rotayı bulmak, yeniden bir araya
gelme

2
@KilianFoth, çözelti alanını 1'e başlayarak, 2'den başlayarak ..., sonra da bu düğümlerin her birindeki problemi alanı tekrar aynı şekilde bölerek çözerek ayrıntılı bir arama yapabilirsiniz. Kökte birleştirmek, en kısa yolu bulmak, diğer bir dalda birleştirmek en kısa 'çocuk rotası + daldan çocuğa rota' bulmaktır.
dan_waterworth

3
Çözümünüz varsa, 40 yaşın altındaysanız yalnızca Fields madalyası için uygun olduğunuzu unutmayın.
Francesco

28

Sorun, dağıtılmış bilgisayar kullanarak etkin bir şekilde çözülebilir mi?

Bu sorunun cevabı evet ise, MapReduce için bir aday probleminiz var. Bunun nedeni, sorun modelinin daha küçük izole sorunlara ayrılmaya meyilli olmasıdır.

Göreviniz: Bu kitabı çözümleyin

Bir örnek bunu aşmak için iyi çalışır. Büyük bir dökümanınız var ( Herman Melville'in Moby Dick'i ) ve işiniz, kullanılan tüm kelimelerin sıklık analizini yapmak.

Sıralı yaklaşım

Bunu, en hızlı makinenizi (etrafta bol bol uzanmış halde) alıp, metinden baştan sona kadar bulduğunuzda, bulduğunuz her kelimenin (anahtarın) bir karma haritasını koruyarak ve her seferinde frekansı (değer) artırarak sırayla yapabilirsiniz. bir kelimeyi ayrıştırıyorsun. Basit, anlaşılır ve yavaş.

MapReduce yaklaşımı

Buna farklı bir bakış açısıyla yaklaşırken, tüm bu yedek makinelerin etrafta yattığını ve bu görevi parçalara ayırabileceğinizi unutmayın. Her makineye bir karma haritaya ayrıştırmak için 1Mb metin bloğu verin ve ardından tüm karma haritalarını her birinden tek bir sonuçta harmanlayın. Bu katmanlı bir MapReduce çözümüdür.

Bir metin satırı okuma ve sözcük toplama işlemi Harita aşamasıdır (satırdaki kelimeleri 1,2,3 vb. Sıklıkta temsil eden basit bir harita oluşturursunuz), ardından Redüksiyon aşaması her makine satırını harmanladığında haritaları tek bir toplam haritaya yerleştirir.

Genel çözüm, tüm toplu haritaların (tekrar bu kelime) son bir harita içinde toplandığı daha fazla bir Redüksiyon aşamasından gelir. Hafifçe daha karmaşık, toplu olarak paralel ve hızlı.

özet

Dolayısıyla, özetlemek gerekirse, probleminiz kendini anahtarlar, değerler, bu değerler üzerinde izole edilmiş toplam işlemler ile temsil etmeye borçluysa, o zaman MapReduce için bir aday probleminiz olur.


2
Meh; bu bir basitleştirmedir. MapReduce verileri bölümlere ayırmak , analizörlerle iletişim kurmadan parçalara paralel bir fonksiyon uygulamak ve ardından bitleri birleştirmek için başka bir fonksiyon uygulamakla ilgilidir. Dağıtılabilir sorunların tümü bu modele uymuyor.
Donal Fellows

2
Adil nokta - ancak faydalı bir giriş olarak hizmet eder ve birinin problemini "kutlamasına" izin verir.
Gary Rowe,

13

MapReduce modeli, işlevsel programlama dünyasından alınmıştır. Paratorizm denilen bir şeyi paralel olarak veri yapısı üzerine uygulama sürecidir. İşlevsel programcılar hemen hemen her basit dönüşüm veya özetleme için katamorfizm kullanırlar.

Verilerinizin bir ağaç olduğunu farz edersek, belirleyici faktör, yalnızca o düğümde bulunan verileri ve çocukları için hesaplanan değerleri kullanarak bir düğüm için bir değer hesaplayabilmenizdir.

Örneğin, bir catamorphism kullanarak bir ağacın boyutunu hesaplayabilirsiniz; Tüm çocuklar için hesaplanan değerlerin toplamını artı bir hesaplarsınız.


İyi cevap, @ good_computer'ın Google tarafından geliştirilen özel MapReduce çerçevesine atıfta bulunduğundan emin değilim. Ve MapReduce'un (yine Google çerçevesi) listelerde izomer türden başka bir şey için geçerli olup olmadığını bilmiyorum.
eşarp

1
@scarfridge, OP’nin Google’ın özel çerçevesine göndermediğini varsaydım. Göndermeden önce yalnızca listelerde mi yoksa genel olarak ağaçlarda mı kullanıldığına ilişkin Wikipedia makalesine baktım. en.wikipedia.org/wiki/MapReduce#Overview
dan_waterworth

2
Keşke MapFold ise ; Bunu anlamak çok daha kolay olurdu.
Aditya

6

Bu WPI - Harita Azaltma Uygulamaları (ppt) ilginizi çekebilir. MR'ın farklı uygulamalarını tartışıyor ve tartışılan vakalardan biri olarak, New York Times'ın 100 EC2 örneğini ve 24 saatini kullanarak 4 TB taranan makaleleri 1.5 TB PDF belgelerine nasıl dönüştürebildiğini gösteriyor.

MR'ın hızlanma performansında yardımcı olduğu diğer bir örnek set şudur: Aster - SQL Map Reduce , Dolandırıcılık Tespiti, Dönüşümler ve diğerleri de dahil olmak üzere SQL-Map Reduce teknolojisinin bazı vaka çalışmalarını gösterir.


1
Taranan makale başına bir pdf ile sonuçlanırsa, MapReduce'u değil, yalnızca dağıtılmış bir harita kullanıyorsunuzdur. Harita azaltmada, tek bir sonuç elde etmek için haritanın sonuçlarına bir azaltma uygularsınız.
Pete Kirkham

6

Harita / Azaltma, belirli bir algoritma türünün belirli bir şeklidir. Büyük bir veri setini başka bir veri setine dönüştürmek için kullanırsınız. (Sonuç veri kümesi çok büyük olabilir veya olmayabilir.) Statik veri girişi sonucunda ayarlanmış bir statik veri çıkışı istemiyorsanız, Harita / Küçültme uygun değildir. Map / Reduce, size Manhattan telefon rehberinde kaç tane John Smith olduğunu kolayca söyleyebilir, ancak bir web sunucusu oluşturmak için uygun değildir.

Harita / Azaltma çalışma şekli:

  • Harita, anahtar (k1) ve değerler (v1) çiftlerini alır ve bunları yeni bir anahtar (k2) ve değerler (v2) ile eşler.
  • Azalt, tüm v2 değerlerini aynı k2 tuşuyla alır ve yeni bir değer (v3) oluşturur.

Sonuç, (k1, v1) çiftlerinin bir listesinin (v3) s listesine dönüştürülmesidir. (Elbette, "v3" değeri, k1'e eşit olarak tanımlanabilen k2 içeren bir bileşik olabilir.)

Yani onu kullanıyorsun:

  1. Bir ya da iki sunucuda sırayla çalıştırarak başlamak için çok fazla veri varsa, çok uzun sürer ve

  2. Çıktı verilerinin bir değer listesi veya anahtar değer çiftleri olduğunu düşünebilirsiniz (genellikle "anahtar" ı sadece "benzersiz etiket" anlamına geldiğini hatırladığınızda çok zor değildir) ve

  3. İlişki ne olursa olsun, her giriş verisi parçasının yalnızca bir çıkış anahtarının çıkış değerini etkilediğinden emin olursunuz.

Verilerinizin tümü tek bir sunucu tarafından sırayla işlenebiliyorsa, bu durum hakim bilgisayar paradigması (sunucular için inşa edilmiş ve programcılar üzerinde eğitilmiş) olduğundan, tek bir sunucu kullanın.

Harita aşaması, tüm giriş verilerini çıkış anahtarıyla bölmek zorundadır. Çıkış anahtarıyla ilişkili çıkış değerini üretmek zorunda değildir (azaltma aşaması tarafından yapılır), ancak en fazla bir çıkış anahtarının değerine katkıda bulunmak için her bir giriş anahtarı değer çiftine benzersiz şekilde ataması gerekir. Veriler birbiriyle çok ilişkiliyse, harita azaltma sorunu çözemeyebilir. Öte yandan, çoklu harita / küçültme turları kullanmanız gerekebilir.

Veri dönüşümünüzü bir haritaya / küçültmeye nasıl dönüştürebileceğinizi bulamıyorsanız, o zaman elbette bu bir çözüm değildir.

Bir problemin Map / Reduce'un idare edebileceği bir şeye ayrılıp çözülmeyeceğini bulmak için gerçek bir sanat var. Örneğin v1 ve v2, giriş veya çıkış veri setlerinde hiç olmayabilir. Girdi verilerindeki benzersiz öğeleri saymak istiyorsanız, k1 = k2 = bir öğe ve v1 = v2 = 1 veya 0 veya gerçekten bir şey. Azalt, yalnızca v3'ü, verilen k2 sayısının toplamı olarak üretir.

Bu nedenle, bir veri dönüşümünün Map / Reduce kullanılarak yapılamayacağından emin olmak zor, ancak yukarıdakiler size bazı öneriler sunuyor.


3

MapReduce, bir soyutlama düzeyinde tam olarak 2 fonksiyondan oluşan herhangi bir problem üzerinde çalışır. İlk işlev giriş kümesindeki her bir öğeye uygulanır ve ikinci işlev sonuçları toplar.

Böylece (n) girdilerinden (1) sonuç almak istediğinizde ve (1) işleviyle tüm girdiler incelenebilir / kullanılabilir, MapReduce kullanabilirsiniz. Yine, bu belirli bir soyutlama düzeyindedir. (1) işlevi, girişi kontrol eden ve hangisinin kullanılacağına karar veren bazı gruplandırma işlevleri olabilir.

Bu, ne kadar girdiye sahip olduğunuzu önceden bilmediğinizde, işin gizli "birimleri" ni paylaşmanız gerektiğinde veya sonucun tamamını temsil etmek için tek bir geri dönüş istediğinizde (IE beş bin ünite testi yapıyorsa) kullanışlıdır. , ve% x'den az başarısız olursa, başarı döndürür).


3

Buradaki cevapların çoğu, haritanın ne azalttığını, hangisinin geçerli olduğunu açıklamanın bir çeşitlemesi gibi görünüyor. Ancak hangi modelin harita azaltmayı kullanabileceğinizi işaret edebileceği sorusunu yanıtlamak, aslında bununla ele alınmıyor.

Eğer saf, işlevsel olmayan, aradığınız problemin uygulanması, bir şeyin üstünden ilmek atmak ve sonra ilmek dışından bir durum içeren bir durumun güncellenmesini içeriyorsa, olasılıklar haritayı azaltacak iyi bir bağlantıya sahip olursunuz. Özellikle de, merkezi durumun sadece iki parametreyle çalışan bir fonksiyonla güncellenmesini genelleştirebiliyorsanız ve bu fonksiyonun değişmeli ve birleştirici olduğunu garanti edebiliyorsanız.

Eğer bu doğruysa, haritayı kullanmak isteyebilecek olmanızın nedeni iki katlıdır: 1) Haritaya bir şey sokarsanız ve işlevleri azaltırsanız test etmek ve hata ayıklamak daha kolay olabilir. 2) Harita azaltma işlevleri durumsuzdur ve eşzamanlı olarak çalıştırılabilir; bu, birden fazla cpus varsa ve bunları küme içinde çalıştırmak için kullanan hadoop veya spark gibi bir şey varsa hızlandırabilir.

Çok fazla şey üzerinde döngü yapıyorsanız bu çok güzel ancak kilometreniz haritanızın / küçültmenin ne kadar karmaşık olduğuna bağlı olarak değişebilir. Sonunda her şeyin hala zincirin sonunda bazı karmaşık azaltma adımlarında tıkandığı sıralı bir zincir veya harita küçültme ağacıyla sona ermek oldukça yaygındır. Örneğin, birçok grafik algoritmasının sadece harita azaltma ile verimli bir şekilde ölçeklendirilmesi zordur.

Harita azaltma ile iyi çalışan en basit örnek, çok ucuz bir azaltma olan şeyleri saymaktır. Bu nedenle kelime sayımı harita azaltmada sıkça kullanılan bir örnektir. Bu usecase ile performans için doğrusal ölçeklenebilirlik bekleyebilirsiniz: eklediğiniz her cpu daha hızlı hale getirir.


2

Çok fonksiyonel programlama yaparsanız, genel bir harita gerektiren ve azaltan durumlarla karşılaşmaya başlarsınız. Muhtemelen onları zorunluluk programlarında bile görüyorsunuz, ancak bunları döngü ve akümülatör maskesinin arkasında tanımıyorsunuz.

Son zamanlarda bana gelenlerden birine örnek olarak Haskell'de bir ayrıştırıcı üzerinde çalışıyorum. Ayrıştırıcımı test etmek için, ayrıştırıcı aracılığıyla dize parçalarının bir listesini pompalarım ve sonra doğru ayrıştırılıp ayrılmadığını görmek için sonuçlarımın çıktısını alabileceğim tek bir dize elde etmek istiyorum. Öyle görünüyor ki:

--my initial set of test data, a list
tests = ["string1", "string2", "string3", ...]

--Map Step: turn strings into parsed results
--note the type, which demonstrates the map
applyParser :: [String] -> [Token]
--The actual function
applyParser input = map parser input

--Second map, turn tokens into output
showTokens :: [Token] -> [String]
showTokens t = map show t

--Reduce step, concat the results
combineResults :: [String] -> String
--In haskell, reduce is the foldl function, which takes an operation to fold with, a starting element, and a list to fold on
combineResults strings = foldl concat "" strings

--Finished program
testParser = print (combineResults(showTokens(applyParser tests)))

Tabii ki, bu sadece pedagojik. Benim gerçek kod (gibi biraz farklı görünüyor ve daha iç fonksiyonlarını kullanır fold concatHaskell zaten içerdiğinden gerekli değildir unlinesyaptığı [String]->String). Asıl amacım, başladığımda bir harita kullanmayı / küçültmeyi beklemiyor olmamdı, sadece ihtiyaçlarıma uyuyordu. Listeleri olan bazı şeyler yapmak istedim, sonra listemi tek bir çıktı elemanına dönüştürdüm. Harita kullanımı / azaltma doğal olarak ortaya çıktı.

Dize işleme (ayrıştırma gibi) harita azaltmanın çok açık bir kullanımıdır, haritalama giriş metni üzerinde çeşitli dönüşümlerin uygulanmasıdır ve sonuç metnini tekrar çıktı olarak bir araya getirerek azaltmaktadır. Benzer şekilde, bir derleyici, Özet Sözdizimi Ağacı öğeleri akışını daha iyi bir forma dönüştürmek için (katlama) katlama kullanarak benzer olabilir.


1

Paralelleştirilebilir mi?

Paralelleştirilebilir herhangi bir sorun, esasen harita ve katlamadır; tersine, harita adımı doğası gereği paralelleştirilebilir (ve katlama adımı, katlandığı yapıya bağlı olarak olabilir), bu nedenle bu iki yönlü bir özelliktir.


3
Bu sadece utanç verici paralel problemler için geçerlidir. Son derece paralelleştirilebilecek, ancak basit bir MapReduce'un etkili olamayacağı öğeler arasında yeterli etkileşim içeren birçok sorun var.
Mark Booth,

bağlantı için teşekkürler, utanç verici paralell terimi hakkında bilmiyordum. Tüm harita, çözülebilir sorunları utanç verici şekilde paralellikten kurtarmıyor mu?
Paul Sanwald

1
Tümünün azaltma kısmına ihtiyaç duymayan utanç verici derecede paralel birçok sorun var.
Donal Fellows,

1

Bir sunucu kümesi aradığınızı ve birisinin o anda yanıt veremediğini varsayalım. MapReduce'un yapacağı şey, bu ağaç düğümüne daha büyük Haritaya erişemediği için daha sonra yeniden ayarlayacağı ve sonra Harita ya da Küçült'ü gerçekleştireceğidir. Temel olarak, tüm bilgilerin ortamlardaki yazılım ve donanımın tahmin edilemezliği ile mümkün olduğunu garanti etmeye çalışır.


1

MapReduce'u kullanma (ya da kullanma) kararını vermek için kullandığım başlıca sorular:

  • Minimum bir programcı çabası ile makul paralel uygulama performansı elde etmek belirli bir problem için önemli midir?
  • Çok sayıda (yüzlerce) paralel yürütme elemanım var mı?
  • Paralel yürütme elemanları arasında mükemmel bir iletişim bant genişliği / verimi var mı?
  • Çok büyük miktarda veriyi (TB) işlemeye ihtiyacım var mı?
  • Çözmeye çalıştığım sorun Haritaya Ayrış ve Çalışmayı Azalt işlemine ayrılıyor mu?

    • Harita: Aynı işlemi tüm verilerde yürütün.
    • Küçült: Map tarafından üretilen her veri grubunda aynı işlemi uygulayın.

1

Aslında, bu genel bir "böl ve yönet" kalıbıdır, böylece hesaplamayı dağıtmak için çözümler genel olarak yazılabilir.

basit bir örnek büyük bir belge gibidir. Sorun şu ki, bu belgedeki harf sayısını saymak istiyorsunuz. tek bir makinede çalışmak yerine, belgedeki tüm kelimelerin bir dizisine parçalayabilirsiniz. daha sonra her bir kelimeyi ayrı ayrı işleyebilir ve sonuçları tekrar bir araya getirebilirsiniz.

Bu model kullanışlıdır, çünkü genel bir harita elde ettikten / uygulamayı azalttığınızda, aynı yazılım katmanını kullanarak herhangi bir sorunu çözebildiğiniz zaman, probleminizi sadece ifade etmeniz yeterli olacaktır.

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.