Java >> Java tutoriál >  >> Java

Java Program pro kompresi souborů ve formátu gzip v Hadoop

V tomto příspěvku uvidíme program Java, který ukazuje, jak komprimovat soubor pomocí gzip formátu v Hadoop.

Kompresní formát gzip nepodporuje rozdělení takže úloha MapReduce nebude schopna vytvářet vstupní rozdělení, i když komprimovaný soubor lze stále uložit jako samostatné bloky HDFS (velikost 128 MB ve výchozím nastavení).

Java program pro kompresi souborů pomocí formátu gzip

Kompresní kodek Hadoop, který je nutné použít pro gzip, je org.apache.hadoop.io.compress.GzipCodec .

Chcete-li získat tento kodek getCodecByClassName metoda CompressionCodecFactory používá se třída.K vytvoření CompressionOutputStream , je použita metoda createOutputStream(OutputStream out) třídy kodeků. CompressionOutputStream budete používat k zápisu dat souboru v komprimované podobě do streamu.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.CompressionOutputStream;

public class GzipCompress {
  public static void main(String[] args) {
    Configuration conf = new Configuration();
    InputStream in = null;
    OutputStream out = null;
    try {
      FileSystem fs = FileSystem.get(conf);
      // Input file from local file system
      in = new BufferedInputStream(new FileInputStream("/home/knpcode/Documents/knpcode/Hadoop/Test/data.txt"));
      //Compressed Output file
      Path outFile = new Path("/user/compout/test.gz");
      // Verification
      if (fs.exists(outFile)) {
        System.out.println("Output file already exists");
        throw new IOException("Output file already exists");
      }			
      out = fs.create(outFile);
			
      // For gzip compression
      CompressionCodecFactory factory = new CompressionCodecFactory(conf);
      CompressionCodec codec = factory.getCodecByClassName("org.apache.hadoop.io.compress.GzipCodec");
      CompressionOutputStream compressionOutputStream = codec.createOutputStream(out);      
      try {
        IOUtils.copyBytes(in, compressionOutputStream, 4096, false);
        compressionOutputStream.finish();
        
      } finally {
        IOUtils.closeStream(in);
        IOUtils.closeStream(compressionOutputStream);
      }
			
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

Provádění programu v prostředí Hadoop

Chcete-li spustit výše uvedený program Java v prostředí Hadoop, budete muset přidat adresář obsahující soubor .class pro program Java do cesty třídy Hadoop.

export HADOOP_CLASSPATH='/huser/eclipse-workspace/knpcode/bin'

Mám svou GzipCompress.class soubor v umístění /huser/eclipse-workspace/knpcode/bin, takže jsem tuto cestu exportoval.

Poté můžete program spustit pomocí následujícího příkazu-

$ hadoop org.knpcode.GzipCompress

18/03/11 12:59:49 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
18/03/11 12:59:49 INFO compress.CodecPool: Got brand-new compressor [.gz]

Vstupní soubor použitý v programu je dostatečně velký, aby zajistil, že i po kompresi bude velikost souboru větší než 128 MB, takže můžeme zajistit, že bude uložen jako dva samostatné bloky v HDFS.

Můžete to zkontrolovat pomocí příkazu hdfs fsck.

$ hdfs fsck /user/compout/test.gz

.Status: HEALTHY
 Total size:	233963084 B
 Total dirs:	0
 Total files:	1
 Total symlinks:		0
 Total blocks (validated):	2 (avg. block size 116981542 B)

FSCK ended at Wed Mar 14 21:07:46 IST 2018 in 6 milliseconds

Protože gzip nepodporuje rozdělení, použití tohoto komprimovaného souboru jako vstupu pro úlohu MapReduce bude znamenat, že pro úlohu Map bude vytvořeno pouze jedno rozdělení.

Chcete-li otestovat, kolik vstupních rozdělení je vytvořeno, dejte tento komprimovaný soubor gzip jako vstup do programu Wordcount MapReduce.

$ hadoop jar /home/knpcode/Documents/knpcode/Hadoop/wordcount.jar org.knpcode.WordCount /user/compout/test.gz /user/output3

18/03/11 13:09:23 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
18/03/11 13:09:23 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
18/03/11 13:09:23 INFO input.FileInputFormat: Total input files to process : 1
18/03/11 13:09:24 INFO mapreduce.JobSubmitter: number of splits:1

Jak můžete vidět na tomto řádku zobrazeném na konzoli mapreduce.JobSubmitter:počet rozdělení:1 pro úlohu MapReduce je vytvořeno pouze jedno vstupní rozdělení, i když existují dva bloky HDFS, protože komprimovaný soubor gzip nelze rozdělit.

To je vše k tématu Java Program pro kompresi souborů ve formátu gzip v Hadoop . Pokud něco chybí nebo chcete k tématu něco sdílet, napište komentář.


Java Tag