Apache Hadoop 0.23.0 Release Notes

These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.


Improve the buffer utilization of ZlibCompressor to avoid invoking a JNI per write request.


Add a new API listCorruptFileBlocks to FIleContext that returns a list of files that have corrupt blocks.


Adds __attribute__ ((unused))


Make a client name has this format: DFSClient_applicationid_randomint_threadid, where applicationid = mapred.task.id or else = “NONMAPREDUCE”.


The permissions on datanode data directories (configured by dfs.datanode.data.dir.perm) now default to 0700. Upon startup, the datanode will automatically change the permissions to match the configured value.


The default minimum heartbeat interval has been dropped from 3 seconds to 300ms to increase scheduling throughput on small clusters. Users may tune mapreduce.jobtracker.heartbeats.in.second to adjust this value.


Task-cleanup task should not be scheduled on the node that the task just failed


On web UI, missing block number now becomes accurate and under-replicated blocks do not include missing blocks.


Updates hadoop-config.sh to always resolve symlinks when determining HADOOP_HOME. Bash built-ins or POSIX:2001 compliant cmds are now required.


Summary of changes to the decommissioning process:

After nodes are decommissioned, they are not shutdown. The decommissioned nodes are not used for writes. For reads, the decommissioned nodes are given as the last location to read from.

Number of live and dead decommissioned nodes are displayed in the namenode webUI.

Decommissioned nodes free capacity is not count towards the the cluster free capacity.


Offline edits viewer feature adds oev tool to hdfs script. Oev makes it possible to convert edits logs to/from native binary and XML formats. It uses the same framework as Offline image viewer.

Example usage:

$HADOOP_HOME/bin/hdfs oev -i edits -o output.xml


WARNING: No release note provided for this change.


WARNING: No release note provided for this change.


The native build run when from trunk now requires autotools, libtool and openssl dev libraries.


The native build run when from trunk now requires autotools, libtool and openssl dev libraries.


The native build run when from trunk now requires autotools, libtool and openssl dev libraries.


WARNING: No release note provided for this change.


Failmon removed from contrib codebase.


TextInputFormat may now split lines with delimiters other than newline, by specifying a configuration parameter “textinputformat.record.delimiter”


MapWritable now implements equals() and hashCode() based on the map contents rather than object identity in order to correctly implement the Map interface.


Fix a misleading documentation note about the usage of Reporter objects in Reducers.


Job names on jobtracker.jsp should be 80 characters long at most.


Added a new configuration property dfs.block.invalidate.limit for FSNamesystem.blockInvalidateLimit.


MultipleOutputs should not require the use/check of ‘Writable’ interfaces in key and value classes.


Print the resultant status of a Job on completion instead of simply saying ‘Complete’.


Added a helpful description message to the `mapred job -events` command.


Fix a misleading exception message in case the Chained Mappers have mismatch in input/output Key/Value pairs between them.


This is the COMMON portion of a fix requiring coordinated change of COMMON and HDFS. Please see HDFS-1445 for HDFS portion and release note.


The masters file is no longer used to indicate which hosts to start the 2NN on. The 2NN is now started on hosts when dfs.namenode.secondary.http-address is configured with a non-wildcard IP.


Added a new stage TRANSFER_RBW to DataTransferProtocol


Removed references to the older fs.checkpoint.* properties that resided in core-site.xml


Removed references to the older fs.checkpoint.* properties that resided in core-site.xml


Batch hardlinking during “upgrade” snapshots, cutting time from aprx 8 minutes per volume to aprx 8 seconds. Validated in both Linux and Windows. Depends on prior integration with patch for HADOOP-7133.


Increments the RPC protocol version in org.apache.hadoop.ipc.Server from 4 to 5. Introduces ArrayPrimitiveWritable for a much more efficient wire format to transmit arrays of primitives over RPC. ObjectWritable uses the new writable for array of primitives for RPC and continues to use existing format for on-disk data.


Updated the help for the touchz command.


Make the DataNode’s block-volume choosing policy pluggable.


Add a new DataTransferProtocol operation, Op.TRANSFER_BLOCK, for transferring RBW/Finalized with acknowledgement and without using RPC.


