hadoop (十)hadoop序列化機(jī)制,linux 安裝eclipse气嫁,使用Maven

上節(jié)課我們一起學(xué)習(xí)了MapReduce的一個簡單實例鲸伴,這節(jié)課我們一起來學(xué)習(xí)Hadoop的序列化機(jī)制丐箩。

   首先我們來學(xué)習(xí)一下,什么叫做序列化此改,序列化是指把結(jié)構(gòu)化對象轉(zhuǎn)換成字節(jié)流趾撵,這樣做的目的當(dāng)然是便于在網(wǎng)絡(luò)中傳輸。那么什么叫做反序列化共啃?相信大家也知道了占调,反序列化,顧名思義移剪,就是序列化的逆過程究珊,也就是將字節(jié)流轉(zhuǎn)回結(jié)構(gòu)化對象的過程。

   我們非常熟悉的序列化莫過于java的java.io.Serializable了纵苛,在java程序中我們要序列化某個類剿涮,就給該類打個序列化的標(biāo)記,我們不用自己去序列化赶站,Java虛擬機(jī)會幫我們做好序列化的工作幔虏。那么既然java的jdk已經(jīng)有這么一套成熟的序列化機(jī)制了,為什么Hadoop沒有使用贝椿?這里我們舉個例子想括,假如我們定義了一個叫Animal的基類,該類有動物的一些公共屬性及方法烙博,比如動物會叫瑟蜈、會跑等烟逊,我們再定義一個Monkey類,該類繼承了Animal類铺根,很明顯宪躯,猴子也是動物,只不過猴子除了動物的一些公共特性外位迂,它還有自己特殊的特性访雪,比如猴子會爬樹、會吃香蕉等掂林。用我們的java序列化機(jī)制序列化Monkey這個類時臣缀,還要保存它與父類Animal的繼承結(jié)構(gòu)。反序列化時當(dāng)然這些也是需要保留的泻帮。我們Hadoop要序列化某個類是根本不需要保留它們的繼承結(jié)構(gòu)的精置,只需要能夠?qū)崿F(xiàn)持久化,能夠?qū)崿F(xiàn)快速傳遞就可以了锣杂。這樣的話脂倦,Java的序列化就會非常冗余,因此Hadoop沒有采用Java的序列化機(jī)制元莫,而是自己實現(xiàn)了一套序列化機(jī)制赖阻。

  Hadoop序列化的特點如下:

  1.  緊湊,高效使用存儲空間

  2.  快速踱蠢,讀寫數(shù)據(jù)的額外開銷小

  3.  可擴(kuò)展性政供,可透明地讀取老格式的數(shù)據(jù)

  4.  互操作,支持多語言的交互

  **Hadoop的序列化格式是:Writable**

  接下來我們通過查看Hadoop的一個類LongWritable的源碼來看一下Hadoop的序列化朽基。我們發(fā)現(xiàn)LongWritable實現(xiàn)了WritableCompareable接口,如下圖所示离陶。
image
 接下來我們來看一下WritableComparable這個接口稼虎,我們發(fā)現(xiàn)這個接口繼承了Writable、Comparable兩個接口招刨,其中Writable就是我們所說的Hadoop的序列化所要實現(xiàn)的接口霎俩,如下圖所示。
image
 我們點進(jìn)去Writable沉眶,我們發(fā)現(xiàn)該接口下定義了兩個接口方法打却,分別是write和readFields,其中write方法是把一個對象轉(zhuǎn)換為字節(jié)流谎倔,readFields是把字節(jié)流轉(zhuǎn)換成對象柳击。
image
 接下來我們來做一個實際的例子,該例子既用到了序列化的知識片习,又用到了大數(shù)據(jù)的知識捌肴。下面是某網(wǎng)吧提供的上網(wǎng)數(shù)據(jù)蹬叭,為了能讓大家更明白的看懂每列數(shù)據(jù)的意思,我為每列進(jìn)行了說明状知,大家使用數(shù)據(jù)的時候不用粘貼表頭秽五,只粘貼內(nèi)容就行了。我們現(xiàn)在的需求是饥悴,想要得到一天內(nèi)所有用戶上網(wǎng)總流量從高到低的一張列表坦喘。針對該需求,我們只需用到下面三列數(shù)據(jù)西设,分別是手機(jī)號瓣铣、上行流量、下行流量济榨。

 訪問時間        手機(jī)號或上網(wǎng)卡  網(wǎng)絡(luò)運營商的MAC地址           上網(wǎng)機(jī)器的IP           訪問網(wǎng)站             網(wǎng)址類型    上行包   下行包   上行流量  下行流量  狀態(tài)

