0003-如何在CDH中使用LZO壓縮
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。
1.問題描述
CDH中預設不支援Lzo壓縮編碼,需要下載額外的Parcel包,才能讓Hadoop相關元件如HDFS,Hive,Spark支援Lzo編碼。
具體請參考:
https://www.cloudera.com/documentation/enterprise/latest/topics/cm\_mc\_gpl\_extras.html
首先我在沒做額外配置的情況下,生成Lzo檔案並讀取。我們在Hive中建立兩張表,test_table和test_table2,test_table是文字檔案的表,test_table2是Lzo壓縮編碼的表。如下:
create external table test_table(s1 string,s2 string)row format delimited fields terminated by '#'location '/lilei/test_table'; insert into test_table values('1','a'),('2','b'); create external table test_table2(s1 string,s2 string)row format delimited fields terminated by '#'location '/lilei/test_table2'; |
---|
通過beeline訪問Hive並執行上面命令:
查詢test_table中的資料:
將test_table中的資料插入到test_table2,並設定輸出檔案為lzo壓縮:
set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;set hive.exec.compress.output=true;set mapreduce.output.fileoutputformat.compress=true;set mapreduce.output.fileoutputformat.compress.type=BLOCK; insert overwrite table test_table2 select * from test_table; |
---|
在Hive中執行報錯如下:
Error:Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask (state=08S01,code=2) |
---|
通過Yarn的8088可以發現是因為找不到Lzo壓縮編碼:
Compression codec com.hadoop.compression.lzo.LzoCodec was not found. |
---|
2.解決辦法
通過Cloudera Manager的Parcel頁面配置Lzo的Parcel包地址:
注意:如果叢集無法訪問公網,需要提前下載好Parcel包併發布到httpd
下載->分配->啟用
配置HDFS的壓縮編碼加入Lzo:
com.hadoop.compression.lzo.LzoCodeccom.hadoop.compression.lzo.LzopCodec |
---|
儲存更改,部署客戶端配置,重啟整個叢集。
等待重啟成功:
再次插入資料到test_table2,設定為Lzo編碼格式:
set mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec;set hive.exec.compress.output=true;set mapreduce.output.fileoutputformat.compress=true;set mapreduce.output.fileoutputformat.compress.type=BLOCK; insert overwrite table test_table2 select * from test_table; |
---|
插入成功:
2.1 Hive驗證
首先確認test_table2中的檔案為Lzo格式:
在Hive的beeline中進行測試:
Hive基於Lzo壓縮檔案執行正常。
2.2 Spark SQL驗證
var textFile=sc.textFile("hdfs://ip-172-31-8-141:8020/lilei/test_table2/000000_0.lzo_deflate") textFile.count() sqlContext.sql("select * from test_table2") |
---|
SparkSQL基於Lzo壓縮檔案執行正常。
醉酒鞭名馬,少年多浮誇! 嶺南浣溪沙,嘔吐酒肆下!摯友不肯放,資料玩的花!
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。