An efficient implementation of small jobs by running all tasks in the MR ApplicationMaster JVM, there-by affecting lower latency.


Added two configuration properties, dfs.client.block.write.replace-datanode-on-failure.enable and dfs.client.block.write.replace-datanode-on-failure.policy. Added a new feature to replace datanode on failure in DataTransferProtocol. Added getAdditionalDatanode(..) in ClientProtocol.


This changes the fsimage format to be root directory-1 directory-2 … directoy-n. Each directory stores all its children in the following format: Directory_full_path_name num_of_children child-1 … child-n. Each inode stores only the last component of its path name into fsimage. This change requires an upgrade at deployment.


Implemented a daemon thread to monitor the disk usage for periodically and if the disk usage reaches the threshold value, put the name node into Safe mode so that no modification to file system will occur. Once the disk usage reaches below the threshold, name node will be put out of the safe mode. Here threshold value and interval to check the disk usage are configurable.


I have committed this. Thanks to Bharath!


Added a ’‘-starts-after’ option to Rumen’s Folder utility. The time duration specified after the ‘-starts-after’ option is an offset with respect to the submit time of the first job in the input trace. Jobs in the input trace having a submit time (relative to the first job’s submit time) lesser than the specified offset will be ignored.


Adds job configuration parameters to the job trace. The configuration parameters are stored under the ‘jobProperties’ field as key-value pairs.


Fixes Gridmix in RoundRobinUserResolver mode to map testing/proxy users to unique users in a trace.


Removes the restriction of specifying group names in users-list file for Gridmix in RoundRobinUserResolver mode.


I just committed this. Thanks Luke!


Adds -recursive option to TraceBuilder for scanning the input directories recursively.


  1. Protocol version check is removed from proxy creation, instead version check is performed at server in every rpc call.
  2. This change is backward incompatible because format of the rpc messages is changed to include client version, client method hash and rpc version.
  3. rpc version is introduced which should change when the format of rpc messages is changed.

Improve the Partitioner interface’s docs to help fetch Job Configuration objects.


New metrics2 framework for Hadoop.


I’ve committed this. Thanks, Matt!


Looks great. I just committed this. Thanks Siddharth!


viewfs - client-side mount table.


Metrics names are standardized to use CapitalizedCamelCase. Some examples of this is:

Metrics names using “_” is changed to new naming scheme. Eg: bytes_written changes to BytesWritten.

All metrics names start with capitals. Example: threadsBlocked changes to ThreadsBlocked.


Metrics names are standardized to CapitalizedCamelCase. See release note of HADOOP-6918 and HADOOP-6920.


Introduces a new command, “hdfs groups”, which displays what groups are associated with a user as seen by the NameNode.


Introduces a new command, “mapred groups”, which displays what groups are associated with a user as seen by the JobTracker.


Remove packaging of duplicated third party jar files


Metrics names are standardized to use CapitalizedCamelCase. Some examples:

Metrics names using “_” is changed to new naming scheme. Eg: bytes_written changes to BytesWritten.

All metrics names start with capitals. Example: threadsBlocked changes to ThreadsBlocked.


Removed the deprecated fields in DataTransferProtocol.


The “Found X items” header on the output of the “du” command has been removed to more closely match unix. The displayed paths now correspond to the command line arguments instead of always being a fully qualified URI. For example, the output will have relative paths if the command line arguments are relative paths.


* Removed duplicated jars in test class path.


Removed duplicated hadoop-common library dependencies.


Makes Gridmix emulate HDFS based distributed cache files and local file system based distributed cache files.


Map and Reduce task can access the attempt’s overall progress via TaskAttemptContext.


Use of this new utility method avoids null result from File.listFiles(), and consequent NPEs.


New configuration properties gridmix.job.original-job-id and gridmix.job.original-job-name in the configuration of simulated job are exposed/documented to gridmix user for mapping between original cluster’s jobs and simulated jobs.


