1. 程式人生 > >spark下讀寫lzo檔案(java)

spark下讀寫lzo檔案(java)

1、編譯安裝hadoop-lzo

這個網上已經說的很詳細了,具體可以參考這個連結:

2、具體如何配置lzo,上面的文件已經有了,但是為了討論問題,這裡再複製一下:

a、修改hadoop配置檔案core-site.xml 

Xml程式碼 
  1. <property>  
  2.     <name>io.compression.codecs</name>  
  3.     <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,org.apache.hadoop.io.compress.BZip2Codec</
    value>  
  4.   </property>  
  5.   <property>  
  6.     <name>io.compression.codec.lzo.class</name>  
  7.     <value>com.hadoop.compression.lzo.LzoCodec</value>  
  8.   </property>  
b、修改hadoop配置檔案mapred-site.xml  Xml程式碼 
  1. <property>  
  2.     <name>mapred.compress.map.output</
    name>  
  3.     <value>true</value>  
  4.   </property>  
  5.   <property>  
  6.     <name>mapred.map.output.compression.codec</name>  
  7.     <value>com.hadoop.compression.lzo.LzoCodec</value>  
  8.   </property>  

看到了吧,這兩個地方最終壓縮的編碼格式都是com.hadoop.compression.lzo.LzoCodec

3、然後往hadoop寫入相關檔案,我用的是lzop格式,同時生成索引檔案(java實現)

4、然後在spark中讀取

	SparkConf conf = new SparkConf().setAppName("test");        
        JavaSparkContext sc = new JavaSparkContext(conf);
        Configuration configuration = new Configuration();
        configuration.set("mapred.output.compress", "true");
        configuration.set("mapred.output.compression.codec", "com.hadoop.compression.lzo.LzopCodec");
        String fileName = "hdfs://ip:port//data/.../.../*/info_credit_card.lzo";
        JavaPairRDD<LongWritable, Text> pairRDD =
            sc.newAPIHadoopFile(fileName,
                         LzoTextInputFormat.class,
                         LongWritable.class,
                         Text.class,
                         configuration);
pairRDD通過flatMap轉為行,將會得到正確的值,並且已經做過分片;

疑惑:

1、在配置檔案core-site.xml和mapred-site.xml都是lzoCodec,但是在讀寫的時候卻必須用lzopCodec, 我試圖直接用lzoCodec,卻總是失敗,而網上的例子都是lzopCodec ? 

2、當然,用lzo的Stream方式直接讀寫hdfs檔案是沒有問題的,但這樣就無法使用JavaSparkContext的newAPIHadoopFile方法了,該方法可以直接按照規則匹配檔案,生成分散式的rdd