Package org.apache.hadoop.hbase.io.hfile
Class HFile
java.lang.Object
org.apache.hadoop.hbase.io.hfile.HFile
File format for hbase. A file of sorted key/value pairs. Both keys and values are byte arrays.
 
The memory footprint of a HFile includes the following (below is taken from the TFile documentation but applies also to HFile):
- Some constant overhead of reading or writing a compressed block.
 - Each compressed block requires one compression/decompression codec for I/O.
- Temporary space to buffer the key.
- Temporary space to buffer the value.
 
- HFile index, which is proportional to the total number of Data Blocks. The total amount of memory needed to hold the index can be estimated as (56+AvgKeySize)*NumBlocks.
- Minimum block size. We recommend a setting of minimum block size between 8KB to 1MB for general usage. Larger block size is preferred if files are primarily for sequential access. However, it would lead to inefficient random access (because there are more data to decompress). Smaller blocks are good for random access, but require more memory to hold the block index, and may be slower to create (because we must flush the compressor stream at the conclusion of each data block, which leads to an FS I/O flush). Further, due to the internal caching in Compression codec, the smallest possible block size would be around 20KB-30KB.
- The current implementation does not offer true multi-threading for reading. The implementation uses FSDataInputStream seek()+read(), which is shown to be much faster than positioned-read call in single thread mode. However, it also means that if multiple threads attempt to access the same HFile (using multiple scanners) simultaneously, the actual I/O is carried out sequentially even if they access different DFS blocks (Reexamine! pread seems to be 10% faster than seek+read in my testing -- stack).
- Compression codec. Use "none" if the data is not very compressable (by compressable, I mean a compression ratio at least 2:1). Generally, use "lzo" as the starting point for experimenting. "gz" overs slightly better compression ratio over "lzo" but requires 4x CPU to compress and 2x CPU to decompress, comparing to "lzo".
File is made of data blocks followed by meta data blocks (if any), a fileinfo block, data block index, meta data block index, and a fixed size trailer which records the offsets at which file changes content type.
<data blocks><meta blocks><fileinfo>< data index><meta index><trailer>Each block has a bit of magic at its start. Block are comprised of key/values. In data blocks, they are both byte arrays. Metadata blocks are a String key and a byte array value. An empty file looks like this:
<fileinfo><trailer>. That is, there are not data nor meta blocks present.
TODO: Do scanners need to be able to take a start and end row? TODO: Should BlockIndex know the name of its file? Should it have a Path that points at its file say for the case where an index lives apart from an HFile instance?
- 
Nested Class SummaryNested ClassesModifier and TypeClassDescriptionstatic interfaceAn abstraction used by the block index.static interfaceAn interface used by clients to open and iterate anHFile.static interfaceAPI required to write anHFilestatic classThis variety of ways to construct writers is used throughout the code, and we want to be able to swap writer implementations.
- 
Field SummaryFieldsModifier and TypeFieldDescriptionstatic final StringMeta data block name for bloom filter bits.(package private) static final LongAdderstatic final LongAdderstatic final intThe number of bytes per checksum.static final StringDefault compression name: none.static final Compression.AlgorithmDefault compression: none.static final StringThe configuration key for HFile version to use for new files(package private) static final org.slf4j.Loggerstatic final intMaximum supported HFile format versionstatic final intMaximum length of key in HFile.static final intMinimum supported HFile format versionstatic final intMinimum HFile format version with support for persisting cell tagsstatic final intWe assume that HFile path ends with ROOT_DIR/TABLE_NAME/REGION_NAME/CF_NAME/HFILE, so it has at least this many levels of nesting.
- 
Constructor SummaryConstructors
- 
Method SummaryModifier and TypeMethodDescriptionstatic voidcheckFormatVersion(int version) Checks the givenHFileformat version, and throws an exception if invalid.static voidcheckHFileVersion(org.apache.hadoop.conf.Configuration c) static HFile.ReadercreateReader(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path, org.apache.hadoop.conf.Configuration conf) Creates reader with cache configuration disabledstatic HFile.ReadercreateReader(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path, CacheConfig cacheConf, boolean primaryReplicaReader, org.apache.hadoop.conf.Configuration conf) static HFile.ReadercreateReader(ReaderContext context, HFileInfo fileInfo, CacheConfig cacheConf, org.apache.hadoop.conf.Configuration conf) Method returns the reader given the specified arguments.static final longNumber of checksum verification failures.static final longNumber of checksum verification failures.static intgetFormatVersion(org.apache.hadoop.conf.Configuration conf) static List<org.apache.hadoop.fs.Path>getStoreFiles(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path regionDir) Returns all HFiles belonging to the given region directory.static String[]Get names of supported compression algorithms.static final HFile.WriterFactorygetWriterFactory(org.apache.hadoop.conf.Configuration conf, CacheConfig cacheConf) Returns the factory to be used to createHFilewritersstatic final HFile.WriterFactorygetWriterFactoryNoCache(org.apache.hadoop.conf.Configuration conf) Returns the factory to be used to createHFilewriters.static booleanisHFileFormat(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.FileStatus fileStatus) Returns true if the specified file has a valid HFile Trailer.static booleanisHFileFormat(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path) Returns true if the specified file has a valid HFile Trailer.(package private) static intlongToInt(long l) static voidstatic final voidupdateReadLatency(long latencyMillis, boolean pread, boolean tooSlow) static final voidupdateWriteLatency(long latencyMillis) 
- 
Field Details- 
LOG
- 
MAXIMUM_KEY_LENGTHMaximum length of key in HFile.- See Also:
 
