Yanıtlar:
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.
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.
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.
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.
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:
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:
Bir ya da iki sunucuda sırayla çalıştırarak başlamak için çok fazla veri varsa, çok uzun sürer ve
Çı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
İ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.
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).
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.
Ç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 concat
Haskell zaten içerdiğinden gerekli değildir unlines
yaptığı [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.
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.
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.
MapReduce'u kullanma (ya da kullanma) kararını vermek için kullandığım başlıca sorular:
Çözmeye çalıştığım sorun Haritaya Ayrış ve Çalışmayı Azalt işlemine ayrılıyor mu?
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.