大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式_第1頁(yè)
大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式_第2頁(yè)
大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式_第3頁(yè)
大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式_第4頁(yè)
大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

大數(shù)據(jù)處理框架:Hadoop:Hadoop數(shù)據(jù)存儲(chǔ)格式1大數(shù)據(jù)處理框架:Hadoop概述1.1Hadoop的歷史與發(fā)展Hadoop是一個(gè)開(kāi)源的分布式計(jì)算框架,由Apache軟件基金會(huì)維護(hù)。它的起源可以追溯到2004年,當(dāng)時(shí)雅虎的工程師DougCutting和MikeCafarella基于Google發(fā)表的兩篇論文——《GoogleFileSystem》和《MapReduce:SimplifiedDataProcessingonLargeClusters》——開(kāi)始開(kāi)發(fā)Hadoop。最初,Hadoop旨在為大規(guī)模數(shù)據(jù)提供存儲(chǔ)和處理能力,隨著時(shí)間的推移,它逐漸發(fā)展成為一個(gè)能夠支持多種數(shù)據(jù)處理任務(wù)的平臺(tái)。1.1.1Hadoop的歷史2004年:Hadoop項(xiàng)目啟動(dòng),最初是為了支持Nutch,一個(gè)開(kāi)源的網(wǎng)絡(luò)搜索引擎。2006年:Hadoop成為Apache的頂級(jí)項(xiàng)目。2008年:Hadoop開(kāi)始被廣泛應(yīng)用于各種大數(shù)據(jù)處理場(chǎng)景,包括搜索引擎、社交網(wǎng)絡(luò)和廣告系統(tǒng)。2011年:Hadoop生態(tài)系統(tǒng)擴(kuò)展,引入了Hive、Pig、HBase等工具,使得數(shù)據(jù)處理更加靈活和高效。2015年:Hadoop3.0發(fā)布,引入了對(duì)新硬件的支持,如固態(tài)硬盤(pán)和高內(nèi)存服務(wù)器,以及改進(jìn)的性能和安全性。1.1.2Hadoop的發(fā)展Hadoop的發(fā)展不僅體現(xiàn)在技術(shù)的不斷進(jìn)步上,還體現(xiàn)在其生態(tài)系統(tǒng)中工具的豐富和成熟。從最初的HDFS和MapReduce,到后來(lái)的YARN、Spark、Flink等,Hadoop已經(jīng)從一個(gè)單一的數(shù)據(jù)處理框架演變?yōu)橐粋€(gè)完整的生態(tài)系統(tǒng),能夠支持從數(shù)據(jù)存儲(chǔ)、處理到分析的全流程。1.2Hadoop的核心組件介紹Hadoop的核心組件主要包括HDFS(HadoopDistributedFileSystem)、MapReduce和YARN(YetAnotherResourceNegotiator)。這些組件共同構(gòu)成了Hadoop的基礎(chǔ)架構(gòu),為大數(shù)據(jù)處理提供了必要的支持。1.2.1HDFSHDFS是Hadoop的分布式文件系統(tǒng),它能夠存儲(chǔ)大量的數(shù)據(jù),并提供高吞吐量的數(shù)據(jù)訪(fǎng)問(wèn)能力,適合處理大規(guī)模數(shù)據(jù)集。HDFS將數(shù)據(jù)分成多個(gè)塊(默認(rèn)大小為128MB),并存儲(chǔ)在集群中的多個(gè)節(jié)點(diǎn)上,以實(shí)現(xiàn)數(shù)據(jù)的冗余和高可用性。HDFS的特性容錯(cuò)性:HDFS自動(dòng)復(fù)制數(shù)據(jù)塊,確保數(shù)據(jù)的可靠性。高吞吐量:適合大規(guī)模數(shù)據(jù)集的處理,提供高速的數(shù)據(jù)讀寫(xiě)能力??蓴U(kuò)展性:能夠輕松地?cái)U(kuò)展到成千上萬(wàn)的節(jié)點(diǎn),支持PB級(jí)別的數(shù)據(jù)存儲(chǔ)。HDFS的使用示例#將本地文件上傳到HDFS

hadoopfs-put/local/path/to/file/hdfs/path/to/destination

#從HDFS下載文件到本地

hadoopfs-get/hdfs/path/to/file/local/path/to/destination

#查看HDFS中的文件列表

hadoopfs-ls/hdfs/path/to/directory1.2.2MapReduceMapReduce是Hadoop的分布式數(shù)據(jù)處理模型,它將數(shù)據(jù)處理任務(wù)分解為Map和Reduce兩個(gè)階段,能夠并行處理大規(guī)模數(shù)據(jù)集。Map階段負(fù)責(zé)將輸入數(shù)據(jù)轉(zhuǎn)換為鍵值對(duì),Reduce階段則負(fù)責(zé)匯總這些鍵值對(duì),生成最終的輸出。MapReduce的工作流程Split:將輸入文件分割成多個(gè)小塊。Map:每個(gè)Map任務(wù)處理一個(gè)數(shù)據(jù)塊,將數(shù)據(jù)轉(zhuǎn)換為鍵值對(duì)。Shuffle:將Map任務(wù)產(chǎn)生的鍵值對(duì)按鍵進(jìn)行排序和分組。Reduce:每個(gè)Reduce任務(wù)處理一組相同鍵的鍵值對(duì),生成最終的輸出。MapReduce的使用示例//MapReduce示例:計(jì)算文件中單詞的頻率

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.IntWritable;

importorg.apache.hadoop.io.Text;

importorg.apache.hadoop.mapreduce.Job;