Emulates the MapReduce compression feature in Gridmix. By default, compression emulation is turned on. Compression emulation can be disabled by setting ‘gridmix.compression-emulation.enable’ to ‘false’. Use ‘gridmix.compression-emulation.map-input.decompression-ratio’, ‘gridmix.compression-emulation.map-output.compression-ratio’ and ‘gridmix.compression-emulation.reduce-output.compression-ratio’ to configure the compression ratios at map input, map output and reduce output side respectively. Currently, compression ratios in the range [0.07, 0.68] are supported. Gridmix auto detects whether map-input, map output and reduce output should emulate compression based on original job’s compression related configuration parameters.


Adds system tests to Gridmix. These system tests cover various features like job types (load and sleep), user resolvers (round-robin, submitter-user, echo) and submission modes (stress, replay and serial).


Added RPM/DEB packages to build system.


Create HDFS RPM package


Created rpm and debian packages for MapReduce.


WARNING: No release note provided for this change.


Adds system tests for testing the compression emulation feature of Gridmix.


If dfs.name.dir points to an empty dir, namenode -format no longer requires confirmation.


Added header classes for individual DataTransferProtocol op headers.


Task attempt’s total heap usage gets recorded and published via counters as COMMITTED_HEAP_BYTES.


Adds High-Ram feature emulation in Gridmix.


hadoop-daemon.sh now returns a non-zero exit code if it detects that the daemon was not still running after 3 seconds.


Adds distributed cache related system tests to Gridmix.


Added 2 new config parameters:

mapreduce.reduce.shuffle.catch.exception.stack.regex mapreduce.reduce.shuffle.catch.exception.message.regex


Adds cpu, physical memory, virtual memory and heap usages to TraceBuilder’s output.


Removed dependency of testcase on /tmp and made it to use test.build.data directory instead.


Fixed the streaming test TestStreamingExitStatus’s failure due to an OutOfMemory error by reducing the testcase’s io.sort.mb.


WARNING: No release note provided for this change.


MRUnit is now available as a separate Apache project.


The scripts that run Hadoop no longer automatically add tools.jar from the JDK to the classpath (if it is present). If your job depends on tools.jar in the JDK you will need to add this dependency in your job.


WARNING: No release note provided for this change.


Adds cumulative cpu usage emulation to Gridmix


Adds system tests to test the High-Ram feature in Gridmix.


Adds total heap usage emulation to Gridmix. Also, Gridmix can configure the simulated task’s JVM heap options with max heap options obtained from the original task (via Rumen). Use ‘gridmix.task.jvm-options.enable’ to disable the task max heap options configuration.


Protocol buffer-generated types may now be used as arguments or return values for Hadoop RPC.


Add hdfsHFlush to libhdfs.


Declare methods in DataTransferProtocol interface, and change Sender and Receiver to implement the interface.


Added a check to match the sure RPC and HTTP Port’s on the NameNode were not set to the same value, otherwise an IOException is throw with the appropriate message.


Updated the Quota exceptions to now use human readable output.


Moved block management codes to a new package org.apache.hadoop.hdfs.server.blockmanagement.


Gridmix now prints a summary information after every run. It summarizes the runs w.r.t input trace details, input data statistics, cli arguments, data-gen runtime, simulation runtimes etc and also the cluster w.r.t map slots, reduce slots, jobtracker-address, hdfs-address etc.


IsolationRunner is no longer maintained. See MAPREDUCE-2637 for its replacement.


Added missing library during creation of the eclipse project files.


Invalid configuration values now result in a number format exception rather than the default value being used.


The “rm” family of FsShell commands now supports -rmdir and -f options.


The hdfsproxy contrib component is no longer supported.


The NameNode’s storage layout for its name directories has been reorganized to be more robust. Each edit now has a unique transaction ID, and each file is associated with a transaction ID (for checkpoints) or a range of transaction IDs (for edit logs).


Updated the JavaDocs to appropriately represent the new Configuration Keys that are used in the code. The docs did not match the code.


New dfsadmin command added: [-setBalancerBandwidth <bandwidth>] where bandwidth is max network bandwidth in bytes per second that the balancer is allowed to use on each datanode during balacing.

This is an incompatible change in 0.23. The versions of ClientProtocol and DatanodeProtocol are changed.


