Hadoop的數據壓縮

来源:https://www.cnblogs.com/HelloBigTable/archive/2019/04/08/10668931.html
-Advertisement-
Play Games

一、Hadoop的數據壓縮 1.概述 在進行MR程式的過程中,在Mapper和Reducer端會發生大量的數據傳輸和磁碟IO,如果在這個過程中對數據進行壓縮處理,可以有效的減少底層存儲(HDFS)讀寫的位元組數,,並且通過減少Map和Reduce階段數據的輸入輸出來提升MR程式的速度,提高了網路帶寬和 ...


一、Hadoop的數據壓縮

  1.概述

    在進行MR程式的過程中,在Mapper和Reducer端會發生大量的數據傳輸和磁碟IO,如果在這個過程中對數據進行壓縮處理,可以有效的減少底層存儲(HDFS)讀寫的位元組數,,並且通過減少Map和Reduce階段數據的輸入輸出來提升MR程式的速度,提高了網路帶寬和磁碟空間的效率;

    數據壓縮可以有效的節省資源,它是MR程式的優化策略之一;  

    數據壓縮會增加cpu的計算負擔,但是能很大程度較少磁碟的IO。由於數據壓縮占用cpu資源很小,總體還是利大於弊的。

  2.數據壓縮使用原則:

    運算密集型的任務儘量少用壓縮、IO密集型的任務多用壓縮。

  3.MapReduce支持的壓縮編碼

hadoop中的壓縮格式 是否自帶 文件的拓展名 是否可以切分
DEFAULT .default
Gzip .gz
bzip2 .bz2
LZO .lzo
Snappy .snappy

  4.編碼解碼器

DEFAULT org.apache.hadoop.io.compress.DefaultCodeC
Gzip org.apahce.hadoop.io.compress.GzioCodeC
bzop2 org.apache.hadoop.io.compress.bzio2CodeC
LZO com.apache.hadoop.compression.lzoCodeC
Snappy org.apache.hadoop.io.compress.SnappyCodeC

  5.壓縮性能

壓縮格式 原始文件 壓縮後文件 壓縮速度 解壓速度
Gzip 8.3G 1.8G 17.5MB/s 58MB/s
bzip2 8.3G 1.1G 2.4MB/s 9.5MB/s
LZO 8.3G 2.9G 49MB/s 74.6MB/s

 

 

二 、Hadoop壓縮的使用

 

  1.應用在WordCount程式中

   1)在map端對數據進行壓縮

    在Driver類中的獲取job對象後加入配置信息:

//開啟map端的輸入壓縮
conf.setBoolean("mapreduce.map.output.compress",true);

//設置壓縮方法
//預設
conf.setClass("mapreduce.map.output.compress.codec",DefaultCodeC.class,CompressionCodec.class);
//Bzip2
conf.setClass("mapreduce.mapt.output.compress.codec",Bzip2Codec.class,CompressionCode.class);
//LZO
conf.setClass("mapreduce.map.output.compress.codec".LZOCodec.class,CompressionCodec.class);

 

    註意:在map端開啟壓縮並不能從結果文件中看到結果的改變,只要程式運行成功就代表設置沒問題!

   2)在reduce端對數據進行壓縮

    在設置reduce輸出數據類型之後加入配置信息:

//開啟reduce端的輸出壓縮
FileOutputFormat.setCompressOutput(job,true);
//設置壓縮方法
//預設
FileOutputFormat.setOutputCompressorClass(job,DefaultCodec.class);
//Bzip2
FileOutputFormat.setOutputCompressorClass(job,Bzip2Codec.class);
//Gzip
FileOutputFormat.setOutputCompressorClass(job,GzipCodec.class);

    三種選擇一種即可,可以看到對應的結果文件看到被壓縮的結果文件。

  2.自定義壓縮方法

 

/**
 * @author: PrincessHug
 * @date: 2019/4/8, 9:49
 * @Blog: https://www.cnblogs.com/HelloBigTable/
 */
public class TestCompress {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Compress("G:\\weblog.log","org.apache.hadoop.io.compress.BZip2Codec");
    }

    //自定義壓縮方法
    private static void Compress(String fileName,String method) throws IOException, ClassNotFoundException {
        //獲取輸入流
        FileInputStream fis = new FileInputStream(new File(fileName));

        //通過反射獲取壓縮方法並初始化
        Class cName = Class.forName(method);
        CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(cName, new Configuration());

        //定義輸出流
        FileOutputStream fos = new FileOutputStream(new File(fileName + codec.getDefaultExtension()));

        //創建壓縮輸出流
        CompressionOutputStream cos = codec.createOutputStream(fos);

        //流的拷貝
        IOUtils.copyBytes(fis,cos,2*1024*1024,false);

        //關閉資源
        fis.close();
        cos.close();
        fos.close();
    }
}

  

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在之前寫過一篇博客"關係資料庫如何快速查詢表的記錄數",裡面介紹了使用sp_spaceused查看表的記錄數是否正確的問題,具體如下: 關於問題3:有多個索引的表,是否記錄數會存在不一致的情況? 答案:個人測試以及統計來看,暫時發現多個索引的情況下,sys.partitions中的rows記錄數都是... ...
  • windows系統無法改成 lower_case_table_names=0, 因為windows預設是1,就算改也只能改成2,以下截自 MySQL 8.0 Reference Manual 然後,當我們按照網上方法把 my.ini中的lower_case_table_names強行改成2之後,會發 ...
  • 相信大家在很多實際業務中(特別是後臺系統)會使用到各種篩選條件來篩選結果集 首先添加測試數據 1.有使用EXEC來避免全表掃描 或者條件少的情況下 2.使用IS NULL來實現 第一種方案,不會破壞索引,但冗餘的代碼看起來讓人難受 第二種方案,會導致全表掃描(破壞索引) 以上是網上查閱的資料,方案二 ...
  • 每一個資料庫都有自己的數據類型。同樣子redis為我們提供了五種類型的數據——字元串、哈希、列表、集合、有序集合。我們知道關係型數據的數據存放型式是一張二維表。用行和列來表示數據之間的關係。redis是一個nosql資料庫當然不可能在用什麼二維表的形式來表示了。他所有的數據都是以key=value的 ...
  • AI中台是一套完整的智能模型全生命周期管理平臺和服務配置體系,基於數據平臺服務,通過對智能服務的共用復用、對智能服務研發相關角色進行管理,以及研發流程的標準化、自動化,對前臺業務提供個性化智能服務的迅速構建能力支持。 ...
  • 隱式和顯式鎖定:1.innodb是兩階段鎖定協議,隱式鎖定比如在事務的執行過程中.會進行鎖定,鎖只有在commit或rollback的時候,才會同時被釋放2.特定的語句進行顯式鎖定 select ... lock in share mode ; select ... for update,where ...
  • mysql排序問題(對字元串類型數據進行排序)對普通數字字元串欄位排序:select * from qq ORDER BY score*1 DESC,time*1 ASC 一、在mysql操作中我們經常需要對數據進行類型轉換。此時我們應該使用的是cast()或convert()。二、兩者的對比相同點 ...
  • 1.系統要通過嚴格的ACID測試,ACID表示原子性/一致性/隔離性/持久性原子性:一個事務必須被視為一個不可分割的最小工作單元一致性:資料庫總是從一個一致性的狀態轉換到另外一個一致性的狀態隔離性:通常來說一個事務所做的修改在最終提交以前對其他事務是不可見的持久性:一旦事務提交,則其所做的修改就會永 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...