hive添加壓縮

 hive在存儲數據時會對HDFS上的數據做映射,在MYSQL中僅僅存儲的是元數據信息。所有的數據都是存儲在HDFS上的。

 現在有個需求是需要對hive操作生成的數據改爲壓縮數據存儲,提高HDFS的存儲空間利用率。這裏有幾點需要記錄的:

 1.如果是本地文件通過hadoop fs -put 操作上傳到HDFS的時候是不會對數據做任何處理的,即使hdfs-site.xml中配置了壓縮參數也是不生效的。爲什麼?因爲這個操作僅僅是一個複製的過程。沒有調用mapreduce任務,如果想使數據壓縮就需要通過mapreduce任務來操作。

 2.由1可知如果簡單的把文本數據拷貝到hive表的目錄下是不會出現壓縮後的數據的,即不會有壓縮操作。

 3.hive配置map過程的壓縮和最終結果的壓縮可以在兩個地方:hadoop下的mapred-site.xml中或則hive的hive-site.xml中。如果是前者配置了所有的hadoop上的mapreduce任務都會做壓縮處理,如果是後者配置了則只有hive的sql語句所創建的mapreduce任務會做壓縮處理。所以如果不想所有的任務都做壓縮操作,可以在hive-site.xml中配置。

 4.hive配置壓縮可以有兩種方式:其一是在hive的shell中 set 各種參數,這個是會話有效的。其二是就是在hive-site.xml中配置是全局有效的。

 5.工作中用到了sqoop直接把數據從數據庫中導入到hive中,但是如果sqoop不指定壓縮,導入到HDFS中的數據其實還是文本格式。所以需要指定參數 --compression-codec org.apache.hadoop.io.compress.BZip2Codec 來保證導入到HDFS中的數據是使用bzip2的壓縮方式(bzip2壓縮支持分隔)

 6.下面展示下hive-site.xml中配置的參數列表

    <property>
          <name>hive.exec.compress.intermediate</name> //開啓hive壓縮
          <value>true</value>
       </property>

       <property>
          <name>mapred.output.compress</name> //開啓mapreduce的壓縮
          <value>true</value>
       </property>

       <property>
         <name>mapred.output.compression.codec</name> //指定MR輸出的壓縮格式
         <value>org.apache.hadoop.io.compress.BZip2Codec</value>
         </property>

      <property>
         <name>hive.exec.compress.output</name>
         <value>true</value>
         </property>
      
      <property>
        <name>mapred.compress.map.output</name> //開啓map階段的壓縮,減少map數據的傳輸
        <value>true</value>
        </property>

     <property>
         <name>mapred.map.output.compression.codec</name> //指定map階段數據的壓縮格式。
         <value>org.apache.hadoop.io.compress.SnappyCodec</value>
         </property>  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章