Jingdong Akıllı Tedarik Zinciri Tahmininde Spark Teknolojisinin Uygulanması

Yazar Yang Dongyue Guo Jingzhan

Düzenle Xiaozhi

Bu makale JDnin akıllı tedarik zinciri ve tahmin teknolojisinin rolünü, tahmin sisteminin iş ve teknik mimarisini ve çekirdek sistemde Spark kullanımını tanıtacak. Son olarak, yazarın "Illustrated Spark: Core Technology and Case Practice" kitabıyla birleştirilecek. Tahmin sistemine uygulamayı ve optimizasyonu tanıtın.

Arka plan tanıtımı

Bir süre önce, JD.com ikinci on iki yıllık dönem için stratejik planını açıkladı ve JD.com'un tamamen teknolojik hale geleceğini, yapay zeka ve robotik otomasyon teknolojisini güçlü bir şekilde geliştireceğini ve geçmişte geleneksel yöntemlerle oluşturulan avantajları tamamen yükselteceğini belirtti. JDnin Y bölümü kuruldu. Bölüm, perakende satış hizmetine odaklanacak ve akıllı tedarik yeteneklerinin oluşturulmasına odaklanacak. Temel misyon, perakende inovasyonunu desteklemek için yapay zeka teknolojisini kullanmaktır.

JD'nin tedarik zinciri

Şu anda JD.com, ülke çapında, işlevlerine göre RDC, FDC, hantal merkezi depo, büyük uydu deposu, kitap deposu, şehir deposu vb. Olarak bölünebilen 256 büyük depo işletmektedir. RDC (Bölgesel Dağıtım Merkezi), birinci seviye depo olarak anlaşılabilecek bölgesel bir dağıtım merkezidir.Tedarikçilerden satın alınan mallar önce buraya gönderilir.Genellikle merkezi şehirlerde kurulur ve geniş bir alanı kapsar. FDC (İleri Dağıtım Merkezi), bazı küçük ve orta ölçekli şehirleri ve uzak bölgeleri kapsayan ikincil bir depo olarak anlaşılabilecek bölgesel bir operasyon merkezidir.Genellikle talebe göre RDC'den ürünler dağıtır.

Yapay zeka ve büyük veri gibi teknolojileri birleştiren JD.com, öncelikle tedarikçiden RDC'ye makul miktarda mal satın alıyor, daha sonra gerçek ihtiyaçlara göre FDC'ye dağıtıyor, ardından müşteriye en yakın dağıtım istasyonuna nakliye yapıyor ve son olarak kurye malları müşteriye getiriyor. . Bu, JDnin tedarik zinciri sistemindeki yaygın bir senaryodur, ancak bu sistem nedeniyle, JDnin kullanıcılara yanıtı büyük ölçüde iyileştirildi ve kullanıcı deneyimi büyük ölçüde iyileştirildi.

JD Tedarik Zinciri Optimizasyonu

Kullanıcı deneyiminin iyileştirilmesine ayrıca büyük miktarda sermaye yatırımı ve maliyet artışı da eşlik eder.Maliyet, tüm sistemin değeri maksimize edebilmesi için kontrol edilmelidir.Bu nedenle tedarik zincirinin optimizasyonu çok önemlidir.

Optimizasyon aslında bir operasyonel araştırma problemidir.Maksimum faydayı elde etmek için çeşitli karar verme hedeflerinin nasıl dengeleneceğini düşünmek gerekir.Bu süreçte birçok konunun göz önünde bulundurulması gerekir.Bunlar net olarak düşünülürse problem kolayca çözülebilir. Birkaç basit örnek verin:

  • Emtia ikmali: Hangi RDC'nin hangi ürünü satın alacağını ve satın alma hacmini ne zaman alacağınızı düşünün.

  • Emtia tahsisi: Hangi emtianın hangi FDC'ye ne zaman tahsis edileceğini ve tahsis tutarının ne olduğunu düşünün.

  • Depolama operasyonları: Büyük promosyon geldiğinde, depolara ve dağıtım istasyonlarına kaç iş gücü ve kamyon eklenecek?

Bu soruların cevaplanması kolay gibi görünse de, bunu düşündükten sonra cevabı vermek zor çünkü kesin olmanın o kadar kolay olmaması.Örneğin ikmalleri ele alalım, çok fazla ikmal stoku artıracaktır. Maliyet Çok az ikmal stokta kalmama maliyetini artıracaktır. Yalnızca makul yenileme en düşük maliyeti sağlayabilir.

JD'nin tedarik zincirinde tahmin teknolojisinin rolü

Makine öğrenimi, büyük veri ve diğer ilgili teknolojilerin yardımıyla JD.com, birçok tedarik zinciri optimizasyonu sorununda sistematik hale geldi.Sistem, optimizasyon önerilerini otomatik olarak verir ve tam süreç otomasyonu elde etmek için üretim sistemine bağlanır. İşte hayati bir düşük seviyeli destekleyici rol tahmin teknolojisi oynayan bir teknoloji. Kaba tahminlere göre, tahmin doğruluğundaki% 1'lik bir artış, işletme maliyetinden birkaç kat tasarruf sağlayabilir.

Tedarik zinciri optimizasyonunda tahminin rolü nasıl anlaşılır? Örnek olarak ürün ikmalini ele alalım. Deponun stokta kalmamasını sağlamak için, bir şirket sık sık tedarikçilerden çok sayıda mal ikmal edebilir. Bu stokta kalmayacak olsa da, Depoda daha fazla satılamaz mal birikmesine, dolayısıyla malların devir hızının düşmesine ve stok maliyetlerinin artmasına neden olacaktır. Tersine, bu şirket sıfır envanter peşinde birkaç ürünü ikmal edebilir, ancak bu, spot oranını düşürecek, kullanıcı deneyimini ciddi şekilde etkileyecek ve kıtlık maliyetini artıracak ciddi kıtlıklara neden olabilir. Bu nedenle, kaç ürünün ikmal için uygun olduğu ve bunları ne zaman ikmal edeceği sorusu ortaya çıkar, bunun tartılması ve dikkate alınması gerekir Nihai hedef, stok maliyetleri ile stok dışı maliyetler arasında bir denge sağlamaktır.

