1. 程式人生 > >Spark使用CombineTextInputFormat緩解小檔案過多導致Task數目過多的問題

Spark使用CombineTextInputFormat緩解小檔案過多導致Task數目過多的問題

目前平臺使用Kafka + Flume的方式進行實時資料接入,Kafka中的資料由業務方負責寫入,這些資料一部分由Spark Streaming進行流式計算;另一部分資料則經由Flume儲存至HDFS,用於資料探勘或機器學習。HDFS儲存資料時目錄的最小邏輯單位為“小時”,為了保證資料計算過程中的資料完整性(計算某個小時目錄中的資料時,該目錄的資料全部寫入完畢,且不再變化),我們在Flume中加入瞭如下策略: 每五分鐘關閉一次正在寫入的檔案,即新建立檔案進行資料寫入。 這樣的方式可以保證,當前小時的第五分鐘之後就可以開始計算上一小時目錄中的資料,一定程度上提高了離線資料處理的實時性。 隨著業務的增加,開始有業務方反饋:“HDFS中實際被分析的資料量很小,但是Spark App的Task數目卻相當多,不太正常”,我們跟進之後,發現問題的根源在於以下三個方面: (1)Kafka的實時資料寫入量比較小; (2)Flume部署多個例項,同時消費Kafka中的資料並寫入HDFS; (3)Flume每五分鐘會重新建立檔案寫入資料(如上所述); 這樣的場景直接導致HDFS中儲存著數目眾多但單個檔案資料量很小的情況,間接影響著Spark App Task的數目。 我們以Spark WordCount為例進行說明,Spark版本為1.5.1。 假設HDFS目錄“/user/yurun/spark/textfile”中存在以下檔案: 這個目錄下僅三個檔案包含少量資料:part-00005、part-00010、part-00015,資料大小均為6 Byte,其餘檔案資料大小均為0 Byte,符合小檔案的場景。 注意:_SUCCESS相當於一個“隱藏”檔案,實際處理時通常會被忽略。 常規實現 我們使用SparkContext textFile完成資料輸入,應用執行完成之後,通過Spark History Server的頁面可以看到:應用執行過程中,會產生一個Job,包含兩個Stage,每個Stage包含16個Task,也就是說,Task的總數目為32,如下圖所示: 之所以每個Stage包含16個Task,是因為目錄中存有16個文字檔案(_SUCCESS不參與計算)。 優化實現
在這個優化的版本中,我們使用SparkContext newAPIHadoopFile完成資料輸入,需要著重說明一下“org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat”,這個類可以將多個小檔案合併生成一個Split,而一個Split會被一個Task處理,從而減少Task的數目。這個應用的執行過程中,會產生兩個Job,其中Job0包含一個Stage,一個Task;Job1包含兩個Stage,每個Stage包含一個Task,也就是說,Task的總數目為3,如下圖所示:   可以看出,通過使用“org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat”可以很大程度上緩解小檔案導致Spark App Task數目過多的問題。 

相關推薦

Spark使用CombineTextInputFormat緩解檔案過多導致Task數目過多的問題

目前平臺使用Kafka + Flume的方式進行實時資料接入,Kafka中的資料由業務方負責寫入,這些資料一部分由Spark Streaming進行流式計算;另一部分資料則經由Flume儲存至HDFS,用於資料探勘或機器學習。HDFS儲存資料時目錄的最小邏輯單位為“小時”,為了保證資料計算過程中的資料完整

Linux 底下 檔案過多導致 ls 命令出現 arguments too long 的問題

作為一個linux使用者/系統管理員, 有些時候你會遇到以下錯誤提示: [[email protected] foo]$ mv * ../foo2 bash: /bin/mv: Argument list too long “Argument list t

如何應對SparkSQL DataFrame儲存到hdfs時出現的過多檔案問題

原因就不解釋了,總之是因為多執行緒並行往hdfs寫造成的(因為每個DataFrame/RDD分成若干個Partition,這些partition可以被並行處理)。 其結果就是一個存下來的檔案,其實是hdfs中一個目錄,在這個目錄下才是眾多partition對應的檔案,最壞的

數倉面試高頻考點--解決hive檔案過多問題

**本文首發於公眾號:五分鐘學大資料** ### 小檔案產生原因 hive 中的小檔案肯定是向 hive 表中匯入資料時產生,所以先看下向 hive 中匯入資料的幾種方式 1. 直接向表中插入資料 ``` insert into table A values (1,'zhangsan',88),(2,'li

spark分區數,task數目,core數,worker節點個數,excutor數量梳理

span 技術分享 註意 mat utf jpg input lin part 作者:王燚光鏈接:https://www.zhihu.com/question/33270495/answer/93424104來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載

Linux下php-fpm進程過多導致內存耗盡問題

sort 參考 編輯 再次 數據庫服務 過多 改進 設置 php5 這篇文章主要介紹了解決Linux下php-fpm進程過多導致內存耗盡問題,需要的朋友可以參考下 最近,發現個人博客的Linux服務器,數據庫服務經常掛掉,導致需要重啟,才能正常訪問,極其惡心,於是決心