importorg.apache.hadoop.mapreduce.Mapper;

importorg.apache.hadoop.mapreduce.Reducer;

importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;

importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

publicclassWordCount{

publicstaticclassTokenizerMapper

extendsMapper<Object,Text,Text,IntWritable>{

privatefinalstaticIntWritableone=newIntWritable(1);

privateTextword=newText();

publicvoidmap(Objectkey,Textvalue,Contextcontext

)throwsIOException,InterruptedException{

//代碼省略,此處應(yīng)實(shí)現(xiàn)將輸入文本分割為單詞,并輸出鍵值對(duì)(word,1)

}

}

publicstaticclassIntSumReducer

extendsReducer<Text,IntWritable,Text,IntWritable>{

privateIntWritableresult=newIntWritable();

publicvoidreduce(Textkey,Iterable<IntWritable>values,

Contextcontext

)throwsIOException,InterruptedException{

intsum=0;

for(IntWritableval:values){

sum+=val.get();

}

result.set(sum);

context.write(key,result);

}

}

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=newConfiguration();

Jobjob=Job.getInstance(conf,"wordcount");

job.setJarByClass(WordCount.class);

job.setMapperClass(TokenizerMapper.class);

job.setCombinerClass(IntSumReducer.class);

job.setReducerClass(IntSumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

FileInputFormat.addInputPath(job,newPath(args[0]));

FileOutputFormat.setOutputPath(job,newPath(args[1]));

System.exit(job.waitForCompletion(true)?0:1);

}

}1.2.3YARNYARN(YetAnotherResourceNegotiator)是Hadoop的資源管理和調(diào)度系統(tǒng),它負(fù)責(zé)為Hadoop集群中的各種應(yīng)用程序分配資源。YARN的引入使得Hadoop能夠支持更多的數(shù)據(jù)處理框架,如Spark和Flink,而不僅僅是MapReduce。YARN的架構(gòu)YARN主要由ResourceManager、NodeManager和ApplicationMaster三個(gè)組件構(gòu)成。ResourceManager負(fù)責(zé)整個(gè)集群的資源管理和調(diào)度,NodeManager負(fù)責(zé)單個(gè)節(jié)點(diǎn)上的資源管理和任務(wù)執(zhí)行,而ApplicationMaster則負(fù)責(zé)應(yīng)用程序的生命周期管理。YARN的使用示例#提交一個(gè)MapReduce作業(yè)到Y(jié)ARN

