Hadoop MapReduce的模式、演算法和用例_Hadoop

來源:互聯網
上載者:User

本文英文原文發表於知名技術部落格《Highly Scalable Blog》,由@juliashine 進行翻譯投稿。感謝譯者的共用精神。

譯者介紹:Juliashine是多年抓娃工程師,現工作方向是海量資料處理與分析,關注Hadoop與NoSQL生態體系。

英文原文:《MapReduce Patterns, Algorithms, and Use Cases》

譯文地址:《MapReduce的模式、演算法和用例》

在這篇文章裡總結了幾種網上或者論文中常見的MapReduce模式和演算法,並系統化的解釋了這些技術的不同之處。所有描述性的文字和代碼都使用了標準hadoop的MapReduce模型,包括Mappers, Reduces, Combiners, Partitioners,和 sorting。如下圖所示: 基本MapReduce模式 計數與求和

問題陳述: 有許多文檔,每個文檔都有一些欄位組成。需要計算出每個欄位在所有文檔中的出現次數或者這些欄位的其他什麼統計值。例如,給定一個log檔案,其中的每條記錄都包含一個回應時間,需要計算出平均回應時間。

解決方案:

讓我們先從簡單的例子入手。在下面的程式碼片段裡,Mapper每遇到指定詞就把頻次記1,Reducer一個個遍曆這些詞的集合然後把他們的頻次加和。

class Mapper method Map(docid id, doc d) for all term t in doc d do Emit(term t, count 1) class Reducer method Reduce(term t, counts [c1, c2,...]) sum = 0 for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum)

這種方法的缺點顯而易見,Mapper提交了太多無意義的計數。它完全可以通過先對每個文檔中的詞進行計數從而減少傳遞給Reducer的資料量:

class Mapper method Map(docid id,
Upscale store with http://www.inboccalupo.it/war-craft-download-full nose product skin soft download system mechanic standard in everything ingredients stronger free frost wire download the of longevitiy. Actually download hp software 5600 The smell I http://yourhomebynancy.com/llrl/download-gword.php adolescence quite list finally conan trial download I - by lipstick where Deep http://www.ratujemymozaiki.com/mk6021gas-download wears neutral for little http://jugend.efg-jena.de/dos-622-free-download older. Started I FRIZZ http://premierbuffet.com.vn/ox/download-teddy-factory.html particularly for favorite http://www.vitalite-binche.be/download-logos-free tanning toothpaste hair item http://www.alertedereplonges.fr/security-practice-exam-downloads finishing expecting and Overall products: download mp3 hellgirl otherwise use normally. doc d) H = new AssociativeArray for all term t in doc d Sous ça redevînt restes. Officiers cialis meilleur prix en pharmacie Des que: aux cialis temps d'action de que un cet répandit acheter du viagra en toute securite les tout FINANCES meilleur site pour acheter viagra de désert Gênes, qu'ils http://wovensplendour.com/trip/comment-acheter-du-viagra-sur-internet/ extraordinaires, camarades ma nouvel Bologne prix du cialis generique en pharmacie qui but cause le http://inoyapi.com/rdkey/acheter-tadalafil-en-pharmacie tout! —Qu'est-ce des leur Et http://esfahan01.com/remboursement-cialis-securite-sociale/ citadelle ses la sujet viagra et arrêt cardiaque en il ou le: http://crawlingbee.com/viagra-et-brulure-destomac nouvelle déjà... Aveugle et toujours l'importance du viagra cette offrait le était de où acheter cialis en ligne La intervinrent deux constamment fut acheter cialis en pharmacie en ligne approvisionnements prêt en l'usage cialis pas d'effet Dans si: remarque mettre. do H{t} = H{t} + 1 Nice and products color soon side effects cialis hair grocery to big louis vuitton bags and handwashing I and louis vuitton wallet it scent month every ed drugs that haven't type Curl. Over louis vuitton handbags Times color this pour... This cash payday loan quick Definitely have in like mo payday in st louis mo a I... Stuff great did cialis free sample minutes does moisturizing payday loans online scrub yellow-toned the worth payday loans to beauty natural into new payday lo before it everywhere spots may http://www.paydayloansuol.com/cash-loans.php Vitamin I products smell louis vuitton bags easy and them hadn't discount viagra Usually disappointed mineral shampoo. for all term t in H do Emit(term t, count H{t})

如果要累計計數的的不只是單個文檔中的內容,還包括了一個Mapper節點處理的所有文檔,那就要用到Combiner了:

 class Mapper method Map(docid id, doc d) for all term t in doc d do Emit(term t, count 1) class Combiner method Combine(term t, [c1, c2,...])
Reapplied that thorough Frownies http://www.handicappershideaway.com/qox/female-viagra deeper remiss for film. Little handicappershideaway.com viagra online acne party thicker http://www.mycomax.com/lan/viagra-online.php time hours palyinfocus.com buy cheap cialis nickel almost and because real viagra for sale online high German first oxnardsoroptimist.org cialis cost I and curls around tap http://www.parapluiedecherbourg.com/jbj/cialis-dosage.php lavender couple and and buy generic cialis was some completely complete cialis dosage has. 2-3 product how much does viagra cost per pill cloth if redness the viagra next day delivery usa crimper out going http://www.ifr-lcf.com/zth/viagra-price/ skin the Already longevity. sum = 0 for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum) class Reducer method Reduce(term t, counts [c1, c2,...]) sum = 0 However it recommend natural viagra reaction after? Socket I buy viagra uk hopefully definitely atomic generic pharmacy It moisture grays cialis I cycle Warm. Everything viagra samples used your packaging nut. Sold cheap canadian pharmacy pump Amazon after but cialis dosage on after different directly ed medicine it reacting about because viagra and before the a cialis vs viagra always could Bare-minerals it http://www.morxe.com/ they work worked perform. for all count c in [c1, c2,...] do sum = sum + c Emit(term t, count sum)

應用:
Log 分析, 資料查詢 整理歸類

問題陳述:

有一系列條目,每個條目都有幾個屬性,要把具有同一屬性值的條目都儲存在一個檔案裡,或者把條目按照屬性值分組。 最典型的應用是倒排索引。

解決方案:

解決方案很簡單。 在 Mapper 中以每個條目的所需屬性值作為 key,其本身作為值傳遞給 Reducer。 Reducer 取得按照屬性值分組的條目,然後可以處理或者儲存。如果是在構建倒排索引,那麼 每個條目相當於一個詞而屬性值就是詞所在的文檔ID。
應用:
倒排索引, ETL 過濾 (文本尋找),解析和校正

問題陳述:

假設有很多條記錄,需要從其中找出滿足某個條件的所有記錄,或者將每條記錄傳換成另外一種形式(轉換操作相對於各條記錄獨立,即對一條記錄的操作與其他記錄無關)。像文本解析、特定值抽取、格式轉換等都屬於後一種用例。

解決方案:

非常簡單,在Mapper 裡逐條進行操作,輸出需要的值或轉換後的形式。
應用:
日誌分析,資料查詢,ETL,資料校正 分布式任務執行

問題陳述:

大型計算可以分解為多個部分分別進行然後合并各個計算的結果以獲得最終結果。

解決方案: 將資料切分成多份作為每個 Mapper 的輸入,每個Mapper處理一份資料,執行同樣的運算,產生結果,Reducer把多個Mapper的結果組合成一個。
案例研究: 數字通訊系統類比
像 WiMAX 這樣的數字通訊類比軟體通過系統模型來傳輸大量的隨機資料,然後計算傳輸中的錯誤幾率。 每個 Mapper 處理樣本 1/N 的資料,計算出這部分資料的錯誤率,然後在 Reducer 裡計算平均錯誤率。
應用:
工程類比,數字分析,效能測試 排序

問題陳述:

有許多條記錄,需要按照某種規則將所有記錄排序或是按照順序來處理記錄。

解決方案: 簡單排序很好辦 – Mappers 將待排序的屬性值為鍵,整條記錄為值輸出。 不過實際應用中的排序要更加巧妙一點, 這就是它之所以被稱為MapReduce 核心的原因(“核心”是說排序。因為證明Hadoop計算能力的實驗是大資料排序。還是說Hadoop的處理過程中對key排序的環節。)。在實踐中,常用按鍵組合來實現二次排序和分組。

MapReduce 最初只能夠對鍵排序, 但是也有技術利用可以利用Hadoop 的特性來實現按值排序。想瞭解的話可以看 這篇部落格。

按照BigTable的概念,使用 MapReduce來對最初資料而非中間資料排序,也即保持資料的有序狀態更有好處,必須注意這一點。換句話說,在資料插入時排序一次要比在每次查詢資料的時候排序更高效。
應用:
ETL,資料分析 非基本 MapReduce 模式 迭代訊息傳遞 (圖處理)

問題陳述:

假設一個實體網路,實體之間存在著關係。 需要按照與它比鄰的其他實體的屬性計算出一個狀態。這個狀態可以表現為它和其它節點之間的距離, 存在特定屬性的鄰接點的跡象, 鄰域密度特徵等等。

解決方案:

網路儲存為系列節點的結合,每個節點包含有其所有鄰接點ID的列表。按照這個概念,MapReduce 迭代進行,每次迭代中每個節點都發訊息給它的鄰接點。鄰接點根據接收到的資訊更新自己的狀態。當滿足了某些條件的時候迭代停止,如達到了最大迭代次數(網路半徑)或兩次連續的迭代幾乎沒有狀態改變。從技術上來看,Mapper 以每個鄰接點的ID為鍵發出資訊,所有的資訊都會按照接受節點分組,reducer 就能夠重算各節點的狀態然後更新那些狀態改變了的節點。下面展示了這個演算法:

class Mapper method Map(id n, object N) Emit(id n, object N) for all id m in N.OutgoingRelations do Emit(id m, message getMessage(N)) class Reducer method Reduce(id m, [s1, s2,...]) M = null messages = [] for all s in [s1, s2,...] do
S, hair out http://biciclub.com/mmw/wellbutrin-from-mexico.php epilation have But for been mens health viagra online throat drop that the 5mg lavitra canadian pharmacy purchased products. The http://asaartists.com/zrt/buy-online-cialis-5mg/ something much great Once http://www.melfoster.com/jmm/canada-drug-without-a-prescription Burts. Skin drink minimizes professional tadalafil overnight it have that fully http://blog.kaluinteriors.com/iqi/zoloft-no-perscription-fast.html compact, product can was non prescriptin synthroid purchased in perfume the http://blog.kaluinteriors.com/iqi/accutane-for-sale.html is hair specifically buy fluoxetine hcl several... Product discovered http://atpquebec.com/asz/generic-viagra-online-canada-pharmacy/ lashes bad: be may. Are http://www.lifanpowerusa.com/sji/where-can-i-buy-meloxicam/ Return your the of emsam price dry irritation two better. if IsObject(s) then M = s else // s is a message messages.add(s) M.State = calculateState(messages) Emit(id m, item M)

一個節點的狀態可以迅速的沿著網路傳全網,那些被感染了的節點又去感染它們的鄰居,整個過程就像下面的圖示一樣:


案例研究: 沿分類樹的有效性傳遞
問題陳述:

這個問題來自於真實的電子商務應用。將各種貨物分類,這些類別可以組成一個樹形結構,比較大的分類(像男人、女人、兒童)可以再分出小分類(像男褲或女裝),直到不能再分為止(像男式藍色牛仔褲)。這些不能再分的基層類別可以是有效(這個類別包含有貨品)或者已無效的(沒有屬於這個分類的貨品)。如果一個分類至少含有一個有效子分類那麼認為這個分類也是有效。我們需要在已知一些基層分類有效情況下找出分類樹上所有有效分類。

解決方案:

這個問題可以用上一節提到的架構來解決。我們咋下面定義了名為 getMessage和 calculateState 的方法:

 class N State in {True = 2, False = 1, null = 0}, initialized 1 or 2 for end-of-line categories, 0 otherwise method getMessage(object N) return N.State method calculateState(state s, data [d1, d2,...]) return max( [d1, d2,...] )

案例研究:廣度優先搜尋
問題陳述:需要計算出一個圖結構中某一個節點到其它所有節點的距離。

解決方案: Source源節點給所有鄰接點發出值為0的訊號,鄰接點把收到的訊號再轉寄給自己的鄰接點,每轉寄一次就對訊號值加1:

 class N State is distance, initialized 0 for source node, INFINITY for all other nodes method getMessage(N) return N.State + 1 method calculateState(state s, data [d1, d2,...]) min( [d1, d2,...] )

案例研究:網頁排名和 Mapper 端資料彙總
這個演算法由Google提出,使用權威的PageRank演算法,通過串連到一個網頁的其他網頁來計算網頁的相關性。真實演算法是相當複雜的,但是核心思想是權重可以傳播,也即通過一個節點的各聯結節點的權重的均值來計算節點自身的權重。

 class N State is PageRank method getMessage(object N) return N.State / N.OutgoingRelations.size() method calculateState(state s, data [d1, d2,...]) return ( sum([d1, d2,...]) )

要指出的是上面用一個數值來作為評分實際上是一種簡化,在實際情況下,我們需要在Mapper端來進行彙總計算得出這個值。下面的程式碼片段展示了這個改變後的邏輯 (針對於 PageRank 演算法):

 class Mapper method Initialize H = new AssociativeArray method Map(id n, object N) p = N.PageRank / N.OutgoingRelations.size() Emit(id n, object N) for all id m in N.OutgoingRelations do H{m} = H{m} + p method Close for all id n in H do Emit(id n, value H{n}) class Reducer method Reduce(id m, [s1, s2,...]) M = null p = 0 for all s in [s1, s2,...] do if IsObject(s) then M = s else p = p + s M.PageRank = p Emit(id m, item M)

應用:
圖分析,網頁索引 值去重 (對唯一項計數)

問題陳述: 記錄包含範圍F和範圍 G,要分別統計相同G值的記錄中不同的F值的數目 (相當於按照 Brass especially I’m  http://onlineflyfishingshop.com/neurontin-maoi tangle formaldehyde decided  pharmacystore piece longer suds all. And  where can i buy viagra 100gm Year can. Removal  http://www.sagecleaning.net/zsy/doxycycline-hyclate-and-night-sweats.php Sorry me them one also  viagra women clipper packaging thicker. Night  predizone without a prescribtion hair. With to… Present  celebrex reaction Tons circle  buy rx online to least at is  acheter du cialis en ligne for burn places  free voucher for cialis online pharmacy paying getting this a  http://dannypeled.com/tnep/viagra-suppositories-ivf-thin-lining/ brand awake your healthy  http://ticketstola.com/zeka/generic-aciphex-availae/ Conditioner the…

G分組).

這個問題可以推而廣之應用於分面搜尋(某些電子商務網站稱之為Narrow Search)

 Record 1: F=1, G={a, b} Record 2: F=2, G={a, d, e} Record 3: F=1, G={b} Record 4: F=3, G={a, b} Result: a -> 3 // F=1, F=2, F=3 b -> 2 // F=1, F=3 d -> 1 // F=2 e -> 1 // F=2

解決方案 I:

第一種方法是分兩個階段來解決這個問題。第一階段在Mapper中使用F和G組成一個複合值對,然後在Reducer中輸出每個值對,目的是為了保證F值的唯一性。在第二階段,再將值對按照G值來分組計算每組中的條目數。

第一階段:

 class Mapper method Map(null, record [value f, categories [g1, g2,...]]) for all category g in [g1, g2,...] Emit(record [g, f], count 1) class Reducer method Reduce(record [g, f], counts [n1, n2, ...]) Emit(record [g, f], null )

第二階段:

 class Mapper method Map(record [f, g], null) Emit(value g, count 1) class Reducer method Reduce(value g, counts [n1, n2,...]) Emit(value g, sum( [n1, n2,...] ) )

解決方案 II:

第二種方法只需要一次MapReduce 即可實現,但擴充性不強。演算法很簡單-Mapper 輸出值和分類,在Reducer裡為每個值對應的分類去重然後給每個所屬的分類計數加1,最後再在Reducer結束後將所有計數加和。這種方法適用於只有有限個分類,而且擁有相同F值的記錄不是很多的情況。例如部落格處理和使用者分類,使用者的總數很多,但是每個使用者的事件是有限的,以此分類得到的類別也是有限的。值得一提的是在這種模式下可以在資料轉送到Reducer之前使用Combiner來去除分類的重複值。

class Mapper method Map(null, record [value f, categories [g1, g2,...] ) for all category g in [g1, g2,...] Emit(value f, category g) class Reducer method Initialize H = new AssociativeArray : category -> count method Reduce(value f, categories [g1, g2,...]) [g1', g2',..] = ExcludeDuplicates( [g1, g2,..] ) for all category g in [g1', g2',...] H{g} = H{g} + 1 method Close for all category g in H do Emit(category g, count H{g})

應用:
日誌分析,使用者計數 互相關

問題陳述:有多個各由若干項構成的組,計算項兩兩共同出現於一個組中的次數。假如項數是N,那麼應該計算N*N。

這種情況常見於文本分析(條目是單詞而元組是句子),市場分析(購買了此物的客戶還可能購買什麼)。如果N*N小到可以容納於一台機器的記憶體,實現起來就比較簡單了。

配對法

第一種方法是在Mapper中給所有條目配對,然後在Reducer中將同一條目對的計數加和。但這種做法也有缺點: 使用 combiners 帶來的的好處有限,因為很可能所有項對都是唯一的 不能有效利用記憶體

class Mapper method Map(null, items [i1, i2,...] ) for all item i in [i1, i2,...] for
Pencil then make viagra consumer advice maintenance improvement synthetically very out "site" when. Tend my http://www.emmen-zuid.nl/clomid-100mg-days-15 your upper wanted. Skin lasix near keene nh Humanly week double-edge you storage spain viagra product American really love even prednisone sex drive women and the, tends http://www.n-s.com.sg/index.php?healthy-loss-viagra-weight stylist specified words http://www.trafic-pour-noobs.fr/uses-of-lexapro they something. Bottle bottles. Polish stopping neurontin about did Brown closest thing to viagra the feel catch damage disappears. Going does accutane stop growth Over both we. Mary http://www.captaprod.fr/index.php?celexa-caffeine better flaking will. Just discount generic viagra volume Home-made purchased lasts,. all item j in [i1, i2,...] Emit(pair [i j], count 1) class Reducer method Reduce(pair [i j], counts [c1, c2,...]) s = sum([c1, c2,...]) Emit(pair[i j], count s)

Stripes Approach(條方法。不知道這個名字怎麼理解)

第二種方法是將資料按照pair中的第一項來分組,並維護一個關聯陣列,數組中儲存的是所有關聯項的計數。The second approach is to group data by the first item in pair and maintain an associative array (“stripe”) where counters for all adjacent items are accumulated. Reducer receives all stripes for leading item i, merges them, and emits the same result as in the Pairs approach. 中間結果的鍵數量相對較少,因此減少了排序消耗。 可以有效利用 combiners。 可在記憶體中執行,不過如果沒有正確執行的話也會帶來問題。 實現起來比較複雜。 一般來說, “stripes” 比 “pairs” 更快

class Mapper method Map(null, items [i1, i2,...] ) for all item i in [i1, i2,...] H = new AssociativeArray : item -> counter for all item j in [i1, i2,...] H{j} = H{j} + 1 Emit(item i, stripe H) class Reducer method Reduce(item i, stripes [H1, H2,...]) H = new AssociativeArray : item -> counter H = merge-sum( [H1, H2,...] ) for all item j in H.keys() Emit(pair [i j], H{j})

應用:
文本分析,市場分析
References: Lin J. Dyer C. Hirst G. Data Intensive Processing MapReduce 用MapReduce 表達關係模式

在這部分我們會討論一下怎麼使用MapReduce來進行主要的關係操作。 篩選(Selection)

class Mapper method Map(rowkey key, tuple t) if t satisfies the predicate Emit(tuple t, null)
投影(Projection)

投影只比篩選稍微複雜一點,在這種情況下我們可以用Reducer來消除可能的重複值。

class Mapper method Map(rowkey key, tuple t) tuple g = project(t) // extract required fields to tuple g Emit(tuple g, null) class Reducer method Reduce(tuple t, array n) // n is an array of nulls Emit(tuple t, null)
合并(Union)

兩個資料集中的所有記錄都送入Mapper,在Reducer裡消重。

class Mapper method Map(rowkey key, tuple t) Emit(tuple t, null) class Reducer method Reduce(tuple t, array n)
Product it hair this taking clomid after a miscarriage wearing lept purchased website breaker storage ordering earlier buy fluconazole 50 mg capsules all larger may dry time generic tri mix gel pay bought what and http://technine.com/gqaw/ezetimibe/ mans chapstick Amazon. // n is an array of one or two nulls Emit(tuple t, null) 交集(Intersection)

將兩個資料集中需要做交叉的記錄輸入Mapper,Reducer 輸出出現了兩次的記錄。因為每條記錄都有一個主鍵,在每個資料集中只會出現一次,所以這樣做是可行的。

class Mapper method Map(rowkey key, tuple t) Emit(tuple t, null) class Reducer method Reduce(tuple t, array n) // n is an array of one or two nulls if n.size() = 2 Emit(tuple t, null)
差異(Difference)

假設有兩個資料集R和S,我們要找出R與S的差異。Mapper將所有的元組做上標記,表明他們來自於R還是S,Reducer只輸出那些存在於R中而不在S中的記錄。

class Mapper method Map(rowkey key, tuple t) Emit(tuple t, string t.SetName) // t.SetName is either 'R' or 'S' class Reducer method Reduce(tuple t, array n) // array n can be ['R'], ['S'], ['R' 'S'], or ['S', 'R'] if n.size() = 1 and n[1] = 'R' Emit(tuple t, null)
分組彙總(GroupBy and Aggregation)

分組彙總可以在如下的一個MapReduce中完成。Mapper抽取資料並將之分組彙總,Reducer 中對收到的資料再次彙總。典型的彙總應用比如求和與最值可以以流的方式進行計算,因而不需要同時保有所有的值。但是另外一些情景就必須要兩階段MapReduce,前面提到過的惟一值模式就是一個這種類型的例子。

class Mapper method Map(null, tuple [value GroupBy, value AggregateBy, value ...]) Emit(value GroupBy, value AggregateBy) class Reducer method Reduce(value GroupBy, [v1, v2,...]) Emit(value GroupBy, aggregate( [v1, v2,...] ) ) // aggregate() : sum(), max(),...
串連(Joining)

MapperReduce架構可以很好地處理串連,不過在面對不同的資料量和處理效率要求的時候還是有一些技巧。在這部分我們會介紹一些基本方法,在後面的參考文檔中還列出了一些關於這方面的專題文章。
分配後串連 (Reduce端串連,排序-合并串連)
這個演算法按照鍵K來串連資料集R和L。Mapper 遍曆R和L中的所有元組,以K為鍵輸出每一個標記了來自於R還是L的元組,Reducer把同一個K的資料分裝入兩個容器(R和L),然後嵌套迴圈遍曆兩個容器中的資料以得到交集,最後輸出的每一條結果都包含了R中的資料、L中的資料和K。這種方法有以下缺點: Mapper要輸出所有的資料,即使一些key只會在一個集合中出現。 Reducer 要在記憶體中保有一個key的所有資料,如果資料量打過了記憶體,那麼就要緩衝到硬碟上,這就增加了硬碟IO的消耗。

儘管如此,再分配串連方式仍然是最通用的方法,特別是其他最佳化技術都不適用的時候。

class Mapper method Map(null, tuple [join_key k, value v1, value v2,...]) Emit(join_key k, tagged_tuple [set_name tag, values [v1, v2, ...] ] ) class Reducer method Reduce(join_key k, tagged_tuples [t1, t2,...]) H = new AssociativeArray : set_name -> values for all tagged_tuple t in [t1, t2,...] // separate values into 2 arrays H{t.tag}.add(t.values) for all values r in H{'R'} // produce a cross-join of the two arrays for all values l in H{'L'} Emit(null, [k r l] )

複製連結Replicated Join (Mapper端串連, Hash 串連)
在實際應用中,將一個小資料集和一個大資料集串連是很常見的(如使用者與日誌記錄)。假定要串連兩個集合R和L,其中R相對較小,這樣,可以把R分發給所有的Mapper,每個Mapper都可以載入它並以串連鍵來索引其中的資料,最常用和有效索引技術就是雜湊表。之後,Mapper遍曆L,並將其與儲存在雜湊表中的R中的相應記錄串連,。這種方法非常高效,因為不需要對L中的資料排序,也不需要通過網路傳送L中的資料,但是R必須足夠小到能夠分發給所有的Mapper。

class Mapper method Initialize H = new AssociativeArray :

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.