Olağanüstü durumu göz önünde bulundurun, malları yenilemeden önce envanterin sıfıra düşmesini bekleyin Bu sırada tedarikçi, stok yenileme bildirimini aldıktan sonra malları depoya gönderecektir. Ancak bununla ilgili bir sorun var çünkü teslimat süreci zaman alıyor ve bu süre zarfında depo stokta yok. Ne yapmalıyız Tahmine dayalı teknoloji kullanın. Öngörüyü kullanarak, malların ileride nakledildiği süre boyunca yaklaşık satış hacmini hesaplayabilir ve ardından deponun bu tutarı garanti etmesine izin verebiliriz.Miktar bu miktardan düşükse tedarikçiye bir ikmal bildirimi vereceğiz, böylece sorun çözülür. Sonuç olarak, tahmin teknolojisi burada önemli bir rol oynadı ve kilit bir bağlantı haline geldi.

Jingdong Tahmin Sistemi

Tahmin Sistemine Giriş

Tahmin sistemi, tüm tedarik zinciri sisteminin altında yer alır ve destekleyici bir rol oynar. Üst düzeyde birden fazla karar verme optimizasyon sistemini destekler ve bu karar verme optimizasyon sistemleri, en iyi kararları almak için operasyon araştırma teknikleriyle birlikte doğru tahmin verilerini kullanır. Ve sonuçları doğrudan kullanım için üst düzey iş yürütme sistemine veya iş tarafına sağlayın.

Şu anda, tahmin sistemi temel olarak üç ana işletmeyi desteklemektedir: satış tahmini, tek hacim tahmini ve GMV tahmini. Bunlar arasında, satış tahmini esas olarak emtia ikmalini ve emtia tahsisini destekler; tek miktar tahmini esas olarak depoların ve sahaların işletimini ve yönetimini destekler; GMV tahmini esas olarak satış departmanı planlarının özelleştirilmesini destekler.