hadoopjar/path/to/your/job.jarWordCount/input/output通過(guò)上述介紹,我們可以看到Hadoop作為一個(gè)成熟的大數(shù)據(jù)處理框架,其核心組件HDFS、MapReduce和YARN各自承擔(dān)著不同的角色,共同為大數(shù)據(jù)處理提供了強(qiáng)大的支持。2Hadoop數(shù)據(jù)存儲(chǔ):HDFS2.1HDFS的架構(gòu)與原理HadoopDistributedFileSystem(HDFS)是Hadoop生態(tài)系統(tǒng)中的分布式文件系統(tǒng),它被設(shè)計(jì)用于存儲(chǔ)海量數(shù)據(jù)。HDFS的架構(gòu)主要由三部分組成:NameNode、DataNode和Client。NameNode:作為HDFS的主節(jié)點(diǎn),NameNode負(fù)責(zé)管理文件系統(tǒng)的命名空間和客戶(hù)端對(duì)文件的訪(fǎng)問(wèn)。它存儲(chǔ)了文件系統(tǒng)元數(shù)據(jù),包括文件和目錄的名稱(chēng)、權(quán)限和屬性,以及文件塊的位置信息。DataNode:DataNode是HDFS的工作節(jié)點(diǎn),負(fù)責(zé)存儲(chǔ)實(shí)際的數(shù)據(jù)塊。每個(gè)DataNode會(huì)定期向NameNode發(fā)送心跳信號(hào),報(bào)告其狀態(tài)和存儲(chǔ)的數(shù)據(jù)塊信息。Client:客戶(hù)端是與HDFS交互的用戶(hù)程序。它通過(guò)與NameNode通信來(lái)獲取文件塊的位置信息,然后直接與DataNode進(jìn)行數(shù)據(jù)的讀寫(xiě)操作。HDFS采用了數(shù)據(jù)塊(Block)的概念來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)文件會(huì)被分割成多個(gè)數(shù)據(jù)塊存儲(chǔ)在不同的DataNode上。默認(rèn)的數(shù)據(jù)塊大小是128MB,這有助于提高存儲(chǔ)效率和數(shù)據(jù)讀取速度。2.2HDFS的數(shù)據(jù)塊管理HDFS的數(shù)據(jù)塊管理機(jī)制確保了數(shù)據(jù)的可靠性和高可用性。當(dāng)一個(gè)文件被寫(xiě)入HDFS時(shí),它會(huì)被分割成多個(gè)數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊會(huì)被復(fù)制多份(默認(rèn)是3份)并存儲(chǔ)在不同的DataNode上。這種冗余存儲(chǔ)策略可以防止數(shù)據(jù)丟失,即使某個(gè)DataNode出現(xiàn)故障,數(shù)據(jù)仍然可以從其他DataNode上恢復(fù)。2.2.1數(shù)據(jù)塊復(fù)制數(shù)據(jù)塊的復(fù)制是自動(dòng)進(jìn)行的,由NameNode負(fù)責(zé)監(jiān)控和管理。如果NameNode檢測(cè)到某個(gè)數(shù)據(jù)塊的副本數(shù)低于設(shè)定的閾值,它會(huì)觸發(fā)DataNode進(jìn)行數(shù)據(jù)塊的復(fù)制,以確保數(shù)據(jù)的冗余度。2.2.2數(shù)據(jù)塊位置數(shù)據(jù)塊的位置信息對(duì)HDFS的性能至關(guān)重要。NameNode維護(hù)了一個(gè)全局的數(shù)據(jù)塊位置表,記錄了每個(gè)數(shù)據(jù)塊的所有副本的存儲(chǔ)位置。當(dāng)客戶(hù)端請(qǐng)求讀取文件時(shí),NameNode會(huì)返回離客戶(hù)端最近的數(shù)據(jù)塊副本的位置,以減少網(wǎng)絡(luò)延遲。2.3HDFS的讀寫(xiě)流程HDFS的讀寫(xiě)操作是通過(guò)客戶(hù)端與NameNode和DataNode之間的交互來(lái)完成的。2.3.1寫(xiě)入流程客戶(hù)端請(qǐng)求寫(xiě)入:客戶(hù)端向NameNode發(fā)送寫(xiě)入請(qǐng)求,包括文件名和要寫(xiě)入的數(shù)據(jù)大小。NameNode分配數(shù)據(jù)塊:NameNode根據(jù)文件的大小和數(shù)據(jù)塊的大小,分配一系列的數(shù)據(jù)塊,并告訴客戶(hù)端第一個(gè)數(shù)據(jù)塊的DataNode位置??蛻?hù)端寫(xiě)入數(shù)據(jù)塊:客戶(hù)端開(kāi)始向第一個(gè)DataNode寫(xiě)入數(shù)據(jù)。當(dāng)數(shù)據(jù)塊寫(xiě)滿(mǎn)后,客戶(hù)端會(huì)請(qǐng)求NameNode分配下一個(gè)數(shù)據(jù)塊,并重復(fù)此過(guò)程。數(shù)據(jù)塊復(fù)制:在寫(xiě)入數(shù)據(jù)塊的同時(shí),DataNode會(huì)將數(shù)據(jù)塊復(fù)制到其他DataNode上,以確保數(shù)據(jù)的冗余度。確認(rèn)寫(xiě)入:當(dāng)所有數(shù)據(jù)塊都被寫(xiě)入并復(fù)制完成后,客戶(hù)端會(huì)向NameNode發(fā)送確認(rèn)信息,NameNode會(huì)更新元數(shù)據(jù)信息,包括文件的大小和數(shù)據(jù)塊的位置。2.3.2讀取流程客戶(hù)端請(qǐng)求讀?。嚎蛻?hù)端向NameNode發(fā)送讀取請(qǐng)求,包括文件名和要讀取的數(shù)據(jù)范圍。NameNode返回?cái)?shù)據(jù)塊位置:NameNode會(huì)查找文件的元數(shù)據(jù),返回客戶(hù)端請(qǐng)求的數(shù)據(jù)塊的位置信息??蛻?hù)端直接讀取DataNode:客戶(hù)端根據(jù)NameNode返回的數(shù)據(jù)塊位置,直接從DataNode讀取數(shù)據(jù)。為了提高讀取速度,客戶(hù)端會(huì)優(yōu)先選擇離它最近的DataNode進(jìn)行讀取。2.3.3示例代碼:使用JavaAPI寫(xiě)入和讀取HDFS文件importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importjava.io.IOException;

import.URI;

publicclassHDFSExample{

publicstaticvoidmain(String[]args)throwsIOException{

//HDFS的URI

StringhdfsURI="hdfs://localhost:9000";

//配置信息

Configurationconf=newConfiguration();

//獲取HDFS文件系統(tǒng)實(shí)例

FileSystemfs=FileSystem.get(URI.create(hdfsURI),conf);

//寫(xiě)入文件

Pathsrc=newPath("localfile.txt");

Pathdst=newPath("/hdfsfile.txt");

fs.copyFromLocalFile(src,dst);

//讀取文件

PathreadPath=newPath("/hdfsfile.txt");

fs.copyToLocalFile(readPath,src);

//關(guān)閉文件系統(tǒng)

fs.close();

}

}在上述代碼中,我們首先創(chuàng)建了一個(gè)Configuration對(duì)象來(lái)配置HDFS的URI,然后使用FileSystem.get()方法獲取HDFS文件系統(tǒng)的實(shí)例。接著,我們使用copyFromLocalFile()方法將本地文件localfile.txt寫(xiě)入HDFS,文件路徑為/hdfsfile.txt。最后,我們使用copyToLocalFile()方法將HDFS中的文件讀取回本地。2.4總結(jié)HDFS通過(guò)其獨(dú)特的架構(gòu)和數(shù)據(jù)塊管理機(jī)制,為大數(shù)據(jù)處理提供了可靠和高效的存儲(chǔ)解決方案。理解HDFS的架構(gòu)、數(shù)據(jù)塊管理和讀寫(xiě)流程對(duì)于有效利用Hadoop進(jìn)行大數(shù)據(jù)處理至關(guān)重要。通過(guò)使用HDFS的JavaAPI,我們可以輕松地在HDFS上進(jìn)行文件的讀寫(xiě)操作,從而實(shí)現(xiàn)對(duì)大數(shù)據(jù)的高效處理和分析。3Hadoop數(shù)據(jù)存儲(chǔ)格式詳解3.1TextFile存儲(chǔ)格式TextFile是最簡(jiǎn)單的Hadoop數(shù)據(jù)存儲(chǔ)格式,它將數(shù)據(jù)存儲(chǔ)為純文本文件。每個(gè)記錄通常是一行,行與行之間用換行符分隔。這種格式易于理解和處理,但效率較低,因?yàn)槊看巫x取或?qū)懭霐?shù)據(jù)時(shí),都需要進(jìn)行字符串解析和轉(zhuǎn)換。3.1.1示例假設(shè)我們有一個(gè)日志文件,其中包含用戶(hù)訪(fǎng)問(wèn)網(wǎng)站的記錄,每行代表一個(gè)用戶(hù)的訪(fǎng)問(wèn)記錄,格式如下:user_id,timestamp,url