Added config option mapreduce.tasktracker.cache.local.keep.pct to the TaskTracker. It is the target percentage of the local distributed cache that should be kept in between garbage collection runs. In practice it will delete unused distributed cache entries in LRU order until the size of the cache is less than mapreduce.tasktracker.cache.local.keep.pct of the maximum cache size. This is a floating point value between 0.0 and 1.0. The default is 0.95.


Capture intermediate task resource consumption information: * Time taken so far * CPU load [either at the time the data are taken, or exponentially smoothed] * Memory load [also either at the time the data are taken, or exponentially smoothed]

This would be taken at intervals that depend on the task progress plateaus. For example, reducers have three progress ranges - [0-1/3], (1/3-2/3], and (2/3-3/3] - where fundamentally different activities happen. Mappers have different boundaries that are not symmetrically placed [0-9/10], (9/10-1]. Data capture boundaries should coincide with activity boundaries. For the state information capture [CPU and memory] we should average over the covered interval.


Efficient implementation of MapReduce framework counters.


WARNING: No release note provided for this change.


MapReduce has undergone a complete re-haul in hadoop-0.23 and we now have, what we call, MapReduce 2.0 (MRv2).

The fundamental idea of MRv2 is to split up the two major functionalities of the JobTracker, resource management and job scheduling/monitoring, into separate daemons. The idea is to have a global ResourceManager (RM) and per-application ApplicationMaster (AM). An application is either a single job in the classical sense of Map-Reduce jobs or a DAG of jobs. The ResourceManager and per-node slave, the NodeManager (NM), form the data-computation framework. The ResourceManager is the ultimate authority that arbitrates resources among all the applications in the system. The per-application ApplicationMaster is, in effect, a framework specific library and is tasked with negotiating resources from the ResourceManager and working with the NodeManager(s) to execute and monitor the tasks.

The ResourceManager has two main components: * Scheduler (S) * ApplicationsManager (ASM)

The Scheduler is responsible for allocating resources to the various running applications subject to familiar constraints of capacities, queues etc. The Scheduler is pure scheduler in the sense that it performs no monitoring or tracking of status for the application. Also, it offers no guarantees on restarting failed tasks either due to application failure or hardware failures. The Scheduler performs its scheduling function based the resource requirements of the applications; it does so based on the abstract notion of a Resource Container which incorporates elements such as memory, cpu, disk, network etc.

The Scheduler has a pluggable policy plug-in, which is responsible for partitioning the cluster resources among the various queues, applications etc. The current Map-Reduce schedulers such as the CapacityScheduler and the FairScheduler would be some examples of the plug-in.

The CapacityScheduler supports hierarchical queues to allow for more predictable sharing of cluster resources. The ApplicationsManager is responsible for accepting job-submissions, negotiating the first container for executing the application specific ApplicationMaster and provides the service for restarting the ApplicationMaster container on failure.

The NodeManager is the per-machine framework agent who is responsible for launching the applications’ containers, monitoring their resource usage (cpu, memory, disk, network) and reporting the same to the Scheduler.

The per-application ApplicationMaster has the responsibility of negotiating appropriate resource containers from the Scheduler, tracking their status and monitoring for progress.


WARNING: No release note provided for this change.


New config added:

// the maximum number of completed applications the RM keeps <name>yarn.server.resourcemanager.expire.applications.completed.max</name>


Fixed a race condition in writing the log index file that caused tasks to ‘fail’.


WARNING: No release note provided for this change.


Rename HdfsConstants interface to HdfsServerConstants, FSConstants interface to HdfsConstants


JVM metrics published to Ganglia now include the process name as part of the gmetric name.


Adding support for Kerberos HTTP SPNEGO authentication to the Hadoop web-consoles


Added a conf property dfs.webhdfs.enabled for enabling/disabling webhdfs.


Added two new conf properties dfs.web.authentication.kerberos.principal and dfs.web.authentication.kerberos.keytab for the SPNEGO servlet filter.


Simple typo fix to allow ResourceManager to start instead of fail


Generate state graph from State Machine Definition


contrib/vaidya/bin/vaidya.sh script fixed to use appropriate jars and classpath


