Hadoop-2.2.0使用lzo壓縮文件做爲輸入文件

 在 《Hadoop 2.2.0安裝和配置lzo》 文章中介紹瞭如何基於 Hadoop 2.2.0安裝lzo。裏面簡單介紹了若是在Hive裏面使用lzo數據。今天主要來講說如何在Hadoop 2.2.0中使用lzo壓縮文件看成的數據。
  lzo壓縮默認的是不支持切分的,也就是說,若是直接把lzo文件看成Mapreduce任務的輸入,那麼Mapreduce只會用一個Map來處理這個輸入文件,這顯然不是咱們想要的。其實咱們只須要對lzo文件創建索引,這樣這個lzo文件就會支持切分,也就能夠用多個Map來處理lzo文件。咱們能夠用 《Hadoop 2.2.0安裝和配置lzo》 文章中編譯的hadoop-lzo-0.4.20-SNAPSHOT.jar包來對lzo文件創建索引(假如在/home/wyp/input目錄下有個cite.txt.lzo文件,這個目錄是在HDFS上):java

1 $ $HADOOP_HOMOE/bin/hadoop jar                 
2                  $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3                  com.hadoop.compression.lzo.DistributedLzoIndexer
4                  /home/wyp/input/cite.txt.lzo

生成出來的索引文件後綴爲.index,並存放在lzo同一目錄下.在本例中產生的索引文件是存放在/home/wyp/input目錄下,名稱爲cite.txt.lzo.index。apache

咱們也能夠用下面的方法對lzo文件來創建索引:

1 $ $HADOOP_HOMOE/bin/hadoop jar                 
2               $HADOOP_HOMOE/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
3               com.hadoop.compression.lzo.LzoIndexer
4               /home/wyp/input/cite.txt.lzo

這個方法和上面方法產生出來的索引文件是同樣的;可是上面的方法是經過啓用Mapreduce任務來執行的,而這裏的方法只在一臺客戶機上運行,效率很慢!app

那麼,如何在Mapreduce任務中使用lzo文件。下面分別對Mapreduce程序、Streaming程序以及Hive分別進行說明:oop

一、對於Mapreduce程序,咱們須要把程序中全部的TextInputFormat修改成LzoTextInputFormat,以下:
1 job.setInputFormatClass(TextInputFormat.class);
2  
3 修改成
4  
5 job.setInputFormatClass(LzoTextInputFormat.class);

LzoTextInputFormat類須要引入相應的包,若是你是使用pom文件,能夠引入如下依賴:spa

1 <dependency>
2             <groupId>com.hadoop.gplcompression</groupId>
3             <artifactId>hadoop-lzo</artifactId>
4             <version>0.4.19</version>
5 </dependency>

若是你的輸入格式不是LzoTextInputFormat類,那麼Mapreduce程序將會把.index文件也看成是數據文件!修改完以後,須要從新編譯你的Mapreduc程序。這樣在運行Mapreduce程序的時候,將lzo文件所在的目錄看成輸入便可,Mapreduce程序會識別出.index文件的:code

1 $ /home/q/hadoop-2.2.0/bin/hadoop jar
2                                   statistics2.jar com.wyp.Sts
3                                   -Dmapreduce.job.queuename=queue1
4                                   /home/wyp/input
5                                   /home/wyp/resluts
二、對於Streaming程序來講,能夠經過-inputformat指定輸入的文件格式,使用以下:
1 $ bin/hadoop jar
2              $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3              -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4              -input /home/wyp/input
5              -output /home/wyp/results
6              -mapper /bin/cat
7              -reducer wc
對應Streaming做業還須要注意的是,使用DeprecatedLzoTextInputFormat輸入格式,會把文本的行號看成key傳送到reduce的,因此咱們須要將行號去掉,能夠用下面方法實現:

1 $ bin/hadoop jar
2              $HADOOP_HOMOE/share/hadoop/tools/lib/hadoop-streaming-2.2.0.jar
3              -inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
4              -input /home/wyp/input
5              -D stream.map.input.ignoreKey=true
6              -output /home/wyp/results
7              -mapper /bin/cat
8              -reducer wc
三、對於Hive,須要在建表的時候注意,以下:
1 hive> create table lzo(
2     > id int,
3     > name string)
4     > STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'
5     > OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
6 OK
7 Time taken: 3.423 seconds

注意4,5行代碼。這樣就可使用lzo文件了,並支持分割。orm

相關文章
相關標籤/搜索