1,1592345678,"/page1"

2,1592345689,"/page2"在Hadoop中,我們可以使用MapReduce作業(yè)來(lái)處理這些數(shù)據(jù)。下面是一個(gè)簡(jiǎn)單的MapReduce示例,用于計(jì)算每個(gè)URL的訪(fǎng)問(wèn)次數(shù):importjava.io.IOException;

importjava.util.StringTokenizer;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.IntWritable;

importorg.apache.hadoop.io.LongWritable;

importorg.apache.hadoop.io.Text;

importorg.apache.hadoop.mapreduce.Job;

importorg.apache.hadoop.mapreduce.Mapper;

importorg.apache.hadoop.mapreduce.Reducer;

importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;

importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

publicclassURLCounter{

publicstaticclassTokenizerMapper

extendsMapper<LongWritable,Text,Text,IntWritable>{

privatefinalstaticIntWritableone=newIntWritable(1);

privateTextword=newText();

publicvoidmap(LongWritablekey,Textvalue,Contextcontext

)throwsIOException,InterruptedException{

StringTokenizeritr=newStringTokenizer(value.toString());

while(itr.hasMoreTokens()){

word.set(itr.nextToken());

context.write(word,one);

}

}

}

publicstaticclassIntSumReducer

extendsReducer<Text,IntWritable,Text,IntWritable>{

privateIntWritableresult=newIntWritable();

publicvoidreduce(Textkey,Iterable<IntWritable>values,

Contextcontext

)throwsIOException,InterruptedException{

intsum=0;

for(IntWritableval:values){

sum+=val.get();

}

result.set(sum);

context.write(key,result);

}

}

publicstaticvoidmain(String[]args)throwsException{

Configurationconf=newConfiguration();

Jobjob=Job.getInstance(conf,"urlcounter");

job.setJarByClass(URLCounter.class);

job.setMapperClass(TokenizerMapper.class);

job.setCombinerClass(IntSumReducer.class);

job.setReducerClass(IntSumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

FileInputFormat.addInputPath(job,newPath(args[0]));

FileOutputFormat.setOutputPath(job,newPath(args[1]));

System.exit(job.waitForCompletion(true)?0:1);

}

}在這個(gè)例子中,我們使用TokenizerMapper來(lái)解析每一行數(shù)據(jù),提取URL,并使用IntSumReducer來(lái)計(jì)算每個(gè)URL的訪(fǎng)問(wèn)次數(shù)。3.2SequenceFile存儲(chǔ)格式SequenceFile是Hadoop的二進(jìn)制存儲(chǔ)格式,它比TextFile更高效,因?yàn)樗恍枰M(jìn)行字符串解析。SequenceFile可以存儲(chǔ)鍵值對(duì),其中鍵和值可以是任何HadoopWritable類(lèi)型。3.2.1示例下面是一個(gè)使用SequenceFile存儲(chǔ)用戶(hù)訪(fǎng)問(wèn)記錄的例子。首先,我們需要定義一個(gè)UserVisit類(lèi),它實(shí)現(xiàn)了Writable接口:importorg.apache.hadoop.io.Writable;

importjava.io.DataInput;

importjava.io.DataOutput;

importjava.io.IOException;

publicclassUserVisitimplementsWritable{

privateintuserId;

privatelongtimestamp;

privateStringurl;

publicUserVisit(){}

publicUserVisit(intuserId,longtimestamp,Stringurl){

this.userId=userId;

this.timestamp=timestamp;

this.url=url;

}

publicvoidwrite(DataOutputout)throwsIOException{

out.writeInt(userId);

out.writeLong(timestamp);

out.writeUTF(url);

}

publicvoidreadFields(DataInputin)throwsIOException{

userId=in.readInt();

timestamp=in.readLong();

url=in.readUTF();

}

@Override

publicStringtoString(){

returnuserId+","+timestamp+","+url;

}

}然后,我們可以使用SequenceFile.Writer來(lái)將數(shù)據(jù)寫(xiě)入SequenceFile:importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.SequenceFile;

importorg.apache.hadoop.io.Text;

importjava.io.IOException;

import.URI;

publicclassUserVisitWriter{

publicstaticvoidmain(String[]args)throwsIOException{

FileSystemfs=FileSystem.get(URI.create("hdfs://localhost:9000"),newConfiguration());

SequenceFile.Writerwriter=SequenceFile.createWriter(fs,newConfiguration(),newPath(args[0]),Text.class,UserVisit.class);

Textkey=newText();

UserVisitvalue=newUserVisit();

key.set("user1");

value=newUserVisit(1,1592345678,"/page1");

writer.append(key,value);

key.set("user2");

value=newUserVisit(2,1592345689,"/page2");

writer.append(key,value);

writer.close();

}

}最后,我們可以使用SequenceFile.Reader來(lái)讀取數(shù)據(jù):importorg.apache.hadoop.fs.FileSystem;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.SequenceFile;

importorg.apache.hadoop.io.Text;

importjava.io.IOException;

import.URI;