MySQL Insert語句單個批次數量過多導致的CPU性能問題分析

padding 異常 線程處理 mys add context table 占比 我們 原文:MySQL Insert語句單個批次數量過多導致的CPU性能問題分析【問題】 最近有臺服務器比較頻繁的CPU報警,表現的特征有CPU sys占比偏高,大量慢查詢,大量並發線程堆積

使用Impala合併檔案

1.文件編寫目的   Fayson在前面的文章《如何在Hadoop中處理小檔案》裡面介紹了多種處理方式。在Impala表中使用小檔案也會降低Impala和HDFS的效能,本篇文章Fayson主要介紹如何使用Impala合併小檔案。   內容概述

HDFS無法高效儲存大量檔案,如何處理好檔案

一、HAR檔案方案         為了緩解大量小檔案帶給namenode記憶體的壓力,Hadoop 0.18.0引入了Hadoop Archives(HAR files),其本質就是在HDFS之上構建一個分層檔案系統。通過執行hado

python spark中parquet檔案寫到hdfs,同時避免太多的檔案(block檔案合併)

    在pyspark中,使用資料框的檔案寫出函式write.parquet經常會生成太多的小檔案,例如申請了100個block,而每個block中的結果 只有幾百K,這在機器學習演算法的結果輸出中經常出現,這是一種很大的資源浪費,那麼如何同時避免太多的小檔案(bloc

史上最全MapReduce檔案優化策略

小檔案的優化無非以下幾種方式:   在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳 HDFS 在業務處理之前,在 HDFS 上使用 mapreduce 程式對小檔案進行合併 在 mapreduce 處理時,可採用 CombineTextInputForma

sparksql寫入hive合併檔案

今天主要來說一下sparksql寫入hive後小檔案太多,影響查詢效能的問題.在另外一篇部落格裡面也稍微提到了一下,但還是感覺要單獨說一下,首先我們要知道hive裡面檔案的數量=executor-cores*num-executors*job數,所以如果我們batchDuration的設定的比較

叢集間資料拷貝和Hadoop存檔對於檔案處理

scp實現兩個遠端主機之間的檔案複製 scp -r hello.txt [email protected]:/user/atguigu/hello.txt // 推 push scp -r [email protected]:/user/atguigu

Python將一個大檔案按段落分隔為多個檔案的簡單方法

今天幫同學處理一點語料。語料檔案有點大,並且是以連續兩個換行符作為段落標誌,他想把它按段落分隔成多個小檔案,即每3個段落組成一個新檔案。由於以前沒有遇到過類似的操作,在網上找了一些相似的方法,看起來都有點複雜。所以經嘗試,自己寫了一段程式碼,完美解決問題。 基本思路是,先讀原檔案內容,

hdfs 檔案合併方案(附程式碼)

背景: presto計算落地出現了大量的小檔案,目前暫時沒有發現可以通過引數優化解決,所以開發了小檔案合併工具 工具架構如下 工具主要分為三部分: collector 負責將合併規則推送到redis佇列,合併規則物件定義如下, public class FileCo

java 關於 Finalizer 過多導致記憶體(Res)緩慢上漲

    病因: 事情的起因是由Flume的專案採集問題引發的. 測試人員發現用top命令檢視採集程序的Res一直不斷上漲姿勢. 所以懷疑是記憶體洩漏. 一, 對症下藥     首先, 第一步肯定是先瞅瞅程式碼, 看看有沒有那些資源啥

MySQL Insert語句單個批次數量過多導致的CPU效能問題分析

【問題】 最近有臺伺服器比較頻繁的CPU報警,表現的特徵有CPU sys佔比偏高,大量慢查詢,大量併發執行緒堆積。後面開發對insert的相關業務限流後,伺服器效能恢復正常。   【異常期間執行緒處理情況】 下圖是當時生產環境異常時抓取的資訊,該事務正在執行insert,已經執行5秒,執行緒

org.apache.solr.common.SolrException: Request-URI Too Large(solr query操作因為引數過多導致uri過長錯誤)

原文連結: org.apache.solr.common.SolrException: Request-URI Too Large   採用post提交url提交方式有兩種,一種是get方式,一種是post方式 sol查詢的時候添加個引數   &nb

Hadoop的JVM重用機制和檔案解決

Hadoop的JVM重用機制和小檔案解決 一、hadoop2.0 uber功能   1) uber的原理:Yarn的預設配置會禁用uber元件,即不允許JVM重用。我們先看看在這種情況下,Yarn是如何執行一個MapReduce job的。首先,Resource Manager裡的App

hive使用技巧:把很多檔案匯入一張表中、顯示在檔案中位置和行數等。

1.使用MSCK命令匯入輸入到hive表 我們有時候會遇到很多小檔案需要匯入到一張hive表裡面,但是一個個匯入非常麻煩。 假設建立一個外部表,這個表在hdfs的order資料夾裡,但是這個資料夾現在是空的。所以用select * 是沒有資料的。 CREATE EXTERNAL TABL