WARNING: No release note provided for this change.


closing again


This change allows when running multiple namenodes on different hosts, sharing the same configuration file across all the nodes in the cluster (Datanodes, NamNode, BackupNode, SecondaryNameNode), without the need to define dfs.federation.nameservice.id parameter.


Adding a simple, DistributedShell application as an alternate framework to MapReduce and to act as an illustrative example for porting applications to YARN.


Fixed conflict uid for install packages. (Eric Yang)


Set hdfs uid, mapred uid, and hadoop gid to fixed numbers (201, 202, and 123, respectively).


Added init.d script for jobhistory server and secondary namenode. (Eric Yang)


Removed inheritance of certain server environment variables (HADOOP_OPTS and HADOOP_ROOT_LOGGER) in task attempt process.


Removed unnecessary security logger configuration. (Eric Yang)


Fixed recursive sourcing of HADOOP_OPTS environment variables (Arpit Gupta via Eric Yang)


HADOOP-7681. Fixed security and hdfs audit log4j properties (Arpit Gupta via Eric Yang)


Fixed hadoop-setup-conf.sh to handle config file consistently. (Eric Yang)


Added toggle for dfs.support.append, webhdfs and hadoop proxy user to setup config script. (Arpit Gupta via Eric Yang)


Added parameter for HBase user to setup config script. (Arpit Gupta via Eric Yang)


Enhance OutputCommitter and FileOutputCommitter to allow for recover of tasks across job restart.


Fixed hadoop-setup-conf.sh to put proxy user in core-site.xml. (Arpit Gupta via Eric Yang)


Fixes TraceBuilder to handle 0.20 history file names also.


Makes Rumen use job history api instead of relying on current history file name format.


“mapred/job -list” now contains map/reduce, container, and resource information.


Generalizes token renewal and canceling to a common interface and provides a plugin interface for adding renewers for new kinds of tokens. Hftp changed to store the tokens as HFTP and renew them over http.


Committed to trunk and v23, since code reviewed by Eric.


A new server has been added to yarn. It is a web proxy that sits in front of the AM web UI. The server is controlled by the yarn.web-proxy.address config. If that config is set, and it points to an address that is different then the RM web interface then a separate proxy server needs to be launched.

This can be done by running

yarn-daemon.sh start proxyserver

If a separate proxy server is needed other configs also may need to be set, if security is enabled. yarn.web-proxy.principal yarn.web-proxy.keytab

The proxy server is stateless and should be able to support a VIP or other load balancing sitting in front of multiple instances of this server.


Resource limits are now expressed and enforced in terms of physical memory, rather than virtual memory. The virtual memory limit is set as a configurable multiple of the physical limit. The NodeManager’s memory usage is now configured in units of MB rather than GB.


A multi-level mkdir is now POSIX compliant. Instead of creating intermediate directories with the permissions of the parent directory, intermediate directories are created with permission bits of rwxrwxrwx (0777) as modified by the current umask, plus write and search permission for the owner.


Enable task memory management to be configurable via hadoop config setup script.


New Yarn configuration property:

Name: yarn.app.mapreduce.am.scheduler.connection.retries Description: Number of times AM should retry to contact RM if connection is lost.


The pre-MR2 MapReduce implementation (JobTracker, TaskTracer, etc) and contrib components are no longer supported. This implementation is currently supported in the 0.20.20x releases.


Fixed security audit logger configuration. (Arpit Gupta via Eric Yang)


HDFS now has the ability to use posix_fadvise and sync_data_range syscalls to manage the OS buffer cache. This support is currently considered experimental, and may be enabled by configuring the following keys: dfs.datanode.drop.cache.behind.writes - set to true to drop data out of the buffer cache after writing dfs.datanode.drop.cache.behind.reads - set to true to drop data out of the buffer cache when performing sequential reads dfs.datanode.sync.behind.writes - set to true to trigger dirty page writeback immediately after writing data dfs.datanode.readahead.bytes - set to a non-zero value to trigger readahead for sequential reads


Rumen is fixed to ignore the AMRestartedEvent.


Fixes Rumen to get correct hostName that includes rackName in attempt info.