publicclassUserVisitReader{

publicstaticvoidmain(String[]args)throwsIOException{

FileSystemfs=FileSystem.get(URI.create("hdfs://localhost:9000"),newConfiguration());

SequenceFile.Readerreader=newSequenceFile.Reader(fs,newPath(args[0]),newConfiguration());

Textkey=newText();

UserVisitvalue=newUserVisit();

while(reader.next(key,value)){

System.out.println(key+"\t"+value);

}

reader.close();

}

}3.3Avro存儲(chǔ)格式Avro是一種數(shù)據(jù)序列化系統(tǒng),它支持豐富的數(shù)據(jù)結(jié)構(gòu),并且可以進(jìn)行緊湊和快速的序列化。Avro數(shù)據(jù)可以被讀取和寫(xiě)入,無(wú)需了解其模式,這使得它非常適合在Hadoop中使用。3.3.1示例下面是一個(gè)使用Avro存儲(chǔ)用戶(hù)訪(fǎng)問(wèn)記錄的例子。首先,我們需要定義一個(gè)Avro模式:{

"type":"record",

"name":"UserVisit",

"fields":[

{"name":"userId","type":"int"},

{"name":"timestamp","type":"long"},

{"name":"url","type":"string"}

]

}然后,我們可以使用Avro的JavaAPI來(lái)將數(shù)據(jù)寫(xiě)入Avro文件:importorg.apache.avro.Schema;

importorg.apache.avro.file.DataFileWriter;

importorg.apache.avro.generic.GenericDatumWriter;

importorg.apache.avro.generic.GenericRecord;

importorg.apache.avro.io.DatumWriter;

importjava.io.File;

publicclassUserVisitAvroWriter{

publicstaticvoidmain(String[]args)throwsException{

Schemaschema=newSchema.Parser().parse(newFile("UserVisit.avsc"));

DatumWriter<GenericRecord>datumWriter=newGenericDatumWriter<>(schema);

DataFileWriter<GenericRecord>dataFileWriter=newDataFileWriter<>(datumWriter);

dataFileWriter.create(schema,newFile(args[0]));

GenericRecorduserVisit=newGenericData.Record(schema);

userVisit.put("userId",1);

userVisit.put("timestamp",1592345678);

userVisit.put("url","/page1");

dataFileWriter.append(userVisit);

userVisit=newGenericData.Record(schema);

userVisit.put("userId",2);

userVisit.put("timestamp",1592345689);

userVisit.put("url","/page2");

dataFileWriter.append(userVisit);

dataFileWriter.close();

}

}最后,我們可以使用Avro的JavaAPI來(lái)讀取數(shù)據(jù):importorg.apache.avro.Schema;

importorg.apache.avro.file.DataFileReader;

importorg.apache.avro.generic.GenericDatumReader;

importorg.apache.avro.generic.GenericRecord;

importorg.apache.avro.io.DatumReader;

importjava.io.File;

publicclassUserVisitAvroReader{

publicstaticvoidmain(String[]args)throwsException{

Schemaschema=newSchema.Parser().parse(newFile("UserVisit.avsc"));

DatumReader<GenericRecord>datumReader=newGenericDatumReader<>(schema);

DataFileReader<GenericRecord>dataFileReader=newDataFileReader<>(newFile(args[0]),datumReader);

for(GenericRecorduserVisit:dataFileReader){

System.out.println(userVisit);

}

dataFileReader.close();

}

}3.4Parquet存儲(chǔ)格式Parquet是一種列式存儲(chǔ)格式,它支持復(fù)雜的嵌套數(shù)據(jù)結(jié)構(gòu),并且可以進(jìn)行高效的壓縮和編碼。Parquet數(shù)據(jù)可以被讀取和寫(xiě)入,無(wú)需了解其模式,這使得它非常適合在Hadoop中使用。3.4.1示例下面是一個(gè)使用Parquet存儲(chǔ)用戶(hù)訪(fǎng)問(wèn)記錄的例子。首先,我們需要定義一個(gè)Parquet模式:importorg.apache.parquet.schema.MessageType;

importorg.apache.parquet.schema.MessageTypeParser;

publicclassUserVisitParquetSchema{

publicstaticfinalMessageTypeSCHEMA=MessageTypeParser.parseMessageType(

"UserVisit{"

+"requiredint32userId;"

+"requiredint64timestamp;"

+"requiredbinaryurl(UTF8);"

+"}"

);

}然后,我們可以使用Parquet的JavaAPI來(lái)將數(shù)據(jù)寫(xiě)入Parquet文件:importorg.apache.parquet.avro.AvroParquetWriter;

importorg.apache.parquet.hadoop.ParquetWriter;

importorg.apache.parquet.hadoop.metadata.CompressionCodecName;

importjava.io.IOException;

publicclassUserVisitParquetWriter{

publicstaticvoidmain(String[]args)throwsIOException{

ParquetWriter<org.apache.avro.Schema>writer=AvroParquetWriter.<org.apache.avro.Schema>builder(newPath(args[0]))

.withSchema(UserVisitParquetSchema.SCHEMA)

.withCompressionCodec(CompressionCodecName.SNAPPY)

.build();

org.apache.avro.SchemauserVisit=neworg.apache.avro.Schema.Parser().parse(newFile("UserVisit.avsc"));

userVisit.put("userId",1);

userVisit.put("timestamp",1592345678);

userVisit.put("url","/page1");

writer.write(userVisit);

userVisit=neworg.apache.avro.Schema.Parser().parse(newFile("UserVisit.avsc"));

userVisit.put("userId",2);

userVisit.put("timestamp",1592345689);

userVisit.put("url","/page2");

writer.write(userVisit);

writer.close();

}

}最后,我們可以使用Parquet的JavaAPI來(lái)讀取數(shù)據(jù):importorg.apache.avro.Schema;