1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 www.taobao.com 購物網(wǎng)站 24 27 2481 24681 200
1363157995052 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200
1363157991076 13926435656 20-10-7A-28-CC-0A:CMCC 120.196.100.99 2 4 132 1512 200
1363154400022 13926251106 5C-0E-8B-8B-B1-50:CMCC 120.197.40.4 4 0 240 0 200
1363157993044 18211575961 94-71-AC-CD-E6-18:CMCC-EASY 120.196.100.99 iface.qiyi.com 視頻網(wǎng)站 15 12 1527 2106 200
1363157995074 84138413 5C-0E-8B-8C-E8-20:7DaysInn 120.197.40.4 122.72.52.12 20 16 4116 1432 200
1363157993055 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200
1363157995033 15920133257 5C-0E-8B-C7-BA-20:CMCC 120.197.40.4 sug.so.# 信息安全 20 20 3156 2936 200
1363157983019 13719199419 68-A1-B7-03-07-B1:CMCC-EASY 120.196.100.82 4 0 240 0 200
1363157984041 13660577991 5C-0E-8B-92-5C-20:CMCC-EASY 120.197.40.4 s19.# 站點統(tǒng)計 24 9 6960 690 200
1363157973098 15013685858 5C-0E-8B-C7-F7-90:CMCC 120.197.40.4 sogou.com 搜索引擎 28 27 3659 3538 200
1363157986029 15989002119 E8-99-C4-4E-93-E0:CMCC-EASY 120.196.100.99 www.umeng.com 站點統(tǒng)計 3 3 1938 180 200
1363157992093 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 15 9 918 4938 200
1363157986041 13480253104 5C-0E-8B-C7-FC-80:CMCC-EASY 120.197.40.4 3 3 180 180 200
1363157984040 13602846565 5C-0E-8B-8B-B6-00:CMCC 120.197.40.4 2052. flash2qq.com 綜合門戶 15 12 1938 2910 200
1363157995093 13922314466 00-FD-07-A2-EC-BA:CMCC 120.196.100.82 img.qfc.cn 12 12 3008 3720 200
1363157982040 13502468823 5C-0A-5B-6A-0B-D4:CMCC-EASY 120.196.100.99 y0.ifengimg.com 綜合門戶 57 102 7335 110349 200
1363157986072 18320173382 84-25-DB-4F-10-1A:CMCC-EASY 120.196.100.99 sogou.com 搜索引擎 21 18 9531 2412 200
1363157990043 13925057413 00-1F-64-E1-E6-9A:CMCC 120.196.100.55 t3. baidu.com 搜索引擎 69 63 11058 48243 200
1363157988072 13760778710 00-FD-07-A4-7B-08:CMCC 120.196.100.82 2 2 120 120 200
1363157985066 13726238888 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200
1363157993055 13560436666 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200

上面的數(shù)據(jù)對應(yīng)的字段名稱坯沪、意義及列索引號如下圖所示。
image
 **我們要在Linux上使用Eclipse來進(jìn)行開發(fā)擒滑,所以我們要先從Eclipse官網(wǎng)下載Linux版本的Eclipse腐晾,具體請參考:http://blog.csdn.net/u012453843/article/details/52582846這篇文章來下載,只是選擇的版本是Linux而已丐一。下載完之后我們通過FileZilla工具把包上傳到Linux系統(tǒng)的root根目錄下(如果不知道怎么上傳藻糖,請參考:http://blog.csdn.net/u012453843/article/details/52422736這篇文章進(jìn)行操作),由于后面用到的Maven倉庫是m2.tar.gz库车,因此eclipse的版本不能太高巨柒,我原來用的是JEE Mars(4.5)版本,新建Maven工程時老是pom.xml報錯柠衍,說是找不到2.6版本的maven-resources-plugin.jar包洋满。我們看看m2文件夾下是否有2.6版本,如下圖所示珍坊,發(fā)現(xiàn)確實沒有牺勾。**

image

