Apache Accumulo 2.1.4
20 Aug 2025
This version is a current Long Term Maintenance (LTM) release.
About
Apache Accumulo 2.1.4 is a patch release of the 2.1 LTM line. It contains bug fixes and minor enhancements. This version supersedes earlier 2.1 releases and users upgrading to 2.1 should upgrade directly to this version instead of any prior 2.1 release.
Notable Changes
- #5446 Many dependencies were updated, to include protobuf-java which was updated from 3.22.0 to 3.25.6 due to a vulnerability. Users may run into a runtime exception added in https://github.com/protocolbuffers/protobuf/pull/20084 when using old generated Protobuf files. Users may need to address any compatibility issues with this version of protobuf-java, if their code also makes use of this library.
- #5073 #5034 Added
accumulo check-accumulo-propertiescommand that can be run before an instance is initialized to check the properties file. - #5193 Added
accumulo admin signalShutdowncommand to signal the server process to initiate a graceful shutdown. Compactors will finish the major compaction that they are currently working on, then will exit. Scan Servers will return a busy signal to all clients for new scan requests, and will shutdown when all in-progress scans have closed. Tablet Servers will signal the Manager that they are shutting down, which should prevent assignment of tablets to that server, then they will unload all tablets and shut down. The Monitor, Manager, GarbageCollector, and CompactionCoordinator will shut down also. The last step in the shutdown process for all servers is to remove their lock in ZooKeeper. - #5438 Added
accumulo upgrade --preparecommand which should be used after shutting down an instance in preparation for an upgrade. This will check that no Fate transactions exist, delete any ZooKeeper locks for server processes, and prohibit any server processes from being started. - #4898 New way to compute bulk load plans. This adds two new APIs for computing which tablets should load a rfile. APIs were also added to serialize, deserialize, and merge load plans. These primitives provide building blocks for doing distributed computation of load plans over a set of rfiles.
- #5169 #5170 The TabletServer will halt itself when a walog write or minc failure occurs and the TabletServer lock is not held in ZooKeeper.
- #5145 #5132 The Manager and TabletServer processes now have a background
thread that can be enabled via the property
general.server.lock.verification.intervalto validate that the process is holding the lock in ZooKeeper. The existing mechanism of relying on a Watcher to notify the process that the lock has been lost can be a problem due to the fact that there is a single thread in the ZooKeeper client that fires Watcher events. If the thread is currently waiting on a hung Watcher, then subsequent Watcher events will not fire and could leave the server running without a lock. - #5174 #5035 #5502 #5439 Many improvements
to the
accumulo-clusterandaccumulo-servicescripts have been backported from the main branch. This includes syntax changes. Users should review the scripts for changes that may effect them. Changes were made to the defaultconf/accumulo-env.shfile to support the changes in those scripts, so users should pay particular attention to the changes in that configuration file. - #5688 Added option to the Shell config command to show experimental properties.
- #5689 Modified tokenizer in Shell to provide better support for json values.
- #5726 Added new configuration properties for the Compactor to specify backoff behavior when compactions are failing consecutively. This would likely occur when there is a misconfiguration. This change also includes new logging in the Compactor and Coordinator, and new metrics being emitted by the Compactor.
- #5729 Monitor now supports hosting behind a proxy by specifying a base directory.
- #5779 Admin serviceStatus command now report summaries per resource group.
- #5743 Added per table and per compaction erasure code configuration.
- #5720 Added ability to configure compactions differently per tablet and per output path.
- #5588 and #5675 together these change make compaction planning look ahead more than once to find sets of files to compact that would not include smaller sets of files that could compact or are compacting.
Configuration Improvements
- #4723 #5239 Changes to properties
tserver.session.idle.maxandtserver.session.update.idle.maxno longer require a TabletServer restart. - #5397 #5399 Added property
gc.threads.delete.walto control the number of threads to use for deleting write-ahead logs and recovery files. - #5341 Created an optimization in Bulk Import v2 to enable faster processing of bulk import files
when loading into a sparse set of tablets in a large table. See new table property
table.bulk.metadata.skip.distance. - #5628 #5627 Made the number of threads the manager uses to scan the metadata to find tablets that need attention configurable. This scan uses iterators that can have a large set of options, added a property to optionally compress these iterator options.
- #5633 Added a new property for server processes advertise address allowing different bind and advertise addresses.
- #5638 Added a new property to disable assignment and balancing when the number of tserver is below the configured value. Disabled by default.
- #5632 Improved handling fixed properties that require a server restart.
Notable Bug Fixes
- #5033 #5038 Group names in cluster.yaml must conform to bash variable name rules or an error will be raised when parsing the cluster.yaml file.
- #5221 The shell will now print to stdout, instead of stderr, when there is no terminal set. This will help with piping the output of the shell to other commands such as grep.
- #5396 Modified
accumulo-clusterto stop GC and ScanServer processes first when stopping the cluster. These processes write to the metadata table, which can lead to slower shutdown times. - #4868 #4871 Fixed listscans so that it shows a scan session id for batch scans instead of always showing zero.
- #4845 InstanceOperations.getActiveCompaction(String) did not handle the address of a Compactor process being passed in the parameter. This has been fixed.
- #5445 The
cfandcqoptions for the DeleteMany and Grep shell commands were not being handled properly. - #5570 Fixed race condition where an external compaction would be forgotten with its files indefinitely reserved for a compaction that is no longer running. This condition would continue until the tablet server hosting the tablet was restarted.
- #5543 #5552 #5543 Fixed multiple bugs that could destabilize external compactions.
- #5707 Fixes a bug where an external compaction would not start.
Metrics Improvements
- #4756 #4757 #4840 Added metric to indicate how many zombie scan threads are running in the TabletServer.
- #5011 Added queue tag to metrics emitted from the External Compactor processes.
- #5025 #4922 Added property
general.micrometer.log.metricsto enable metrics on the log4j2 or logback logging frameworks. Disabled by default.
Other Improvements
- #4755 #5220 Fixed the help flag for the admin command so that it works for subcommands.
- #4819 Tablets that are closing will no longer wait on scans to complete. Instead they will try to interrupt the scan and then continue closing the tablet so that it can be migrated. It’s possible that a zombie scan thread could remain in the TabletServer, if the scan thread is blocked on something and does not die. Users should monitor the new zombie scan metric mentioned in the section above.
- #4867 Lowered the memory burden of listing a large number of External Compactors in the Monitor.
- #5026 Modified CompactionJobPrioritizer.createPriority to give a higher priority to tablets that have more files than the maximum number of files per tablet.
- #5400 Modified AESCryptoService to prevent the creation of overlapping streams.
Semver violations
The following are changes since 2.1.3 that violate semver. Writing code that uses these new methods will make it incompatible with 2.1.3 and earlier.
| Class | Changes |
|---|---|
| o.a.a.core.client.admin.InstanceOperations | added Set<String> getCompactors() |
| o.a.a.core.client.admin.compaction.CompactionConfigurer.InitParameters | added TabletId getTabletId() and URI getOutputFile() |
| o.a.a.core.client.rfile.RFile.WriterOptions | added WriterOptions withSplitResolver(LoadPlan.SplitResolver splitResolver) |
| o.a.a.core.data.LoadPlan | added String toJson(), LoadPlan fromJson(String json), LoadPlan compute(...), interface SplitResolver |
| o.a.a.core.data.TabletId | added of(TableId tableId, String endRow, String prevEndRow) and also added Text and byte[] versions |
| o.a.a.core.iterators.IteratorEnvironment | removed default methods that threw UnsupportedOperationException |
| o.a.a.core.spi.balancer.DoNothingBalancer | This entire class was added |
| o.a.a.core.spi.balancer.TabletBalancer.BalanceParameters | added String partitionName(), Map<String,TableId> getTablesToBalance() |
| o.a.a.core.spi.compaction.CompactionPlanner.PlanningParameters | added NamespaceId getNamespaceId() and TabletId getTabletId() |
| o.a.a.core.spi.compaction.DefaultCompactionPlanner | added a new configuration option tserver.compaction.major.service.<service>.opts.lowestRatio |
Requirements
Accumulo 2.1.4 now requires JDK 17 to build, but still supports Java 11 runtime.
Upgrading
View the Upgrading Accumulo documentation for guidance.
Useful Links
View all releases in the archive