importorg.apache.avro.file.DataFileReader;

importorg.apache.avro.generic.GenericDatumReader;

importorg.apache.avro.generic.GenericRecord;

importorg.apache.avro.io.DatumReader;

importorg.apache.parquet.avro.AvroParquetReader;

importjava.io.IOException;

publicclassUserVisitParquetReader{

publicstaticvoidmain(String[]args)throwsIOException{

AvroParquetReader<GenericRecord>reader=AvroParquetReader.<GenericRecord>builder(newPath(args[0]))

.build();

for(GenericRecorduserVisit:reader){

System.out.println(userVisit);

}

reader.close();

}

}以上就是Hadoop中常見(jiàn)的數(shù)據(jù)存儲(chǔ)格式的詳細(xì)介紹和示例。每種格式都有其優(yōu)點(diǎn)和缺點(diǎn),選擇哪種格式取決于具體的應(yīng)用場(chǎng)景和需求。4Hadoop數(shù)據(jù)存儲(chǔ)優(yōu)化4.1數(shù)據(jù)壓縮技術(shù)在Hadoop中,數(shù)據(jù)壓縮技術(shù)是提高存儲(chǔ)效率和數(shù)據(jù)處理速度的關(guān)鍵策略。Hadoop支持多種壓縮格式,包括Gzip、Bzip2、LZO、Snappy等,每種格式都有其特點(diǎn)和適用場(chǎng)景。4.1.1GzipGzip是一種廣泛使用的壓縮格式,它提供了良好的壓縮比,但壓縮和解壓縮速度較慢。在Hadoop中,Gzip壓縮的文件可以被Hadoop的MapReduce任務(wù)直接讀取,無(wú)需先解壓縮。示例代碼#使用gzip壓縮文件

importgzip

importshutil

withopen('input.txt','rb')asf_in:

withgzip.open('input.txt.gz','wb')asf_out:

shutil.copyfileobj(f_in,f_out)

#使用gzip解壓縮文件

withgzip.open('input.txt.gz','rb')asf_in:

withopen('input.txt','wb')asf_out:

shutil.copyfileobj(f_in,f_out)4.1.2SnappySnappy是一種快速的壓縮和解壓縮算法,特別適合于大數(shù)據(jù)處理。它提供了較低的壓縮比,但壓縮和解壓縮速度非???,適合于實(shí)時(shí)數(shù)據(jù)處理。示例代碼#使用snappy壓縮文件

importsnappy

data=open('input.txt','rb').read()

compressed_data=press(data)

#將壓縮后的數(shù)據(jù)寫(xiě)入文件

withopen('input.txt.snappy','wb')asf:

f.write(compressed_data)

#使用snappy解壓縮文件

withopen('input.txt.snappy','rb')asf:

compressed_data=f.read()

decompressed_data=snappy.decompress(compressed_data)

#將解壓縮后的數(shù)據(jù)寫(xiě)入文件

withopen('input.txt','wb')asf:

f.write(decompressed_data)4.2數(shù)據(jù)存儲(chǔ)的冗余與容錯(cuò)Hadoop的HDFS(HadoopDistributedFileSystem)設(shè)計(jì)了數(shù)據(jù)冗余機(jī)制,以提高數(shù)據(jù)的可靠性和容錯(cuò)性。默認(rèn)情況下,HDFS會(huì)為每個(gè)文件塊創(chuàng)建三個(gè)副本,分別存儲(chǔ)在不同的節(jié)點(diǎn)上。這樣,即使某個(gè)節(jié)點(diǎn)發(fā)生故障,數(shù)據(jù)仍然可以從其他節(jié)點(diǎn)恢復(fù)。4.2.1數(shù)據(jù)冗余數(shù)據(jù)冗余是通過(guò)創(chuàng)建數(shù)據(jù)的多個(gè)副本實(shí)現(xiàn)的,這可以防止數(shù)據(jù)丟失,并提高數(shù)據(jù)的可用性。在Hadoop中,數(shù)據(jù)冗余的策略可以通過(guò)配置HDFS的參數(shù)來(lái)調(diào)整。4.2.2容錯(cuò)機(jī)制Hadoop的容錯(cuò)機(jī)制主要依賴(lài)于數(shù)據(jù)冗余和任務(wù)重試。當(dāng)檢測(cè)到某個(gè)節(jié)點(diǎn)或任務(wù)失敗時(shí),Hadoop會(huì)自動(dòng)從其他節(jié)點(diǎn)讀取數(shù)據(jù),并重新執(zhí)行失敗的任務(wù)。4.3數(shù)據(jù)存儲(chǔ)的性能調(diào)優(yōu)Hadoop的數(shù)據(jù)存儲(chǔ)性能可以通過(guò)多種方式調(diào)優(yōu),包括調(diào)整HDFS的塊大小、優(yōu)化數(shù)據(jù)壓縮策略、調(diào)整數(shù)據(jù)冗余策略等。4.3.1調(diào)整HDFS的塊大小HDFS的塊大小是Hadoop讀寫(xiě)數(shù)據(jù)的基本單位。默認(rèn)的塊大小是128MB,但這個(gè)值可能需要根據(jù)實(shí)際的數(shù)據(jù)大小和處理需求進(jìn)行調(diào)整。例如,對(duì)于小文件,可以將塊大小設(shè)置為更小的值,以減少元數(shù)據(jù)的開(kāi)銷(xiāo)。4.3.2優(yōu)化數(shù)據(jù)壓縮策略數(shù)據(jù)壓縮可以顯著減少存儲(chǔ)空間和網(wǎng)絡(luò)傳輸時(shí)間,但也會(huì)增加CPU的負(fù)擔(dān)。因此,需要根據(jù)數(shù)據(jù)的特性和處理需求,選擇合適的壓縮算法和壓縮級(jí)別。4.3.3調(diào)整數(shù)據(jù)冗余策略數(shù)據(jù)冗余可以提高數(shù)據(jù)的可靠性和容錯(cuò)性,但也會(huì)增加存儲(chǔ)空間的開(kāi)銷(xiāo)。因此,需要根據(jù)數(shù)據(jù)的重要性和存儲(chǔ)空間的限制,調(diào)整數(shù)據(jù)冗余的策略。在Hadoop中,可以通過(guò)調(diào)整dfs.replication參數(shù)來(lái)控制數(shù)據(jù)冗余的策略。例如,對(duì)于不重要的數(shù)據(jù),可以將dfs.replication設(shè)置為較小的值,以減少存儲(chǔ)空間的開(kāi)銷(xiāo)。<property>

