從零開始學習Hadoop--第4章 序列化(轉載)

来源:http://www.cnblogs.com/polestar/archive/2016/09/16/5875936.html
-Advertisement-
Play Games

作者對序列化的描述淺顯易懂!(https://www.douban.com/note/313096752/) ...


作者對序列化的描述淺顯易懂!(https://www.douban.com/note/313096752/)

1. 序列化從頭說
    在面向對象程式設計中,類是個很重要的概念。所謂“類”,可以將它想像成建築圖紙,而對象就是根據圖紙蓋的大樓。類,規定了對象的一切。根據建築圖紙造房子,蓋出來的就是大樓,等同於將類進行實例化,得到的就是對象。
    
    一開始,在源代碼里,類的定義是明確的,但對象的行為有些地方是明確的,有些地方是不明確的。對象里不明確地方,是因為對象在運行的時候,需要處理無法預測的事情,諸如用戶點了下屏幕,用戶點了下按鈕,輸入點東西,或者需要從網路發送接收數據之類的。後來,引入了泛型的概念之後,類也開始不明確了,如果使用了泛型,直到程式運行的時候,才知道究竟是哪種對象需要處理。

    對象可以很複雜,也可以跟時序相關。一般來說,“活的”對象只生存在記憶體里,關機斷電就沒有了。一般來說,“活的”對象只能由本地的進程使用,不能被髮送到網路上的另外一臺電腦。

    序列化,可以存儲“活的”對象,可以將“活的”對象發送到遠程電腦。

    把“活的”對象序列化,就是把“活的”對象轉化成一串位元組,而“反序列化”,就是從一串位元組里解析出“活的”對象。於是,如果想把“活的”對象存儲到文件,存儲這串位元組即可,如果想把“活的”對象發送到遠程主機,發送這串位元組即可,需要對象的時候,做一下反序列化,就能將對象“複活”了。

    將對象序列化存儲到文件,術語又叫“持久化”。將對象序列化發送到遠程電腦,術語又叫“數據通信”。

    Java對序列化提供了非常方便的支持,在定義類的時候,如果想讓對象可以被序列化,只要在類的定義上加上了”implements Serializable”即可,比如說,可以這麼定義”public class Building implements Serializable”,其他什麼都不要做,Java會自動的處理相關一切。Java的序列化機制相當複雜,能處理各種對象關係。

    Java的序列化機制的缺點就是計算量開銷大,且序列化的結果體積大太,有時能達到對象大小的數倍乃至十倍。它的引用機制也會導致大文件不能分割的問題。這些缺點使得Java的序列化機制對Hadoop來說是不合適的。於是Hadoop設計了自己的序列化機制。

    為什麼序列化對Hadoop很重要?因為Hadoop在集群之間進行通訊或者RPC調用的時候,需要序列化,而且要求序列化要快,且體積要小,占用帶寬要小。所以必須理解Hadoop的序列化機制。


2. Hadoop的序列化介面 什麼是介面?簡答來說,介面就是規定,它規定類必須實現的方法。一個介面可以包含多幹個方法。如果一個類說自己實現了某個介面,那麼它必須實現這個介面里的所有方法。特殊情況下,介面也可以沒有任何方法。 Writable介面,也就是org.apache.hadoop.io.Writable介面。Hadoop的所有可序列化對象都必須實現這個介面。Writable介面里有兩個方法,一個是write方法,將對象寫入位元組流,另一個是readFields方法,從位元組流解析出對象。 Java的API提供了Comparable介面,也就是java.lang.Comparable介面。這個介面只有一個方法,就是compareTo,用於比較兩個對象。 WritableComparable介面同時繼承了Writable和Comparable這兩個介面。 Hadoop里的三個類IntWritable、DoubleWritable和ByteWritable,都繼承了WritableComparable介面。註意,IntWritable、DoubleWritable和ByteWritable,儘管尾碼是“Writable”,但它們不是介面,是類!! Hadoop的序列化介面還有更多的類型,在這裡不一一列舉。
3. IntWritable如何序列化 3.1 目錄和文件結構 這個例子演示IntWritable如何序列化。首先,創建一個IntWritable,然後,將它序列化,輸出到一個位元組流中。然後,創建一個新的IntWritable,從位元組流中讀取值,這是反序列化。 創建目錄~/intser存放源代碼、編譯和打包結果。在intser目錄下,有兩個子目錄,分別是src目錄和classes目錄,src目錄存放Java源代碼,class存放編譯結果。在src目錄下,只有一個源代碼文件IntSer.java。 3.2 IntSer.java文件的源代碼 package com.brianchen.hadoop; import java.io.DataOutputStream; import java.io.DataInputStream; import java.io.ByteArrayOutputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.util.StringUtils; public class IntSer{ public byte[] serialize(Writable w)throws IOException{ ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dataout = new DataOutputStream(out); w.write(dataout); dataout.close(); return out.toByteArray(); } public byte[] deserialize(Writable w, byte[] bytes) throws IOException{ ByteArrayInputStream in = new ByteArrayInputStream(bytes); DataInputStream datain = new DataInputStream(in); w.readFields(datain); datain.close(); return bytes; } public static void main(String[] args) throws Exception{ IntWritable intw = new IntWritable(7); byte[] bytes = serialize(intw); String bytes_str = StringUtils.byteToHexString(bytes); System.out.println(bytes_str); IntWritable intw2 = new IntWritable(0); deserialize(intw2, bytes); System.out.println(intw2); } } 3.3 編譯 “cd ~/intser” “javac -cp /home/brian/usr/hadoop/hadoop-1.2.1/hadoop-core-1.2.1.jar -d ./classes src/*.java” 3.4 打包 “jar -cvf intser.jar -C ./classes .” 3.5 運行 “cd ~/usr/hadoop/hadoop-1.2.1” “./bin/hadoop jar /home/brian/intser/intser.jar com.brianchen.hadoop.IntSer” 首先確認Hadoop已經是運行的,然後切換到Hadoop的安裝目錄,然後運行,輸出結果是兩行,第一行是”00000007”,第二行是”7”。

 


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

-Advertisement-
Play Games
更多相關文章
  • 之前一直沒用到這個函數,因為一般的情況下分類比較少的情況下,比如 : 男 : 0 女 : 1 我們一般會這麼設計資料庫,前臺顯示的時候一般會用select 或者 redio value = "0" 或=“1”顯示這樣確實是比較方便 其實用decode函數直接就可以使用了 select decode( ...
  • 一、登錄 打開終端,輸入/usr/local/mysql/bin/mysql -u root -p 初次進入mysql,密碼為空。當出現mysql>提示符時,表示你已經進入mysql中。鍵入exit退出mysql。 二、更改Mysqlroot用戶密碼 更改mysql root 用戶密碼,在終端輸入/ ...
  • oracle使用java source調用外部程式 需求 Oracle調用第三方外部程式。Oracle使用sqluldr2快速導出大批量數據,然後用winrar壓縮後發送郵件。 原碼 java source create or replace and compile java source name... ...
  • Spark Streaming Spark Streaming 是Spark為了用戶實現流式計算的模型。 數據源包括Kafka,Flume,HDFS等。 DStream 離散化流(discretized stream), Spark Streaming 使用DStream作為抽象表示。是隨時間推移而 ...
  • 地址:http://www.sqlite.org/download.html組織形式可以看到source code是Amalgamation。真正的源碼在這裡什麼是Amalgamation下載源碼以後,打開時候這樣子的src文件夾里就是所有的代碼,大概有一百多個。那麼為啥還要有一個Amalga... ...
  • 在MongoDB(版本 3.2.9)中,數據的分發是指將collection的數據拆分成塊(chunk),分佈到不同的分片(shard)上,數據分發主要有2種方式:基於數據塊(chunk)數量的均衡分發和基於片鍵範圍(range)的定向分發。MongoDB內置均衡器(balancer),用於拆分塊和 ...
  • 索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含著對數據表裡所有記錄的引用指針。註:[1]索引不是萬能的!索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程式上彌補這一缺陷,許 多SQL命令都有一個DELAY_KEY_ ...
  • 轉載於:http://blog.csdn.net/wudongxu/article/details/8623610 SQL標准定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。 Read Uncom ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...