- 
DEFAULT_COMPRESSION_ALGORITHMDefault compression: none.
- 
MIN_FORMAT_VERSIONMinimum supported HFile format version- See Also:
 
- 
MAX_FORMAT_VERSIONMaximum supported HFile format version- See Also:
 
- 
MIN_FORMAT_VERSION_WITH_TAGSMinimum HFile format version with support for persisting cell tags- See Also:
 
- 
DEFAULT_COMPRESSIONDefault compression name: none.
- 
BLOOM_FILTER_DATA_KEYMeta data block name for bloom filter bits.- See Also:
 
- 
MIN_NUM_HFILE_PATH_LEVELSWe assume that HFile path ends with ROOT_DIR/TABLE_NAME/REGION_NAME/CF_NAME/HFILE, so it has at least this many levels of nesting. This is needed for identifying table and CF name from an HFile path.- See Also:
 
- 
DEFAULT_BYTES_PER_CHECKSUMThe number of bytes per checksum.- See Also:
 
- 
CHECKSUM_FAILURES
- 
DATABLOCK_READ_COUNT
- 
FORMAT_VERSION_KEYThe configuration key for HFile version to use for new files- See Also:
 
 
- 
- 
Constructor Details- 
HFileprivate HFile()Shutdown constructor.
 
- 
- 
Method Details- 
getAndResetChecksumFailuresCountNumber of checksum verification failures. It also clears the counter.
- 
getChecksumFailuresCountNumber of checksum verification failures. It also clears the counter.
- 
updateReadLatency
- 
updateWriteLatency
- 
getFormatVersion
- 
getWriterFactoryNoCachepublic static final HFile.WriterFactory getWriterFactoryNoCache(org.apache.hadoop.conf.Configuration conf) Returns the factory to be used to createHFilewriters. Disables block cache access for all writers created through the returned factory.
- 
getWriterFactorypublic static final HFile.WriterFactory getWriterFactory(org.apache.hadoop.conf.Configuration conf, CacheConfig cacheConf) Returns the factory to be used to createHFilewriters
- 
createReaderpublic static HFile.Reader createReader(ReaderContext context, HFileInfo fileInfo, CacheConfig cacheConf, org.apache.hadoop.conf.Configuration conf) throws IOException Method returns the reader given the specified arguments. TODO This is a bad abstraction. See HBASE-6635.- Parameters:
- context- Reader context info
- fileInfo- HFile info
- cacheConf- Cache configuation values, cannot be null.
- conf- Configuration
- Returns:
- an appropriate instance of HFileReader
- Throws:
- IOException- If file is invalid, will throw CorruptHFileException flavored IOException
 
- 
createReaderpublic static HFile.Reader createReader(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path, org.apache.hadoop.conf.Configuration conf) throws IOException Creates reader with cache configuration disabled- Parameters:
- fs- filesystem
- path- Path to file to read
- conf- Configuration
- Returns:
- an active Reader instance
- Throws:
- IOException- Will throw a CorruptHFileException (DoNotRetryIOException subtype) if hfile is corrupt/invalid.
 
- 
createReaderpublic static HFile.Reader createReader(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path, CacheConfig cacheConf, boolean primaryReplicaReader, org.apache.hadoop.conf.Configuration conf) throws IOException - Parameters:
- fs- filesystem
- path- Path to file to read
- cacheConf- This must not be null.
- primaryReplicaReader- true if this is a reader for primary replica
- conf- Configuration
- Returns:
- an active Reader instance
- Throws:
- IOException- Will throw a CorruptHFileException (DoNotRetryIOException subtype) if hfile is corrupt/invalid.
- See Also:
 
- 
isHFileFormatpublic static boolean isHFileFormat(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path path) throws IOException Returns true if the specified file has a valid HFile Trailer.- Parameters:
- fs- filesystem
- path- Path to file to verify
- Returns:
- true if the file has a valid HFile Trailer, otherwise false
- Throws:
- IOException- if failed to read from the underlying stream
 
- 
isHFileFormatpublic static boolean isHFileFormat(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.FileStatus fileStatus) throws IOException Returns true if the specified file has a valid HFile Trailer.- Parameters:
- fs- filesystem
- fileStatus- the file to verify
- Returns:
- true if the file has a valid HFile Trailer, otherwise false
- Throws:
- IOException- if failed to read from the underlying stream
 
- 
getSupportedCompressionAlgorithmsGet names of supported compression algorithms. The names are acceptable by HFile.Writer.- Returns:
- Array of strings, each represents a supported compression algorithm. Currently, the
         following compression algorithms are supported.
         - "none" - No compression.
- "gz" - GZIP compression.
 
 
- 
longToInt
- 
getStoreFilespublic static List<org.apache.hadoop.fs.Path> getStoreFiles(org.apache.hadoop.fs.FileSystem fs, org.apache.hadoop.fs.Path regionDir) throws IOException Returns all HFiles belonging to the given region directory. Could return an empty list.- Parameters:
- fs- The file system reference.
- regionDir- The region directory to scan.
- Returns:
- The list of files found.
- Throws:
- IOException- When scanning the files fails.
 
- 
checkFormatVersionChecks the givenHFileformat version, and throws an exception if invalid. Note that if the version number comes from an input file and has not been verified, the caller needs to re-throw anIOExceptionto indicate that this is not a software error, but corrupted input.- Parameters:
- version- an HFile version
- Throws:
- IllegalArgumentException- if the version is invalid
 
- 
checkHFileVersion
- 
main- Throws:
- Exception
 
 
-