<name>dfs.replication</name>

<value>3</value>

<description>默認(rèn)的HDFS塊副本數(shù)</description>

</property>通過(guò)以上策略,可以有效地優(yōu)化Hadoop的數(shù)據(jù)存儲(chǔ)性能,提高大數(shù)據(jù)處理的效率。5Hadoop數(shù)據(jù)存儲(chǔ)格式在實(shí)際應(yīng)用中的選擇5.1不同存儲(chǔ)格式的對(duì)比分析在Hadoop生態(tài)系統(tǒng)中,數(shù)據(jù)存儲(chǔ)格式的選擇對(duì)數(shù)據(jù)處理的效率和成本有著直接的影響。Hadoop支持多種數(shù)據(jù)存儲(chǔ)格式,包括但不限于TextFile、SequenceFile、Avro、Parquet、ORC和RCFile。下面,我們將對(duì)比分析這些格式的主要特點(diǎn):5.1.1TextFile特點(diǎn):最簡(jiǎn)單的存儲(chǔ)格式,數(shù)據(jù)以純文本形式存儲(chǔ),易于理解和處理。適用場(chǎng)景:適合小規(guī)模數(shù)據(jù)或需要人類(lèi)可讀性的場(chǎng)景。缺點(diǎn):存儲(chǔ)效率低,讀寫(xiě)速度慢,不適合大數(shù)據(jù)處理。5.1.2SequenceFile特點(diǎn):二進(jìn)制格式,支持壓縮,比TextFile更高效。適用場(chǎng)景:適合存儲(chǔ)鍵值對(duì)數(shù)據(jù),常用于MapReduce的中間輸出。缺點(diǎn):不支持隨機(jī)訪(fǎng)問(wèn),查詢(xún)效率較低。5.1.3Avro特點(diǎn):數(shù)據(jù)序列化系統(tǒng),支持豐富的數(shù)據(jù)結(jié)構(gòu),自包含模式,易于擴(kuò)展。適用場(chǎng)景:適合需要跨語(yǔ)言數(shù)據(jù)交換的場(chǎng)景,如分布式系統(tǒng)間的通信。代碼示例://Java示例:使用Avro序列化數(shù)據(jù)

importorg.apache.avro.Schema;

importorg.apache.avro.generic.GenericData;

importorg.apache.avro.generic.GenericDatumWriter;

importorg.apache.avro.io.DatumWriter;

importorg.apache.avro.io.Encoder;

importorg.apache.avro.io.EncoderFactory;

importorg.apache.avro.io.BinaryEncoder;

importjava.io.ByteArrayOutputStream;

importjava.io.IOException;

publicclassAvroExample{

publicstaticvoidmain(String[]args)throwsIOException{

//創(chuàng)建Avro模式

Schemaschema=newSchema.Parser().parse("{\"type\":\"record\",\"name\":\"User\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"age\",\"type\":\"int\"}]}");

//創(chuàng)建數(shù)據(jù)

GenericData.Recorduser=newGenericData.Record(schema);

user.put("name","JohnDoe");

user.put("age",30);

//創(chuàng)建編碼器

ByteArrayOutputStreamout=newByteArrayOutputStream();

DatumWriter<GenericData.Record>writer=newGenericDatumWriter<>(schema);

Encoderencoder=EncoderFactory.get().binaryEncoder(out,null);

//寫(xiě)入數(shù)據(jù)

writer.write(user,encoder);

encoder.flush();

out.close();

//輸出序列化后的數(shù)據(jù)

System.out.println(out.toByteArray());

}

}解釋?zhuān)荷鲜龃a示例展示了如何使用Avro庫(kù)在Java中序列化一個(gè)簡(jiǎn)單的用戶(hù)記錄。Avro的模式定義允許我們指定數(shù)據(jù)結(jié)構(gòu),然后使用Avro庫(kù)將Java對(duì)象轉(zhuǎn)換為二進(jìn)制格式,便于在網(wǎng)絡(luò)上傳輸或存儲(chǔ)。5.1.4Parquet特點(diǎn):列式存儲(chǔ)格式,支持高效的數(shù)據(jù)壓縮和編碼,適用于大數(shù)據(jù)分析。適用場(chǎng)景:適合數(shù)據(jù)倉(cāng)庫(kù)和大數(shù)據(jù)分析,尤其是需要頻繁查詢(xún)和分析的場(chǎng)景。代碼示例://Java示例:使用Parquet寫(xiě)入數(shù)據(jù)

importorg.apache.parquet.hadoop.ParquetWriter;