** 因此為了避免這種情況的發(fā)生,我們需要使用合適的JEE版本進(jìn)行開發(fā)阵漏,這里我們使用JEE Kepler(4.3)版本(這個版本的Eclipse大家也可以直接到:http://pan.baidu.com/s/1pLD5VLp這個地址進(jìn)行下載)驻民。如下圖所示。**

image

** 我們在Linux系統(tǒng)的root根目錄下看看我們剛才上傳上來的文件是否存在履怯,如下圖所示回还,發(fā)現(xiàn)確實已經(jīng)上傳上來了。**

image

** 接下來我們便要解壓該壓縮包了叹洲,解壓我們使用命令:tar -zxvf eclipse-jee-kepler-SR2-linux-gtk-x86_64.tar.gz -C /usr/local/然后按回車柠硕,便開始解壓了,解壓成功之后运提,我們想要在Linux系統(tǒng)上創(chuàng)建Eclipse的快捷方式(這樣的話我們操作非常方便)仅叫,創(chuàng)建快捷方式的步驟如下:**

** 1.在桌面右鍵帜篇,在右鍵菜單中點擊“Create Launcher”,如下圖所示诫咱。**

image

** 2.點擊上圖的"Create Launcher..."之后笙隙,會進(jìn)入如下圖所示界面,Name我們填上eclipse坎缭,Command我們點擊它后面的"Browse..."按鈕竟痰。**

image

** 3.點擊上圖的"Browse..."按鈕之后我們會看到如下圖所示的界面,我們先點擊左側(cè)的"File System"---->然后在右側(cè)的文件列表中點擊"usr"---->然后在"usr"的子目錄下點擊"local"------>然后在"local"的子目錄下點擊"eclipse"------->在"eclipse"文件夾下我們發(fā)現(xiàn)有一個eclipse文件掏呼,我們選中它坏快,然后點擊圖片下端的"open"按鈕。**

image

** 4.接下來我們來更改一下Launcher默認(rèn)給我提供的快捷鍵圖標(biāo)憎夷,因為默認(rèn)提供的是一個彈簧莽鸿,如下圖所示,我們點擊那個圖標(biāo)拾给。**

image

** 5.點擊那個彈簧圖標(biāo)之后祥得,會彈出一個窗口,我們依然選擇跟第3步一樣的目錄蒋得,在該目錄下有一個eclipse自帶的logo级及,如下圖所示,我們點擊圖中的icon.xpm额衙,然后點擊"open"按鈕饮焦。**

image

** 6.我們選擇eclipse的默認(rèn)logo之后如下圖所示,發(fā)現(xiàn)原來的彈簧圖標(biāo)被取代了窍侧,我們點擊"OK"按鈕县踢。**

image

** 7.最后我們再來看看桌面,發(fā)現(xiàn)我們已經(jīng)成功創(chuàng)建了Eclipse的快捷圖標(biāo)伟件。**

image

** 創(chuàng)建好了Eclipse殿雪,就跟我們在Windows下開發(fā)一樣了,由于現(xiàn)在Maven比較火锋爪,所以我們來學(xué)習(xí)一下如何創(chuàng)建一個Maven工程并且用Maven來管理我們的jar包。**

** 既然Maven可以幫我們自動關(guān)聯(lián)相關(guān)的jar包爸业,那我們就得有jar包讓它管理啊其骄,Maven所要管理的jar包都在一個壓縮包m2.tar.gz當(dāng)中,大家如果沒有這個壓縮包的話可以去這個地址:http://pan.baidu.com/s/1c1IvLg0進(jìn)行下載扯旷。**

** 下載完之后我們通過FileZilla工具把這個壓縮包上傳到我們的Linux系統(tǒng)的root根目錄下拯爽,不懂上傳的,可以參考:**http://blog.csdn.net/u012453843/article/details/52422736這篇文章進(jìn)行上傳钧忽。****

**** 上傳到root根目錄下之后毯炮,我們查看一下文件列表逼肯,發(fā)現(xiàn)確實已經(jīng)上傳上來了,如下圖所示桃煎。****

****
image

****

**** 解下來我們使用tar -zxvf m2.tar.gz命令來解壓該文件篮幢,解壓完之后,我們查看解壓完后的文件.m2为迈,這個文件是個隱藏文件三椿,因此我們得通過命令:ls -la來查看,如下圖所示葫辐。****

****
image

****

**** 我們接下來看一下某一個文件夾的jar包搜锰。當(dāng)然這只是看了一個文件夾下的jar包。大家可以看一下其他文件夾下的jar包耿战。****

****
image

****

** 我們雙擊打開Eclipse蛋叼,然后點擊"File"--->"New"----->"Maven Project",如下圖所示**

image

** 點擊上圖的"Maven Project"之后剂陡,我們會進(jìn)入到如下圖所示界面**

image

** 點擊上圖"Next"之后狈涮,我們進(jìn)入到如下圖所示界面,Artifact Id是我們的工程名鹏倘,我們分別起個名字薯嗤,然后點擊"Finish"**

image

** 點擊上圖的"Finish"之后我們便創(chuàng)建好了一個Maven工程,如下圖所示**

image

** 接下來我們修改pom.xml文件纤泵,在打開這個文件的時候骆姐,遇到了一個問題就是Eclipse會莫名其妙的關(guān)閉,不知道是什么原因捏题,從網(wǎng)上找了一通玻褪,有篇文章給出的解決辦法是到eclipse的安裝目錄下修改eclipse.ini文件,在這個文件的末尾加上:-Dorg.eclipse.swt.internal.gtk.cairoGraphics=false這么一句話公荧,操作步驟如下圖所示带射。**

image

** 我們再次打開Eclipse,修改pom.xml文件循狰,加入hadoop的配置窟社,如下圖所示,我們注意一下绪钥,在我點保存pom.xml文件之前灿里,我們發(fā)現(xiàn)左側(cè)文件列表中Maven Dependencies下什么文件也沒有,看下圖程腹。**

image

** 點擊保存pom.xml文件之后匣吊,Maven會自動幫我們引進(jìn)來我們所需要的jar包,如下圖所示**

image

** 接下來我們再來配置另外一個依賴,兩個配置如下色鸳。**

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.myhadoop.mr</groupId>
<artifactId>datacount</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
</project>

** 配置完之后我們便開始寫程序了社痛,首先我們在src/main/java目錄下新建一個類DataCount,如下圖所示**

image

** 接下來我們便在DataCount類里面寫內(nèi)容了命雀,有個問題需要先解決的是代碼自動提示功能蒜哀,由于Linux系統(tǒng)與Windows系統(tǒng)有差異,我們在輸入syso之后按“Alt”+“/”并沒有像在Windows系統(tǒng)上那樣自動給我們補全咏雌,如下圖所示凡怎。**

image

** 接下來我們來解決這個不會自動補全的問題,我們點擊“Windows”--------->然后點擊"Refrences"--------->在彈出的對話框中輸入keys------->點擊搜索出來的Keys--------->在右側(cè)搜索框輸入"content"---------->下面搜索的結(jié)果第一行是"Content Assist"赊抖,下面Binding的內(nèi)容默認(rèn)是Ctrl+Space统倒,這不是我們所熟悉的快捷方式。**

image

** 我們把上圖的Binding的內(nèi)容改成"Alt"+"/"氛雪,When我們選擇"Edting Java Source"房匆。其中Binding這一欄的內(nèi)容"Alt"+"/"不是手寫進(jìn)去的,因為無法手寫报亩,而是先按"Alt"鍵浴鸿,按住不放,接著按"/"鍵弦追,就會出現(xiàn)"Alt"+"/"了岳链。配完之后我們先點擊"Apply"然后點擊"OK",這時我們再輸入syso之后按**"Alt"+"/"快捷鍵會發(fā)現(xiàn)已經(jīng)可以自動補全了劲件!****

image

** 接著我們來寫程序掸哑,由于我們要輸出的結(jié)果是上行流量、下行流量零远、總流量苗分,一個變量無法處理,因此我們需要定義一個Bean類來存儲我們的結(jié)果牵辣,Bean代碼如下摔癣。**

package myhadoop.mr.dc;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Writable;

public class DataBean implements Writable{
//手機(jī)號
private String telNo;
//上行流量
private long upPayLoad;
//下行流量
private long downPayLoad;
//總流量
private long totalPayLoad;

//序列化
//注意:序列化和反序列化一定要注意類型和順序,比如我們序列化的時候先序列化字符串telNo纬向,反序列化的時候就應(yīng)該先反序列化telNo
public void write(DataOutput out) throws IOException {
out.writeUTF(telNo);
out.writeLong(upPayLoad);
out.writeLong(downPayLoad);
out.writeLong(totalPayLoad);
}

//反序列化
public void readFields(DataInput in) throws IOException {
this.telNo=in.readUTF();
this.upPayLoad=in.readLong();
this.downPayLoad=in.readLong();
this.totalPayLoad=in.readLong();
}

public DataBean(){}

public DataBean(String telNo, long upPayLoad, long downPayLoad,
long totalPayLoad) {
super();
this.telNo = telNo;
this.upPayLoad = upPayLoad;
this.downPayLoad = downPayLoad;
this.totalPayLoad = upPayLoad+downPayLoad;
}

@Override
public String toString() {
return this.upPayLoad+"\t"+this.downPayLoad+"\t"+this.totalPayLoad;
}

public String getTelNo() {
return telNo;
}

public void setTelNo(String telNo) {
this.telNo = telNo;
}

public long getUpPayLoad() {
return upPayLoad;
}

public void setUpPayLoad(long upPayLoad) {
this.upPayLoad = upPayLoad;
}

public long getDownPayLoad() {
return downPayLoad;
}

public void setDownPayLoad(long downPayLoad) {
this.downPayLoad = downPayLoad;
}

public long getTotalPayLoad() {
return totalPayLoad;
}

public void setTotalPayLoad(long totalPayLoad) {
this.totalPayLoad = totalPayLoad;
}

}

DataCount類完整代碼如下择浊。

package myhadoop.mr.dc;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class DataCount {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
Job job=Job.getInstance(conf);

  job.setJarByClass(DataCount.class);

  job.setMapperClass(DCMapper.class);
  job.setMapOutputKeyClass(Text.class);
  job.setMapOutputValueClass(DataBean.class);
  FileInputFormat.setInputPaths(job, new Path(args[0]));

  job.setReducerClass(DCReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(DataBean.class);
  FileOutputFormat.setOutputPath(job, new Path(args[1]));

  job.waitForCompletion(true);

}

public static class DCMapper extends Mapper<LongWritable, Text, Text, DataBean>{
  Text text=null;

@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line=value.toString();
String[] fields=line.split("\t");

//我們要使用的數(shù)據(jù)的第二列(列索引號為1)就是手機(jī)號榄鉴,第9列(列索引號8)是上行流量域慷,第10列(列索引號9)是下行流量
String telNo=fields[1];
long up=Long.parseLong(fields[8]);
long down=Long.parseLong(fields[9]);
DataBean bean=new DataBean(telNo, up, down);
text=new Text(telNo);
context.write(text,bean);
}
}

public static class DCReducer extends Reducer<Text, DataBean, Text, DataBean>{

@Override
protected void reduce(Text key, Iterable<DataBean> v2s,Context context)
throws IOException, InterruptedException {
long up_sum=0;
long down_sum=0;
for(DataBean bean:v2s){
up_sum+=bean.getUpPayLoad();
down_sum+=bean.getDownPayLoad();
}
DataBean bean=new DataBean(key.toString(), up_sum, down_sum);
context.write(key, bean);
}
}
}

