Below are resources for this release:
Download a release tarball and verify by these procedures using these KEYS
| fluo-1.2.0-bin.tar.gz | ASC SHA | | fluo-1.2.0-source-release.tar.gz | ASC SHA |
View the [documentation][docs] for this release.
Read the [Javadocs][javadocs].
Apache Fluo follows semver for its API . The API consists of everything under the org.apache.fluo.api
package. Code outside of this package can change at any time. If your project is using Fluo code that falls outside of the API, then consider initiating a discussion about adding it to the API.
The major changes in 1.2.0 are highlighted here, for the complete list of changes, see the [1.2.0 Milestone] on Github.
Before 1.2.0, Fluo applications could only be run in YARN or as local processes. For 1.2.0, the Fluo tarball was refactored to support other ways of running Fluo applications such as Docker, Kubernetes & Marathon. This refactoring has the following notable changes:
fluo.properties
configuration file was deprecated and was replaced by fluo-conn.properties
and fluo-app.properties
.fluo-conn.properties
contains connection properties and is shared by Fluo applicationsfluo-app.properites
contains application-specific properties and is only used during initialization of Fluo applications.fluo.properties
is created from fluo.properties.deprecated
.fluo get-jars
command (added in [db0bdad]) can be used to retrieve application jars.-o
option. This enables passing Fluo options on the Docker command line.FLUO_JAVA_OPTS
env variable on the Docker command line. This was added in commit [4207df4].Read the [quickstart documentation][quickstart] to learn how to run Fluo applications using these new methods.
The Percolator paper stated that read locks were expensive and usually not needed. Therefore in Percolator reads did not acquire a read lock. This assessment is correct, not every read should acquire a read lock. However, offering the ability to optionally obtain a read lock makes writing certain applications much simpler. So in this release of Fluo, optional read locks were added. Below is an example of how to acquire read locks.
void addEdge(FluoClient client, String node1, String node2) { try(Transaction tx = client.newTransaction()) { // These reads acquire a read lock. Any concurrent changes will cause this // transaction to fail. String a1 = tx.withReadLock().gets(node1, new Column("node","alias")); String a2 = tx.withReadLock().gets(node2, new Column("node","alias")); tx.set("e:"+a1+":"+a2, new Column("edge", "exists"), "Y"); } } void setAlias(FluoClient client, String node, String newAlias) { try(Transaction tx = client.newTransaction()) { String oldAlias = tx.gets(node, new Column("node","alias")); tx.set(node, new Column("node","alias"), newAlias); updateExistingEdges(oldAlias, newAlias); } }
Concurrent calls to addEdge(client,"n1","n2")
and addEdge(client,"n1","n3")
can run without issue. However, concurrent calls to addEdge(client,"n1","n2")
and setAlias(client, "n1","a5")
will result in a collision. If addEdge
did not obtain a read lock, then it would not collide with setAlias
. If addEdge
obtained a write lock, then concurrent calls to addEdge
could needlessly collide.
See the [withReadLock javadoc][readlock] for more information.
Range scanning API was simplified in [c737df6]. Before, scanning over a row was :
CellScanner scanner = snapshot.scanner().over(Span.exact("row")).build();
After this change, it can be written as :
CellScanner scanner = snapshot.scanner().over("row").build();
In [2f11089] support for Java 8 streams was added. The following computes unique columns in rows with the prefix abc
.
Set<Column> cols = snapshot.scanner().overPrefix("abc").build() .stream().map(RowColumnValue::getColumn).collect(Collectors.toSet());
Can now remove applications data in Zookeeper and Accumulo. Work on this issue was done in [#999]. Before data had to be manually removed from Zookeeper and Accumulo.
Most of the methods in [FluoConfiguration] get or a set a specific property. Before it was not easy to know which property. In [cbe44b1] the javadoc was updated to mention the properties.
Fluo uses Apache Thrift for remote procedure calls. Projects using Thrift use its compiler to generate code. This generated Java code make calls to libthrift which is an artifact release by the Thrift project. The code generated by a specific version of Thrift is only guaranteed to work with the same version of libthrift. For example, code generated by the Thrift 0.9.1 compiler is only guaranteed to work with libthrift 0.9.1.
Accumulo also uses Thrift for its RPCs. When Accumulo and Fluo use different versions of thrift it can cause serious problems. To avoid these problems, in [082ee8e] libthrift was shaded and relocated into the fluo-core jar eliminating Fluo‘s external dependency on libthrift. This means that no matter which version Accumulo uses, it will not conflict with Fluo’s version.
Fluo‘s commit code is asynchronous in order to support high throughput. Before this release the high level commit logic was spread far and wide in the code. For this release the commit code was transitioned from Guava’s ListenableFutre to Java 8's CompletableFuture in [ca63aaf]. This transition laid the ground work for [6bf604f] which centralized the commit logic. Now the high level logic for the commit code is all in one place, making it much easier to understand.
The Fluo stress test was run twice as documented here and here.
[javadocs]: {{ site.fluo_api_base }}/1.2.0/ [docs]: /docs/fluo/1.2/ [semver]: http://semver.org/ [1.2.0 Milestone]: https://github.com/apache/fluo/milestone/6?closed=1 [fluo-yarn]: https://github.com/apache/fluo-yarn [fluo-yarn-release]: https://fluo.apache.org/release/fluo-yarn-1.0.0 [fluo]: https://github.com/apache/fluo [quickstart]: https://fluo.apache.org/docs/fluo/1.2/getting-started/quick-start [842]: https://github.com/apache/fluo/issues/842 [#960]: https://github.com/apache/fluo/issues/960 [#999]: https://github.com/apache/fluo/issues/991 [readlock]: {{ site.fluo_api_static }}/{{ site.latest_fluo_release }}/org/apache/fluo/api/client/TransactionBase.html#withReadLock-- [FluoConfiguration]: {{ site.fluo_api_static }}/{{ site.latest_fluo_release }}/org/apache/fluo/api/config/FluoConfiguration.html [4207df4]: https://github.com/apache/fluo/commit/4207df4 [7c16599]: https://github.com/apache/fluo/commit/7c16599 [151c565]: https://github.com/apache/fluo/commit/151c565 [db0bdad]: https://github.com/apache/fluo/commit/db0bdad [cbe44b1]: https://github.com/apache/fluo/commit/cbe44b1 [082ee8e]: https://github.com/apache/fluo/commit/082ee8e [6bf604f]: https://github.com/apache/fluo/commit/6bf604f [ca63aaf]: https://github.com/apache/fluo/commit/ca63aaf [c737df6]: https://github.com/apache/fluo/commit/c737df6 [650f044]: https://github.com/apache/fluo/commit/650f044 [9e87f47]: https://github.com/apache/fluo/commit/9e87f47 [955c86f]: https://github.com/apache/fluo/commit/955c86f [2f11089]: https://github.com/apache/fluo/commit/2f11089 [a349a9d]: https://github.com/apache/fluo/commit/a349a9d [202fe08]: https://github.com/apache/fluo/commit/202fe08 [51dc912]: https://github.com/apache/fluo/commit/51dc912