importorg.apache.parquet.hadoop.metadata.CompressionCodecName;

importorg.apache.parquet.schema.MessageType;

importorg.apache.parquet.schema.MessageTypeParser;

importorg.apache.parquet.schema.PrimitiveType;

importorg.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;

importorg.apache.parquet.schema.Type;

importorg.apache.parquet.schema.Types;

importorg.apache.parquet.example.data.Group;

importorg.apache.parquet.example.data.GroupFactory;

importorg.apache.parquet.example.data.simple.SimpleGroup;

importorg.apache.parquet.example.data.simple.SimpleGroupFactory;

importorg.apache.parquet.hadoop.ParquetWriter;

importorg.apache.parquet.hadoop.metadata.CompressionCodecName;

importorg.apache.parquet.io.RecordWriter;

importorg.apache.parquet.io.api.Binary;

importorg.apache.parquet.io.api.RecordConsumer;

importorg.apache.parquet.schema.MessageType;

importorg.apache.parquet.schema.MessageTypeParser;

importorg.apache.parquet.schema.PrimitiveType;

importorg.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;

importorg.apache.parquet.schema.Type;

importorg.apache.parquet.schema.Types;

importjava.io.IOException;

importjava.nio.file.Paths;

publicclassParquetExample{

publicstaticvoidmain(String[]args)throwsIOException{

//創(chuàng)建Parquet模式

MessageTypeschema=MessageTypeParser.parseMessageType("messageuser{requiredint32id;requiredbinaryname;}");

//創(chuàng)建ParquetWriter

ParquetWriter<Group>writer=ParquetWriter.<Group>builder(Paths.get("user.parquet").toUri().getPath())

.withSchema(schema)

.withCompressionCodec(CompressionCodecName.SNAPPY)

.build();

//創(chuàng)建數(shù)據(jù)

GroupFactoryfactory=newGroupFactory(schema);

Groupuser=factory.newGroup()

.append("id",1)

.append("name",Binary.fromString("JohnDoe"));

//寫(xiě)入數(shù)據(jù)

writer.write(user);

writer.close();

}

}解釋?zhuān)哼@段代碼示例展示了如何使用Parquet庫(kù)在Java中寫(xiě)入數(shù)據(jù)。Parquet支持列式存儲(chǔ),這意味著它能夠更有效地存儲(chǔ)和查詢(xún)數(shù)據(jù),尤其是當(dāng)數(shù)據(jù)集非常大時(shí)。5.1.5ORC特點(diǎn):優(yōu)化的列式存儲(chǔ)格式,支持高效的數(shù)據(jù)壓縮和編碼,適用于大數(shù)據(jù)分析。適用場(chǎng)景:適合數(shù)據(jù)倉(cāng)庫(kù)和大數(shù)據(jù)分析,尤其是需要頻繁查詢(xún)和分析的場(chǎng)景。代碼示例://Java示例:使用ORC寫(xiě)入數(shù)據(jù)

importorg.apache.hadoop.hive.ql.io.orc.OrcFile;

importorg.apache.hadoop.hive.ql.io.orc.OrcFile.WriterOptions;

importorg.apache.hadoop.hive.ql.io.orc.OrcFile.WriterOptions.Builder;

importorg.apache.hadoop.hive.ql.io.orc.TypeDescription;

importorg.apache.hadoop.hive.ql.io.orc.Writer;

importorg.apache.hadoop.hive.ql.io.orc.WriterImpl;

importpress.CompressionCodec;

importpress.SnappyCodec;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.fs.Path;

importjava.io.IOException;

publicclassORCExample{

publicstaticvoidmain(String[]args)throwsIOException{

//創(chuàng)建ORC模式

TypeDescriptionschema=TypeDescription.createStruct()

.addField("id",TypeDescription.createInt())

.addField("name",TypeDescription.createString());

//創(chuàng)建ORCWriter

Configurationconf=newConfiguration();

CompressionCodeccodec=newSnappyCodec();

codec.setConf(conf);

Writerwriter=OrcFile.createWriter(newPath("user.orc"),

WriterOptions.newBuilder()

.setSchema(schema)

.setCompression(CompressionKind.SNAPPY)

.build());

//創(chuàng)建數(shù)據(jù)

writer.addRow(1,"JohnDoe");

//寫(xiě)入數(shù)據(jù)

writer.close();

}

}解釋?zhuān)哼@段代碼示例展示了如何使用ORC庫(kù)在Java中寫(xiě)入數(shù)據(jù)。ORC(OptimizedRowColumnar)格式是為Hive設(shè)計(jì)的,但也可以在其他大數(shù)據(jù)處理框架中使用,它提供了與Parquet類(lèi)似的性能優(yōu)勢(shì),但在某些場(chǎng)景下可能更優(yōu)。5.1.6RCFile特點(diǎn):列式和行式混合存儲(chǔ)格式,支持高效的數(shù)據(jù)壓縮和編碼。適用場(chǎng)景:適合需要在列式和行式存儲(chǔ)之間進(jìn)行權(quán)衡的場(chǎng)景。代碼示例:```java//Java示例:使用RCFile寫(xiě)入數(shù)據(jù)importorg.apache.hadoop.hive.ql.io.HiveInputFormat;importorg.apache.hadoop.hive.ql.io.HiveOutputFormat;importorg.apache.hadoop.hive.ql.io.RCFileInputFormat;importorg.apache.hadoop.hive.ql.io.RCFileOutputFormat;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeFactory;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameter;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeParameters.LazySimpleSerDeParameterType.LazySimpleSerDeParameterType;importorg.apa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論