Farklı boyutlara göre satış tahminleri RDC tedarik tahminleri, FDC tahsis tahminleri, şehir depo tahsis tahminleri, büyük depo ikmal tahminleri, global alımlar ve satış tahminleri ve kitap promosyon tahminleri olarak ayrılabilir; birim hacim tahminleri ayrıca depo sipariş hacmi tahminlerine bölünebilir, Dağıtım merkezi sipariş miktarı tahmini ve dağıtım istasyonu sipariş miktarı tahmini vb. (Burada "sipariş miktarı", kullanıcı tarafından verilen sipariş miktarını değil, siparişin bölünerek depoya aktarılmasının ardından sipariş miktarını ifade eder. Örneğin, bir kullanıcının siparişi şunları içerir: İki büyük kalem ve bir küçük kalem dahil olmak üzere üç kalem JD.com'un tedarik zinciri bağlantısında, büyük kalemlerden ikisi tek bir sipariş olarak büyük kalem ambarına, küçük kalem ise tek bir siparişle yerleştirilebilir. Küçük bir depoya yerleştirildiğinde, sipariş miktarı, siparişin bölünmesinden sonraki miktarı ifade eder); GMV tahminleri, ürünün ayrıntı düzeyini destekler.

Tahmin sistemi mimarisi

Yukarıdan aşağıya genel mimari şudur: veri kaynağı giriş katmanı, temel veri işleme katmanı, çekirdek iş katmanı, veri çıkış katmanı ve aşağı akış sistemleri. Öncelikle ihtiyaç duyduğumuz iş verilerini harici veri kaynaklarından elde edin, ardından temel verileri işleyip temizleyin, ardından verileri zaman serileri ve makine öğrenimi gibi yapay zeka teknolojileri ile işleyip analiz edin ve son olarak tahmin sonuçlarını hesaplayarak Aşağı akış sistemleri tarafından kullanılır.

Veri kaynağı giriş katmanı: Jingdong veri ambarı, sipariş bilgileri, ürün bilgileri, envanter bilgileri vb. Gibi ihtiyaç duyduğumuz iş verilerinin çoğunu depolar. Promosyon planı verilerine gelince, çoğu satış personelinin Web sistemi üzerinden girdiği bilgilerden gelmektedir. Ek olarak, verilerin küçük bir kısmı doğrudan metin biçiminde HDFS'ye yüklenir.

Temel veri işleme katmanı: Bu katmanda temel veriler ağırlıklı olarak Hive üzerinden işlenir ve temizlenir, gereksiz alanlar kaldırılır, gereksiz boyutlar filtrelenir ve sorunlu veriler temizlenir.

Temel iş katmanı: Bu katman, yatay olarak görüntülendiğinde üç katmana ayrılabilen sistemin temel parçasıdır: özellik oluşturma, tahmin algoritması ve tahmin sonucu işleme. Dikey olarak aralarında herhangi bir kesişme olmaksızın birden fazla iş kolundan oluşur.

  • Özellik oluşturma: Önceden temizlenmiş temel verileri, daha fazla işleme yoluyla standart format özellik verilerine dönüştürün ve sonraki algoritma modelleri için sağlayın.

  • Çekirdek algoritma: Satışları ve birim miktarlarını tahmin etmek için zaman serisi analizi ve makine öğrenimi gibi yapay zeka teknolojilerini kullanmak, tahmin sisteminin en temel parçasıdır.

  • Tahmin sonucu işleme: Tahmin sonucu, format ve bazı özel gereksinimler açısından aşağı akış sistemini karşılamayabilir, bu nedenle standart sapma ve terfi işaretleri gibi ek bilgilerin eklenmesi gibi fiili duruma göre işlenmesi gerekir.

Tahmin sonucu çıktı katmanı: Nihai tahmin sonuçlarını tekrar Jingdong veri ambarı, MySql, HBase ile senkronize edin veya diğer sistemler tarafından uzaktan arama için JSF arayüzü oluşturun.

Aşağı akış sistemi: Aşağı akış görev süreçlerini, aşağı akış Web sistemlerini ve diğer sistemleri içerir.

Tahmin sisteminin temel tanıtımı

Tahmin sistemi çekirdek katman teknolojisi seçimi

Tahmin sisteminin çekirdek katman teknolojisi temel olarak dört katmana ayrılmıştır: temel katman, çerçeve katmanı, araç katmanı ve algoritma katmanı.

Temel katman:

Veri depolama için HDFS, kaynak planlaması için Yarn ve BDP (Büyük Veri Platformu), JD.com tarafından geliştirilen bir büyük veri platformudur. Biz esas olarak görev planlaması için kullanıyoruz.

Çerçeve katmanı:

Esas olarak Spark RDD, Spark SQL ve Hive'a dayalıdır.MapReduce programı, orijinalden kalan küçük bir kısmı kaplar ve yavaş yavaş Spark RDD ile değiştirilir. Spark'ın seçimi, performansla ilgili hususlara ek olarak, Spark programı geliştirmenin yüksek verimlilik, çok dilli özellikleri ve makine öğrenimi algoritmaları için desteği de dikkate aldı. Spark geliştirme dili için aşağıdaki üç nedenden dolayı Python'u seçtik:

  • Python, kullanılabilecek pek çok iyi makine öğrenimi algoritma paketine sahiptir Spark'ın MLlib'ine kıyasla algoritma daha yüksek doğruluğa sahiptir. GBDT ile bir karşılaştırma yaptık ve xgboost'un MLlib'de sağlanan güçlendirilmiş ağaç modelinin tahmin doğruluğundan yaklaşık% 5 ~% 10 daha yüksek olduğunu bulduk. Spark'ın kendi makine öğrenimi çerçevesinin doğrudan kullanımı, geliştirme maliyetlerimizi azaltacak olsa da, tahminin doğruluğu bizim için çok önemlidir ve doğruluktaki her% 1'lik artış, maliyeti iki katına çıkarabilir.

  • Ekibimiz geliştirme mühendisleri ve algoritma mühendislerinden oluşur. Algoritma mühendisleri için veri analizi için Python'u kullanmakta daha iyidirler. Java veya Scala kullanmanın çok fazla öğrenme maliyeti olacaktır.

  • Diğer dillerle karşılaştırıldığında, Python kullanmanın geliştirme verimliliğinin en yüksek olduğunu ve yeni gelenler için Python öğrenmenin diğer dilleri öğrenmekten daha kolay olduğunu gördük.

Araç katmanı:

Bir yandan kendi işimize dayalı bazı algoritmalar geliştireceğiz, diğer yandan sektördeki daha olgun algoritmaları ve modelleri doğrudan kullanacağız.Bu algoritmalar üçüncü parti Python paketlerinde kapsüllenmiştir. Daha yaygın olarak kullanılan paketler xgboost, numpy, pandas, sklearn, scipy ve hyperopt'tur.

  • Xgboost: Gradient Boosting Machine'in bir C ++ uygulamasıdır. Xgboost'un en büyük özelliği, paralellik için CPU'nun çoklu iş parçacığını otomatik olarak kullanabilmesi ve aynı zamanda doğruluğu artırmak için algoritmayı iyileştirmesidir.

  • numpy: Python'un açık kaynaklı sayısal hesaplama uzantısıdır. Bu araç, büyük matrisleri depolamak ve işlemek için kullanılabilir ve Python'un kendi iç içe liste yapısından çok daha etkilidir (bu yapı, matrisleri temsil etmek için de kullanılabilir).

  • pandas: veri analizi görevlerini çözmek için oluşturulmuş NumPy'ye dayalı bir araçtır. Pandalar, büyük veri kümelerini verimli bir şekilde işlemek için gereken araçları sağlayan çok sayıda kitaplık ve bazı standart veri modelleri içerir.

  • sklearn: Sınıflandırma, regresyon, boyut azaltma ve kümeleme dahil olmak üzere dört makine öğrenimi algoritmasını destekleyen Python için önemli bir makine öğrenimi kitaplığıdır. Aynı zamanda üç modül içerir: özellik çıkarma, veri işleme ve model değerlendirme.

  • scipy: NumPy kütüphanesi temelinde matematik, bilim ve mühendislik hesaplamalarında yaygın olarak kullanılan birçok kütüphane fonksiyonunu ekler. Doğrusal cebir, sıradan diferansiyel denklemlerin sayısal çözümü, sinyal işleme, görüntü işleme ve seyrek matris vb.

Algoritma katmanı:

Kullandığımız birçok algoritma modeli var. Bunun nedeni, Jingdongun ürün kategorilerinin eksiksiz olması ve işin karmaşık olması ve farklı durumlara göre farklı algoritma modellerinin benimsenmesi gerektiğidir. Algoritma modeli ile ürün arasında eşleşen bir ilişki kurmak için bağımsız bir sistemimiz var Bazı daha karmaşık tahmin işletmelerinin de birden fazla model kullanması gerekiyor. Kullandığımız algoritmalar genel olarak üç kategoriye ayrılabilir: zaman serileri, makine öğrenimi ve iş geliştirme ile birleştirilmiş bazı benzersiz algoritmalar.

1. Makine öğrenimi algoritmaları temel olarak GBDT, LASSO ve RNN'yi içerir:

GBDT: Yinelemeli bir karar ağacı algoritmasıdır. Algoritma birden fazla karar ağacından oluşur ve tüm ağaçların sonuçları nihai cevabı vermek için bir araya getirilir. Bunu, satışları yüksek, ancak açık tarihsel yasaları olmayan ürünleri tahmin etmek için kullanıyoruz.

RNN: Bu ağın iç durumu dinamik zamanlama davranışı sergileyebilir. İleri beslemeli sinir ağından farklı olarak, RNN dahili belleğini rastgele zamanlama girdi dizilerini işlemek için kullanabilir, bu da zamanlama tahmini ve konuşma tanıma gibi işlemeyi kolaylaştırır.

LASSO: Bu yöntem bir sıkıştırma tahminidir. Bir ceza fonksiyonu oluşturarak daha rafine bir model elde eder, bu da bazı katsayıları sıkıştırmasını ve bazı katsayıları sıfıra ayarlamasını sağlar. Bu nedenle, alt küme küçülmesinin avantajı korunur ve çoklu bağlantı verilerini işlemek için önyargılı bir tahmindir. Düşük satış hacmini tahmin etmek için kullanılır ve sabit geçmiş verileri olan ürünler daha etkilidir.

2. Zaman serileri esas olarak ARIMA ve Holt kışlarını içerir:

ARIMA: Tam adı otoregresif integral hareketli ortalama modeldir. 1970'lerin başında önerilen iyi bilinen bir zaman serisi tahmin yöntemidir. Bunu esas olarak depo siparişleri gibi kararlı bir seriyi tahmin etmek için kullanıyoruz.

Holt winters: Üçlü üstel yumuşatma algoritması olarak da bilinen bu aynı zamanda klasik bir zaman serisi algoritmasıdır.Biz onu açık mevsimsellik ve eğilime sahip ürünleri tahmin etmek için kullanıyoruz.

3. İş geliştirme ile birleştirilmiş benzersiz algoritmalar arasında WMAStockDT, SimilarityModel, NewProduct, vb. Bulunur:

WMAStockDT: Envanter durumundan büyük ölçüde etkilenen ürünleri tahmin etmek için kullanılan envanter karar ağacı modeli.

SimilarityModel: Belirli bir ürünün gelecekteki satışlarını tahmin etmek için belirtilen benzer ürün verilerini kullanan benzerlik modeli.

Yeni Ürün: Adından da anlaşılacağı gibi yeni ürün modeli, yeni ürünlerin satışını tahmin etmek için kullanılır.

Tahmin sistemi çekirdek süreci

Temel tahmin süreci temel olarak iki kategori içerir: makine öğrenimi algoritmalarına dayalı süreç ve zaman serisi analizine dayalı süreç.

1. Makine öğrenimi algoritmalarına dayalı süreç aşağıdaki gibidir:

  • Özellik oluşturma: Veri analizi ve model testleri yoluyla ana özellikleri belirleyin ve bir dizi görev aracılığıyla standart formatlarda özellik verilerini oluşturun.

  • Model seçimi: Farklı emtiaların farklı özellikleri vardır, bu nedenle öncelikle emtiaların satış hacmi, yeni ürünler ve eski ürünler, sahte tatil hassasiyeti gibi faktörlere göre farklı algoritma modelleri tahsis edilecektir.

  • Özellik seçimi: Gerekli olmayan bir dizi özelliği filtreleyin Farklı ürün türlerinin farklı özellikleri vardır.

  • Örnek bölüm: eğitim verilerini birden fazla örnek grubuna gruplayın ve gerçek eğitim sırasında her örnek grubu için bir model dosyası oluşturun. Genel olarak, aynı türden ürünler, kategori boyutuna göre gruplama gibi gruplar halinde gruplanır. Bu, paralelleştirme ve model doğruluğunu dikkate almak için yapılır.

  • Model parametreleri: Optimum model parametrelerini seçin Uygun parametreler modelin doğruluğunu artıracaktır.Farklı parametre kombinasyonlarının ayrı ayrı eğitilmesi ve tahmin edilmesi gerektiğinden, bu adım çok kaynak gerektirir.

  • Model eğitimi: Model eğitimi, özellikler, modeller ve numuneler belirlendikten sonra yapılabilir.Eğitim genellikle uzun sürer.Eğitimden sonra bir model dosyası oluşturulur ve HDFS'de saklanır.

  • Model tahmini: Tahmin yürütme için model dosyasını okuyun.

  • Çoklu model seçimi: Tahmin doğruluğunu iyileştirmek için çoklu algoritma modelleri kullanabiliriz.Her modelin tahmin sonucu çıktı alındığında, sistem bazı kurallar aracılığıyla en uygun tahmin sonucunu seçecektir.

  • Anormal tahmin değeri yakalama: Algoritmayı açıklamak ne kadar karmaşık ve zor olursa, çok azının tahmin değerinin anormal derecede yüksek olma olasılığının o kadar yüksek olduğunu bulduk. Bu yüksek tahmin değeri, geçmiş verileri birleştirerek açıklanamaz, bu nedenle bu anormal değerleri kaldırmak için bazı kurallar kullanacağız Durdurun ve daha muhafazakar bir değerle değiştirin.

  • Model değerlendirme: Tahmin doğruluğunu hesaplamak için genellikle mapd'yi bir değerlendirme göstergesi olarak kullanırız.

  • Hata analizi: Algoritma optimizasyonu için bir referans sağlamak amacıyla farklı boyutlarda hata dağılımını elde etmek için tahminin doğruluğunu analiz ederek.

2. Zaman serisi analizine dayalı tahmin süreci aşağıdaki gibidir:

  • Geçmiş zaman serileri oluşturun: Geçmiş satışlardan, fiyatlardan, envanterden ve diğer verilerden önceden belirlenmiş bir formatta zaman serisi verileri oluşturun.

  • Tatil faktörü: Tatillerin satışlar üzerindeki etkisini yumuşatmak için tatiller ve satışlar arasındaki ilişkiyi hesaplayın.

  • Pazar faktörü: Pazar gününün satış hacmi üzerindeki etkisini yumuşatmak için pazartesiden pazara 7 gün ile satış hacmi arasındaki ilişkiyi hesaplayın.

  • Promosyon faktörü: Promosyonun satışlar üzerindeki etkisini yumuşatmak için promosyon ve satış arasındaki ilişkiyi hesaplayın.

  • Faktör yumuşatma: Geçmişteki satışlar istikrarsızdır ve tatillerden, promosyonlardan vb. Etkilenecektir. Bu durumda tahmin etmek çok zordur, bu nedenle geçmiş verileri düzeltmek için önceden hesaplanan çeşitli faktörleri kullanmak gerekir.

  • Zaman serisi tahmini: Nispeten istikrarlı bir satış verileri üzerinde algoritmalar aracılığıyla tahmin.

  • Faktör süperpozisyonu: tahmin sonuçlarını gelecekteki tatiller ve promosyon planları gibi faktörlerle birlikte ayarlayın.

Spark'ın tahmin çekirdek katmanında uygulanması

Program yazmak için Spark SQL ve Spark RDD'nin bir kombinasyonunu kullanıyoruz Genel veri işleme için Spark'ı diğerleriyle aynı şekilde kullanıyoruz, ancak model eğitimi ve tahmin için algoritma arayüzünü çağırması gereken mantığın paralelleştirmeyi dikkate alması gerekiyor. Sorun. Ortalama olarak, bir eğitim görevi tarafından bir günde işlenen veri miktarı yaklaşık 500G'dir.Veri boyutu özellikle büyük olmamasına rağmen, Python algoritma paketi tarafından sağlanan algoritmaların tümü tek bir işlemde yürütülür. Tüm kategori verilerini tek bir makine kullanarak eğitmek bir hafta sürerse, bunun kabul edilemez olduğunu hesapladık, bu nedenle paralel işlemeyi elde etmek için hesaplamaları birden çok düğüme dağıtmak için dağıtılmış bir paralel hesaplama çerçevesi olan Spark'ı kullanmamız gerekir. .

Uyguladığımız yöntem çok basittir.Önce, gerekli tüm Python paketlerini kümenin her bir düğümüne yüklememiz ve ardından verileri geri yüklemek için, Spark programını yazarken, groupByKey işlemi aracılığıyla kategori boyutu gibi belirli bir kuralla bölümlemeyi düşünmeliyiz. Bölme, her bölüm bir örnek kümesidir ve paralelleştirme sağlamak için bağımsız olarak eğitilmiştir. İşlem aşağıdaki şekilde gösterilmektedir:

Sözde kod aşağıdaki gibidir:

RepartitionBy yöntemi, bir (K, V) yapı RDD'sini döndürmek için yeniden bölümlenmiş bir mantık ayarlamaktır. Tren yöntemi eğitim verileridir ve Python algoritma paketi arayüzü tren yönteminde çağrılır. saveAsPickleFile, Spark Python'a özgü bir Action işlemidir.RDD'yi serileştirilmiş bir sequnceFile format dosyasına kaydetmeyi destekler.Serileştirme işlemi sırasında, model dosyalarını kaydetmek için çok uygun olan 10'luk gruplar halinde işlenecektir.

İlke basit olmasına rağmen, bir zorluk var, yani bölümlemek için hangi kuralların kullanıldığı ve anahtarın nasıl ayarlanacağı. Bu sorunu çözmek için, birkaç yönü göz önünde bulundurmamız gerekiyor: Birincisi, eğitim için hangi verilerin toplanması gerektiğidir ve ikincisi, veri çarpıklığının nasıl önleneceğidir.

İlk soru için aşağıdaki hususları yaptık:

  • Eğitimin etkisinin daha iyi olması için bir bölüme bölünen verilerin belirli bir benzerliği olmalıdır Örneğin, kategoriye göre bölümleme tipik bir örnektir.

  • Malların özelliklerini analiz edin ve özelliklerine göre farklı modeller seçin.Örneğin, çok satan ve az satan ürünlerin tahmin modelleri farklıdır.Aynı model bile farklı özellikler kullanabilir.Örneğin promosyonlara duyarlı ürünlerin değiştirilmesi gerekiyor. Özelliklerin çoğu promosyonlarla ilgilidir. Aynı modele ve aynı özelliğe sahip ürünler tek bir bölgede gruplanma eğiliminde olmalıdır.

İkinci sorunu çözmek için aşağıdaki yöntemleri uyguladık:

  • Aşırı veri hacmi olan bölümlerde rastgele örnekleme yapılır.

  • Aşırı veri hacmine sahip bölümler için ikinci bir bölme de yapabilirsiniz.Örneğin, kitap ve roman kategorisindeki veri hacmi diğer kategorilere göre önemli ölçüde daha büyüktür, bu nedenle roman kategorisi altındaki alt kategorilerin veri dağılımını analiz edebilir ve alt kategorileri yenileriyle birleştirebilirsiniz. Birkaç bölüm.

  • Veri miktarının çok küçük olduğu durumlarda, birkaç bölümün verilerini birleştirmeyi düşünmek gerekir.

Kısaca, son iki işleme yöntemi için tek bir Spark görevi periyodik olarak çalıştırılabilir ve bu bölümleme kuralı kaydedilebilir.

Uygulama ve optimizasyon için grafiksel Spark ile birleştirin

Not: "Illustrated Spark: Core Technology and Case Practical Combat" bu makalenin yazarı tarafından yazılmıştır.

"Illustrated Spark: Core Technology and Case Practical Combat" kitabı, Spark 2.0 temel alınarak yazılmıştır ve Spark çekirdeğini ve ekosistem bileşen teknolojilerini sistematik olarak tanıtır. İçeriği, iş planlaması, hataya dayanıklı yürütme, izleme yönetimi, depolama yönetimi ve işletim mimarisine odaklanan Spark ekosistemini, gerçek savaş ortamı inşası ve programlama modelini vb. İçerir.Ayrıca, Spark SQL geçici sorgusu da dahil olmak üzere Spark ekosisteminin ilgili bileşenlerini sunar. , Spark Streaming'in gerçek zamanlı akış işleme, MLlib'in makine öğrenimi, GraphX'in grafik işleme ve Alluxio'nun dağıtılmış bellek dosya sistemi vb. Aşağıda, JD tahmin sisteminin kaynak planlamasını nasıl gerçekleştirdiği açıklanmakta ve sistem optimizasyonu için ilgili bilgileri depolamak üzere Spark'ın nasıl kullanılacağı açıklanmaktadır.

Uygulamayı sistemde birleştirin

Illustrated Spark kitabının altıncı bölümü, Spark işletim mimarisini açıklar ve Spark kümesi kaynak planlamasının genellikle iki moda bölündüğünü sunar: kaba taneli zamanlama ve ince taneli zamanlama. Kaba taneli işlem modu, bağımsız işlem modunu ve Mesos kaba taneli işletim modunu içerir. Bu durumda, tüm makine, işi yürütmek için tahsis birimi olarak kullanılır. Bu modun avantajı, kaynakların uzun süreli tutulmasının, kaynak planlamasının ek yükünü azaltmasıdır. Dezavantajı, bu moddur. Kaynak kullanımındaki değişiklikleri algılayamamak, sistem kaynaklarının boşta kalmasına neden olarak kaynak israfına neden olmak kolaydır.

İnce taneli işlem modu, İplik işlem modunu ve Mesos ince taneli işlem modunu içerir.Bu modun avantajı, sistem kaynaklarının tam olarak kullanılabilmesidir. Dezavantaj, bu moddaki her görevin yöneticiden kaynak alması gerekmesi ve programlama gecikmesinin nispeten büyük olmasıdır. Büyük.

Jingdong Spark kümesi temel bir platform olduğundan ve bu kaynakları şirket içinde paylaştığından, küme, farklı sistemlerin ihtiyaç duyduğu kaynaklara göre esnek bir şekilde yönetilebildiği Yarn işletim modunu benimser. YARN-Cluster modunda, bir kullanıcı YARN kümesine bir uygulama gönderdiğinde, YARN kümesi uygulamayı iki aşamada çalıştırır:

İlk aşama, Spark'ın SparkContext'i YARN kümesinde Uygulama Yöneticisi olarak başlatmaktır; ikinci aşama, Uygulama Yöneticisi tarafından bir uygulama oluşturmak, ardından bunun için Kaynak Yöneticisinden kaynaklara başvurmak ve aynı anda görev kümesini çalıştırmak ve izlemek için Yürütücüyü başlatmaktır. Operasyon tamamlanana kadar tüm operasyon süreci. Aşağıdaki şekil İplik Kümesi çalışma modunun uygulama sürecini göstermektedir:

Sistem optimizasyonunu birleştirin

Hepimiz büyük veri işlemenin darboğazının IO olduğunu biliyoruz. Spark'ın yardımıyla, MapReduce'un diske yazılmasından neredeyse iki büyüklük sırası daha hızlı olan yinelemeli işlemdeki verileri bellekte depolayabiliriz; ayrıca, veri işleme süreci için mümkün olduğunca Shuffle'dan kaçının.Eğer önlenemezse, azaltmak için Shuffle'dan önce verileri olabildiğince filtreleyin Veri hacmini karıştırın; son olarak, verimli serileştirme ve sıkıştırma algoritmalarını kullanın. Jingdong tahmin sistemi esas olarak bu bağlantılar etrafında optimize edilmiştir. Kıvılcım depolama ilkeleri ile ilgili bilgiler için lütfen Illustrated Spark kitabının 5. Bölümündeki ayrıntılı açıklamaya bakın.

Kaynak kısıtlamaları nedeniyle, tahmin sistemine tahsis edilen Spark kümesinin boyutu çok büyük değildir Spark uygulamalarını sınırlı kaynaklar altında çalıştırmak gerçekten bir testtir, çünkü bu durumda genellikle program hesaplama süresinin çok uzun olması ve bulunamaması gibi durumlar vardır. Yürütücü ve diğer hatalar. Parametreleri ayarlayarak, tasarımı değiştirerek ve program mantığını değiştirerek optimize ediyoruz:

Parametre ayarı

  • Uygulayıcı sayısını azaltın ve yürütme belleğini artırın Bunun amacı, Yürütücünün kullanmak için yeterli belleğe sahip olmasını ummaktır.

  • Günlüğü kontrol edin ve yayın değişkenlerini depolamak için yeterli alan olmadığını tespit edin Analiz, Önbellekten belleğe kadar çok fazla verinin belleği tükettiğidir, bu nedenle Önbellek düzeyini MEMORY_ONLY_SER ve DISK_ONLY olarak uygun şekilde ayarladık.

  • Spekülasyon mekanizması bazı görevler için kapatılmıştır, çünkü bazı görevler geçici olarak çözülemeyen veri çarpıklığı problemlerine sahip olacaktır, bunlar düğüm problemleri değildir.

  • Bellek ayırmayı ayarlayın.Çok sayıda Shuffle içeren bir görev için, Cache'nin bellek ayırma oranını düşürecek ve Shuffle'ın bellek oranını artıracağız.

Tasarımı değiştirin

Parametreleri ayarlamak kolay olsa da, etki genellikle iyi değildir. Şu anda, bir tasarım açısından optimize etmeyi düşünmeniz gerekir:

  • Başlangıçta, eğitim verilerinden önce, birkaç aylık ve hatta yıllık geçmişe ait veriler okunacak ve nihayet karakteristik verileri oluşturmak için verilerin birleştirilmesi ve dönüştürülmesi gibi bir dizi karmaşık işlem gerçekleştirilecektir. Büyük miktarda veri nedeniyle, görevler bazen hataları bildirir. Ayarlamadan sonra sadece günün verileri aynı gün işlenecek ve sonuçlar günün bölümü altında saklanacaktır.Eğitim sırasında gün sayısına göre birleştirme işlemi için birden çok bölümün verilerini okumanız gerekmektedir.

  • "Model eğitimini" günlük uygulamadan haftalık uygulamaya ayarlayın ve "model parametre seçimini" haftalık uygulamadan aylık uygulamaya ayarlayın. Bu iki görev çok yoğun kaynak gerektirdiğinden ve sık sık çalıştırılması gerekmediğinden, doğruluk biraz azalacak olsa da, her ikisi de kabul edilebilir bir aralıktadır.

  • Yetersiz kaynak sorunu, görevleri bölerek de çözülebilir. Yatay olarak bölünebilir Örneğin, başlangıçta 100 veri kategorisi eğitim için tek bir göreve yerleştirildi ve ayarlamadan sonra, eğitim için her 10 kategori için bir Spark işi göndermek üzere değiştirildi. Bu şekilde, genel yürütme süresi uzasa da, programın anormal çıkışı önlenir ve görev başarıyla yürütülebilir. Yatay bölmeye ek olarak, dikey olarak da bölünebilir, yani 10 aşamalı bir Spark görevi iki göreve bölünür, her görev 5 aşama içerir ve ara veriler HDFS'de depolanır.

Program mantığını değiştirin

Programın çalışma verimliliğini daha da iyileştirmek için, performans, programın mantığını değiştirerek, özellikle şu yönlerden iyileştirilir: çok fazla karıştırmadan kaçınmak, karıştırma sırasında iletilmesi gereken verileri azaltmak ve veri çarpıklığı sorunlarını ele almak.

1. Çok fazla Karıştırmaktan kaçının

Spark, her türlü karmaşık veri işleme görevini tamamlamamıza olanak tanıyan çok sayıda dönüştürme işlemi sağlar, ancak bu nedenle, Spark programlarını yazarken kodu basit ve aşırı derecede RDD'ye bağımlı hale getirmek için bir tuzakla karşılaşabiliriz. Dönüştürme işlemi, başlangıçta yalnızca bir kez değiştirilmesi gereken Shuffle işleminin birden çok kez yürütülmesini sağlar. Bir kez böyle bir hata yaptık, ancak groupByKey tarafından bir kez yapılabilecek bir işlem için iki kez kullandık.

İş mantığı şu şekildedir: üç tablomuz var: satış (lar), fiyat (p), envanter (v), her tabloda 3 alan var: ürün kimliği (sku_id), kategori kimliği (kategori) ve geçmiş zaman serisi verileri (Veri), şimdi s, p, v verilerini sku_id ile birleştirmeniz ve ardından kategoriye göre yeniden birleştirmeniz gerekir, son veri formatı :. Başlangıçta ilk olarak anahtar olarak sku_id + kategorisine göre groupByKey'i gerçekleştiriyoruz, veri formatını buna dönüştürüyoruz, ardından anahtar olarak kategoriye ve ardından tekrar groupByKey'e basıyoruz.

Daha sonra, groupByKey'i yalnızca bir kez gerçekleştirmek için kategoriyi anahtar olarak kullanmak üzere değiştirdik, çünkü bir sku_id yalnızca bir kategoriye aittir, bu nedenle sonraki harita dönüşümünün yalnızca aynı sku_id'nin s, p ve v verilerini gruplamak için bir kod yazması gerekir. GroupByKey'nin durumu iki kez:

Değişiklikten sonra groupByKey olur:

Birden çok tabloyu birleştirirken, anahtar değerleri aynıysa, union + groupByKey + flatMapValues biçimini kullanabilirsiniz. Örneğin, satış hacmi, envanter, fiyat, promosyon planı ve ürün bilgilerinin ürün kodu aracılığıyla birbirine bağlanması gerekir Başlangıçta, birleştirme dönüştürme işlemi birkaç RDD'yi bir araya getirmek için kullanılır. Daha sonra, bu işlemin hızının çok yavaş olduğunu fark ettim, bu yüzden union + groypByKey + flatMapValue formuna geçtim.Bu sadece Shuffle'ı bir kez gerçekleştirmeli, bu nedenle değiştirilen işlem hızı öncekinden çok daha hızlı. Örnek kod aşağıdaki gibidir:

GroupByKey'den sonra iki RDD'nin birleştirilmesi gerekiyorsa, bunun yerine ortak grup dönüştürme işlemi kullanılabilir. Örneğin, geçmiş satış verilerini kategoriye göre birleştirmek ve ardından model dosyasını birleştirmek için süreç aşağıdaki gibidir:

Ortak grup kullanıldıktan sonra, bir Karıştırma işleminden sonra iki aşamalı bir işlem tamamlanabilir ve performans büyük ölçüde iyileştirilir.

2. Shuffle sırasında aktarılan veri miktarını azaltın

  • Karıştırma işleminden önce gereksiz verileri filtrelemeyi deneyin.

  • Herhangi bir karmaşık toplama mantığını verimli bir şekilde uygulamak için comebineyeByKey'i kullanın.

ComebineyeByKey bir toplama işlemidir. Harita tarafı toplamayı desteklediğinden, groupByKey'den daha iyi performansa sahiptir. Ayrıca haritası ve azaltma tarafları farklı mantığa ayarlanabildiğinden, lessByKey'den daha fazla senaryoyu destekler. Tanımı aşağıdaki gibidir:

educeByKey ve groupByKey aslında comebineyeByKey'i dahili olarak çağırır,

Daha önce azaltmaByKey ile gerçekleştirilemeyen, hepsi groupByKey tarafından tamamlanan çok sayıda karmaşık toplama mantığımız vardı. Daha sonra hepsini comebineyeByKey ile değiştirdikten sonra, performans çok gelişti.

3. Veri çarpıklığıyla başa çıkın

Bazen bir dizi dönüştürme işleminden sonra veriler çok çarpık hale gelir.Bu durumda, sonraki RDD hesaplama verimliliği çok kötü olur ve program ciddi durumlarda bir hata bildirir. Bu durumda, yeniden bölümlemenin dönüştürme işlemi genellikle RDD'yi yeniden bölümlemek için kullanılır.Yeniden bölümlemeden sonra, veri çarpıklığını önlemek için veriler farklı bölümlere eşit olarak dağıtılacaktır. Birleştirme kullanarak bölmeyi azaltmaksa, etki de elde edilebilir, ancak yeniden bölümlemenin eksikliği, dağılımın o kadar tekdüze olmamasıdır.

Sonuna yaz

JDnin tahmin sistemi uzun süredir istikrarlı bir şekilde çalışıyor olsa da, sistemin kendisinde hala iyileştirilmesi gereken birçok alan olduğunu görüyoruz. Ardından, tahmin doğruluğunu iyileştirecek, sistem performansını optimize edecek ve birden çok hizmeti destekleyeceğiz. Geliştirilmiş rahatlık. Gelecekte, JDnin tedarik zinciri yönetiminde büyük veri ve yapay zeka teknolojisinin kullanımının artmasıyla birlikte, tahmin sistemi de daha büyük bir rol oynayacak. JDnin tahmin sisteminin araştırılması ve geliştirilmesi de zorluklarla dolu ve eğlenceli olacak.

Makalenin sonunda gizli faydalar

Geleneksel endüstriler yenilikçi teknolojilerle karşılaştığında, ne tür kıvılcımlarla çarpışacaklar? Yenilikçi teknolojiler geleneksel endüstrilere girdiğinde, hangi değeri üretecekler? Teknoloji işletmelere 10.000 kat iş büyümesini nasıl sağlayabilir?

G + Küresel Teknoloji Değer Zirvesi , 19 Nisan, Pekin. JD Lifetime Fahri Teknik Danışmanı Li Üniversitesi, Ping An Teknoloji COO'su ve CTO'su Hu Wei, Ant Financial Global Teknik İşbirliği ve Geliştirme Genel Müdürü Gui Pu ve diğer endüstri liderleri ile birlikte geleneksel kurumsal İnternet dönüşümünün sıkıntılı noktalarını ve deneyimlerini ortaya çıkarmak için.

Daha fazlasını öğrenmek için "Orijinali oku" dürtün!

Bugün önerilen numara

Büyük veri konuşması

Büyük verilere ve makine öğrenimine odaklanıyoruz, her gün yüksek kaliteli makaleler, teknik vakalar ve diğer orijinal kuru ürünler yayınlıyoruz. Sosyal mikro sınıflar da var ve umarım buradan en yeni teknolojileri paylaşabilir ve derinlemesine fikir alışverişinde bulunabilirsiniz.

WeChat Kimliği: BigdataTina2016

Bugünün Tavsiyesi

Okumak için aşağıdaki resme tıklayın

Programcı, istediğiniz teknik lider bu mu?

Hattatlar, sıradan insanların kapısına Bahar Şenliği beyitlerini ve kutsamalarını gönderirler.
önceki
"Karşı adamla evlenmek için Yanlış Sedan sandalyesindeki" yaşlı kadın "Bund Bell" de "çapraz fare" oluyor.
Sonraki
Kasım 2016'da Hong Kong sunucusu PS + üyeleri için ücretsiz oyunlar
Faye Wong arkadaşlarıyla mutlu bir akşam yemeği yedi, ancak davranışları netizenler tarafından kraliçe gibi görünmediğini söyledi
İPhone'da az bilinen ipuçları, ancak mutluluğu önemli ölçüde artırabilir
Jinshanling Çin Seddi'nde "Moğol Grubu Düğünü" Görüldü
315 partisinde bahsedilen yüz tanıma teknolojisinin uygulamaları nelerdir?
Kayıp Behemoth - "Yıldız Vatandaşı" nın Engebeli Yolu (3)
TVB erkek yıldızları soğuk ve yaşlılığa dayanıklı mı? 51 yaşındaki Wei Junjie iki yaşında.
Xiangxi: İlk "Urban Express Police" Phoenix'te görücüye çıktı
Anita Mui'nin eski erkek arkadaşı Huang Feihong'u oynamasıyla ünlü ve Yen Zidan'ın kariyeri nedeniyle bir web dizisi oyuncusu oldu.
"As ve As" Hua Chenyu'yu ateşe ve Shen Teng'i getirdi, ama ateşte olmayan tek kişi oydu!
"Hareket etmenin" en uç noktaya yorumlanmasıyla Sony DMP-Z1 müzik çalar
"Dajiang Dahe 2" Wang Kai "60 yaşındaki Song Yunhui'yi oynamak için" rezervasyon yaptı ": Kaç yaşında olduğumu dört gözle bekliyorum
To Top