接下來開始導(dǎo)出Jar包审编,如下圖所示么翰,我們在工程datacount上右鍵,在下拉菜單中點擊"Export"杈绸,會彈出如下圖右側(cè)的彈出框辆布,在彈出框我們選擇Java目錄下的JAR file然后點擊"Next"

image
**點擊上圖的"Next"之后我們會進(jìn)入到如下圖所示的界面丘侠,我們勾選上第二項(Export all output folders for checked projects ----導(dǎo)出工程下的所有文件)危彩,下面的JAR file我們可以通過點擊Browser選擇一個目錄攒磨,這里我選擇的是root根目錄,導(dǎo)出的Jar包的名字我起名為examples.jar汤徽,然后我們點擊"Finish"**

image

** 接下來我們把上網(wǎng)的元數(shù)據(jù)上傳到root根目錄下(元數(shù)據(jù)大家可以到http://download.csdn.net/detail/u012453843/9640894這個地址進(jìn)行下載)娩缰,上傳完之后我們查看一下root根目錄是否有我們要用到的文件,發(fā)現(xiàn)我們剛上傳的HTTP_20130313143750.dat文件還有我們上面剛打成的jar包examples.jar都在root根目錄下谒府。**

image

** 接下來我們需要把**HTTP_20130313143750.dat上傳到HDFS系統(tǒng)根目錄下拼坎,我們的HDFS默認(rèn)情況是關(guān)閉的,因此我們需要先開啟HDFS完疫,我們可能會忘掉Hadoop當(dāng)時放到哪兒了泰鸡,那么which haoop便可以幫我們快速定位,顯示的位置是/itcast/hadoop-2.2.0/bin/hadoop壳鹤,因此我們便知道去哪個目錄了盛龄,我們進(jìn)入到hadoop-2.2.0下面的sbin目錄中,使用命令./start-dfs.sh和./start-yarn.sh來分別開啟HDFS和Yarn芳誓,開啟完之后我們檢查一下是否成功余舶,使用命令jps來查看進(jìn)程,發(fā)現(xiàn)所有的進(jìn)程都正常啟動了(如果某進(jìn)程未啟動锹淌,可以先關(guān)掉dfs或yarn再重新啟動就可以了匿值。)****

image
  **接下來我們把上網(wǎng)源數(shù)據(jù)上傳到HDFS根目錄下,在上傳之前先檢查HDFS根目錄下是否已經(jīng)有相同個文件了赂摆,使用的命令是hadoop  fs  -ls  /挟憔,我們發(fā)現(xiàn)當(dāng)前HDFS系統(tǒng)根目錄下只有一個文件。**

image

** 這時我們才開始上傳库正,使用命令:hadoop fs -put HTTP_20130313143750.dat /data.dat來上傳曲楚,上傳完之后我們再查看HDFS系統(tǒng)根目錄,發(fā)現(xiàn)我們的文件已經(jīng)上傳成功褥符。**

image

** 有了data.dat文件之后龙誊,我們便開始執(zhí)行examples.jar這個程序了,使用命令:hadoop jar examples.jar myhadoop.mr.dc.DataCount /data.dat /dataout并按回車喷楣,程序開始執(zhí)行趟大,執(zhí)行完之后,我們使用命令:hadoop fs -ls /dataout查看一下dataout這個文件夾下都有哪些文件铣焊,發(fā)現(xiàn)有兩個文件逊朽,我們使用命令:hadoop fs -cat /dataout/part-r-00000/來查看part-r-00000這個文件的內(nèi)容,發(fā)現(xiàn)程序確實已經(jīng)幫我統(tǒng)計好了所以有用戶的上網(wǎng)流量信息曲伊。第一列是手機(jī)號或上網(wǎng)卡叽讳,第二列是上行流量追他,第三列是下行流量,第四列是總流量(上行流量加下行流量)岛蚤,生成的結(jié)果是沒問題的邑狸,大家可以通過對比data.dat文件中的內(nèi)容進(jìn)行驗證。**

image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涤妒,一起剝皮案震驚了整個濱河市单雾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌她紫,老刑警劉巖硅堆,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贿讹,居然都是意外死亡渐逃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門围详,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朴乖,“玉大人,你說我怎么就攤上這事助赞÷蛐撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵雹食,是天一觀的道長畜普。 經(jīng)常有香客問我,道長群叶,這世上最難降的妖魔是什么吃挑? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮街立,結(jié)果婚禮上舶衬,老公的妹妹穿的比我還像新娘。我一直安慰自己赎离,他們只是感情好逛犹,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梁剔,像睡著了一般虽画。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荣病,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天码撰,我揣著相機(jī)與錄音,去河邊找鬼个盆。 笑死脖岛,一個胖子當(dāng)著我的面吹牛朵栖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柴梆,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼混槐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轩性?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狠鸳,失蹤者是張志新(化名)和其女友劉穎揣苏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體件舵,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡卸察,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铅祸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑质。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖临梗,靈堂內(nèi)的尸體忽然破棺而出涡扼,到底是詐尸還是另有隱情,我是刑警寧澤盟庞,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布吃沪,位于F島的核電站,受9級特大地震影響什猖,放射性物質(zhì)發(fā)生泄漏票彪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一不狮、第九天 我趴在偏房一處隱蔽的房頂上張望降铸。 院中可真熱鬧,春花似錦摇零、人聲如沸推掸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽终佛。三九已至,卻和暖如春雾家,著一層夾襖步出監(jiān)牢的瞬間铃彰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工芯咧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留牙捉,地道東北人竹揍。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像邪铲,于是被迫代替她去往敵國和親芬位。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容