

                    Hazelcast Jet Release Notes

This document keeps the history of Hazelcast Jet releases. We try to
enumerate all the non-trivial changes done to the product. The changes
are categorized into the following:

    1. New features
    2. Enhancements to the existing features
    3. Fixes of bugs and other problems
    4. Breaking changes (those that result in either compile errors or changes
       in runtime behavior)

The items in the lists follow this format:

[module] Description [PR_or_issue_number]

For major features that have an associated design document, [TDD_number]
appears at the start of the description.

To expand an issue number into a full GitHub link, use this template:

https://github.com/hazelcast/hazelcast-jet/issues/<issue number>

** Hazelcast Jet 4.1.1 **

1. Enhancements 

[docker] Update Java version to 11 in Docker image

2. Fixes

[core] JmsSink should not throw when it receives a Watermark


** Hazelcast Jet 4.1 **

Members of the open source community that appear in these release notes:

@TomaszGaweda
@caioguedes
@SapnaDerajeRadhakrishna

Thank you for your valuable contributions!

1. New Features

[jms] Exactly-once guarantee for JMS sink (#1813)
[jdbc] Exactly-once guarantee for JDBC sink (#1813)
[core] JobConfig.addClass() automatically adds nested classes to the job (#1932)
[core] JobConfig.addPackage() adds a whole Java package to the job (#1932, #2077)
[core] Job-scoped serializer deployment (#2020, #2038, #2039, #2043, #2071, #2075, #2082, #2190)
[core] [006] Protobuf serializer support (#2100)
[pipeline-api] [007] Support gRPC for mapUsingService (#2095, #2185)

2. Enhancements

[jet-cli] Use log4j2 instead of log4j (#1981)
[jet-cli] Simplify default log output (#2047)
[core] Add useful error message when serializer not registered (#2061)
[integration] Add hazelcast-azure cluster self-discovery plugin to the
    fat JAR in the distribution archive (#2079)
[pipeline-api] First-class support for inner hash join (@TomaszGaweda #2089)
[core] When Jet starts up, it now logs the cluster name (@caioguedes #2105)
[core] Add useful error message when trying to deploy a JDK class with JobConfig (#2108)
[core] Implement JobConfig.toString (@SapnaDerajeRadhakrishna #2152)
[core] Do not destroy Observable on shutdown (#2170)

3. Fixes

[core] Don't send the interrupt signal to blocking threads when a job is terminating (#1971)
[core] Consistently prefer YAML over XML config files when both present (#2033)

4. Breaking Changes

[integration] Replace Supplier<Schema> with just Schema (#2005)
[integration] Reorder parameters in JMS source so the lambda comes last (#2062)
[jet-cli] Change smart routing (connecting to all cluster members) default to disabled (#2104)
[pipeline-api] For xUsingServiceAsync transforms, reduce the default number of concurrent
               service calls per processor. Before: 256; now: 4. (#2204)


** Hazelcast Jet 4.0 **

1. New Features

[pipeline-api] Add support for calling a Python user-defined function within a pipeline [#1870]
[pipeline-api] Enable client to collect the results of a job it submitted through observables [#1729]
[pipeline-api] Add support for user-defined metrics [#1692]
[pipeline-api] Add batched version of async mapping using service (previously context) [#1803, #1929]
[core] Update Jet to use Hazelcast IMDG 4.0 [#1552]
[core] Add support for the creation of Jet blue/green client (enterprise only) [#1658]
[core] Add two-phase commit (2PC) support to snapshot mechanism for end-to-end exactly once processing [#1438]
[core] Add built-in metrics for job-lifecycle and snapshot statistics [#1715]
[jms] JMS Source now supports at-least-once and exactly-once processing [#1804]
[kafka] Add exactly-once support to Kafka and File sinks [#1654, #1655]
[kafka] Add Kafka Connect source [https://github.com/hazelcast/hazelcast-jet-contrib/tree/master/kafka-connect]
[integration] Add Debezium connector for Change Data Capture [https://github.com/hazelcast/hazelcast-jet-contrib/tree/master/debezium]

2. Enhancements

[pipeline-api] Expose read function on File reader [#1849]
[pipeline-api] Make empty traversers more efficient [#1700]
[pipeline-api] Update default parallelism of map/cache sources and sinks to 1 [#1774]
[pipeline-api] Introduce ability to add Jars in ZIP files as job resources [#1681]
[pipeline-api] StatefulMapTransform should evict all items on job completion [#1861]
[core] Improve default logging experience [#1948]
[core] Add convenience method to simplify building jet configs inline [#1714]
[core] Parallelize tasklet initialization [#1740]
[core] Add option to specify unicast routing policy for DAG edges [#1766]
[hadoop] Support using new Hadoop API in HadoopSources/Sinks [#1636]
[spring] Add support for mapUsingService to use Spring beans directly [#1642]
[distribution] Auto import modules in JDK9+ in start script [#1737]
[jet-cli] Add daemon mode and rolling file logger [#1783]
[jet-cli] Introduced an option to pick main class from JAR files [#1800]
[jet-cli] Allow for the selection of an entry class when submitting job from the CLI [#1796]
[documentation] Enhance Hadoop JARs and Classpath chapter in reference manual [#1830]
[documentation] Explain how to parametrise jobs when submitting it using jet.sh [#1794]
[documentation] Document S3 sink behaviour and limitation for streaming jobs [#1795]
[code-samples] Add examples for various Cloud Object Storage format using Hadoop [#1623]
[demos] Add H2O ML Model Inference demo [https://github.com/hazelcast/hazelcast-jet-demos/tree/master/h2o-breast-cancer-classification]

3. Fixes

[pipeline-api] Fix inconsistencies with @Nonnull and @Nullable annotations [#1675]
[pipeline-api] Fail fast when merging of a timestamped and non-timestamped stream [#1776]
[core] Fix long job start times with a very large graph [#1806, #1825]
[core] Fix deserialization exception for Object[] when using remote map sink [#1444]
[core] Change join job operation to not be retried on failure [#1656]
[core] Fix OperationTimeoutException when join request is sent to non-master node [#1661]
[core] Fix race in job coordination service [#1680]
[core] Fix issue in JDBC sink when writing timestamps [#1682]
[core] Add automatic retry for job related methods when master is going down [#1624]
[core] Fix "Buffer full" error when saving large snapshots [#1769]
[core] Fix fragmentation type error in saving snapshots [#1771]
[core] Fix metrics related warning messages during startup [#1699]
[core] Fix a bug causing the emission old watermarks [#1879]
[core] Remove checked exceptions from JobConfig [#1896]
[kafka] Do not auto-commit to Kafka when not using at-least/ex-once [#1934]
[jet-cli] Make error messages more descriptive when submitting through command line[#1951]
[jet-cli] Fix jet.sh submit to not report error messages as NULL [#1717]

4. Breaking Changes

[pipeline-api] Rename "xUsingContext" to "xUsingService" [#1696]
[pipeline-api] Removed flatMap/filterUsingServiceAsync methods [#1919]
[pipeline-api] Make ProcessorSupplier.Context available in services [#1891]
[pipeline-api] Rename Pipeline.drawFrom/drainTo to readFrom/writeTo [#1735]
[core] Update Jet to Hazelcast 4.0 [#1483, #1552, #1695]
[core] JobConfig.resourceConfig is now private [#1841]
[core] Replace JetBoostrap.getInstance() with Jet.bootstrappedInstance() [#1827]
[core] Introduce non-classpath resource upload mechanism [#1824]
[core] Add instance-wide lifecycle management to ServiceFactory (previously ContextFactory) [#1787, #1797]
[core] Avoid nested wildcards in flatMap [#1736]
[core] Use Context object instead of writer in SinkBuilder [#1785]
[core] Some options from JMS source and sink are removed to support ex-once processing [#1804]
[hadoop] Hadoop source/sink now named as HadoopSources.inputFormat/outputFormat()
[licensing] Move connectors and plugins to the Hazelcast Community License [#1892]


** Hazelcast Jet 3.2 **

1. New Features

[pipeline-api] Add test sources and assertion sinks which can be used for testing pipelines [#1457]
[pipeline-api] {map/flatMap/filter}Stateful operator which enables new kinds of stateful processing [#1516]
[core] Add ability to query job metrics through Job API and add option to store metrics for completed jobs [#1459]
[s3] Add sources and sinks for Amazon AWS S3 [#1538]

2. Enhancements

[pipeline-api] Add ability to adapt AggregateOperation1 to Hazelcast Aggregtor [#1513]
[pipeline-api] IMDG map and cache reader is with a much faster, cooperative reader [#1514]
[pipeline-api] IMDG map writer is replaced with faster, cooperative writer [#1539, #1545]
[jet-cli] Add support for YAML configuration to CLI [#1475]
[code-samples] Code samples have been moved to the main Jet repository [#1546]
[core] Support for multigraphs in DAG [#1332]
[core] Cap number of job results in the cluster to 1,000 and add configuration property [#1495]
[core] Replace job ID generator with FlakeID [#1488]
[core] Update Hazelcast to 3.12.3 [#1673]
[core] Add ability to configure both min and max idle time for both cooperative/non-cooperative threads [#1507]
[core] Make it optional to enable/disable metrics for a specific job [#1509]
[core] Add extended information to DOT format output [#1526]

3. Fixes

[pipeline-api] Timestamp transform should match parallelism of upstream transform [#1563]
[pipeline-api] Add missing serializability checks for sources and sinks [#1455]
[pipeline-api] Default to lower parallelism of 2 for non-cooperative context factory [#1571]
[jet-cli] Saved snapshots and running jobs should be sorted by name and sanitized [#1556]
[jet-cli] Fix default group name in cluster.sh [#1577]
[core] Do not use blocking client threads where possible [#1485]
[core] Fix for checking system property for shutdown hook registration [#1461]
[core] Fix for mixing and matching Hazelcast XML and YAML configuration with Jet XML or YAML [#1474]
[core] Avoid creating job resources map if it won't be needed [#1493]
[core] Do not attempt to clear snapshot maps on job starts [#1494]
[core] Fix race which may happen between cancellation and restarting [#1544]
[core] Fix race which may happen during multiple clients calling the same job [#1557]
[core] Fix for races when getting job status and config that could result in job being reported as missing [#1567]
[core] Make snapshots logs less noisy [#1573]
[core] Fix for deadlock when many jobs are restarting at the same time [#1583]
[core] Add more details to exceptions if a job fails with TopologyChangedException [#1595]
[core] Add consistent exception if job.join() is called before or after job is completed [#1600, #1612]


** Hazelcast Jet 3.1 **

1. New Features

[pipeline-api] Enable composite transforms using `apply` operator [#1352]
[pipeline-api] Add support for fault tolerant sources to SourceBuilder API [#1394]
[core] YAML configuration support [#1371]
[integration] Source and sink for Elasticsearch [https://github.com/hazelcast/hazelcast-jet-contrib/tree/master/elasticsearch]
[integration] Source and sink for InfluxDB [https://github.com/hazelcast/hazelcast-jet-contrib/tree/master/influxdb]
[beam] First release of Hazelcast Jet Beam Runner [https://beam.apache.org/documentation/runners/jet/]

2. Enhancements

[pipeline-api] New AggregateOperations: `filtering` and `flatMapping` [#1369]
[pipeline-api] Consecutive transform stages will be merged into one vertex during execution [#1325]
[pipeline-api] Hash-join operator now supports non-distinct keys on the secondary inputs [#1327]
[pipeline-api] Idle time out for streaming sources are now configurable using
               StreamSource.setPartitionIdleTimeout() [#1328]
[pipeline-api] Optimizations for batch grouping operator to release memory eagerly [#1345]
[kafka] Kafka client updated to version 2.2

3. Fixes

[jet-cli] Improve parsing of command line arguments for jet.sh [#1409, #1411, #1449]
[core] Improve handling of errors if operation packets are lost [#1377, #1435]
[core] Configured classloader in Hazelcast Config should be set as the parent of job classloader [#1395]
[core] Job classloader will now print a warning if it's used after a job is completed [#1315, #1446]
[core] Snapshot creation should be handled gracefully even if execution is already completed on a member [#1397]
[core] Added check to ensure that any explicit Hazelcast IMDG dependency has same version as the shaded one [#1412]
[core] Fix StackOverFlowError when a very long path in DAG is used [#1430]
[kafka] Improve Kafka source responsiveness when broker is down [#1429]
[kafka] Improve handling of TimeoutException in Kafka sink [#1433]

4. Breaking Changes

[pipeline-api] Previously it was possible to close the buffer in SourceBuilder when building a streaming source,
               however a streaming source by definition should never close. buffer.close() method now throws when
               called inside a streaming source. [#1394]
[core] Signatures of SourceProcessors.convenientSourceP and convenientTimestampedSourceP
       have been updated to support fault tolerance [#1394]


** Hazelcast Jet 3.0 **

1. New Features

[jet-enterprise] Support for job upgrades [#1154]
[jet-enterprise] Support for lossless recovery through use of Hot Restart [#1159, #1174]
[pipeline-api] Add async support for mapUsingContext [#1193]
[pipeline-api] Support for early window results [#1244]
[core] New Command Line interface, `jet.sh` for job management [#1202]
[core] Implement support for exclusive job execution [#1203]
[core] Update IMDG version to 3.12 [#1343]

2. Enhancements

[pipeline-api] Remove watermarks from a pipeline with no windowing stages [#1091]
[pipeline-api] Optimize mapWithMerging to use less memory [#1107]
[pipeline-api] Improve performance of global aggregation [#1242]
[pipeline-api] Don't require User Code Deployment when reading from remote IMDG journal [#1306]
[core] Automatically restart job if a partition is being migrated when reading from IMap [#1243]
[core] Reuse same maps when taking snapshots [#1104]
[core] Added new metrics for monitoring watermarks and latencies [#1173]
[core] Make minimum idle time in execution service configurable [#1317]
[code-samples] Introduce Tensorflow integration sample [#172]
[code-samples] Introduce Early Window Results sample [#181]

3. Fixes

[core] Support non-smart clients by routing job requests to master [#1129]
[core] Jet client should be automatically shut down when using JetBootstrap [#1225]
[core] Support for JDK9-11 builds [#1223]
[core] Prevent mutation of JobConfig affecting the job after job is submitted [#1233]
[core] Fix race in cooperative worker shutdown [#1296]
[core] Simplify garbage collection for job resources [#1320]
[core] Fix for potential race during initialization of multiple JetInstances [#1322]
[core] Improve exception when JetBootstrap is used without the submit script [#1321]
[pipeline-api] Global session windows should have local parallelism of one [#1300]
[hadoop] Fix creation of RecordWriter to receive its own copy [#1309]

4. Breaking Changes

[pipeline-api] When reading from a source, user must now specify how the timestamps should be handled [#1166]
[pipeline-api] DistributedFunction.constantKey() is removed [#1242]
[pipeline-api] Some methods in ContextFactory have been renamed [#1285]
[pipeline-api] mapUsingIMap and mapUsingReplicated map operations have been simplified and now make use of async calls [#1292]
[pipeline-api] Functional interfaces such as `DistributedFunction` have been renamed as `FunctionEx`. Unused functional interfaces
have been removed [#1293]
[pipeline-api] Window operators now emit `KeyedWindowResult` or `WindowResult` instead of `TimestampedItem` or `TimestampedEntry` [#1244]
[pipeline-api] TimestampedItem and TimestampedEntry have been removed [#1307]
[core-api] Edge.allToOne() now has a constant key parameter [#1242]
[core-api] Watermark policies except `limitingLag` is removed [#1184]
[core-api] maxRetain option from EdgeConfig is removed [#1184]
[core] MetricsConfig.setMetricsForDataStructures is renamed to setMetricsForDataStructuresEnabled [#1201]
[core] jet-submit.sh script has been superseded by `jet.sh submit` command [#1202]
[core] When submitting jobs, if a job with same name already exists an exception will be thrown [#1203]
[core] Group password is deprecated and removed [#1302]


** Hazelcast Jet 0.7.2 **

1. Fixes

[core] Fix for missing config schema file in previous release


** Hazelcast Jet 0.7.1 **

1. New Features

[kubernetes] Full support for running Hazelcast Jet on Kubernetes
[kubernetes] Hazelcast Jet Helm Charts are released

2. Enhancements

[pipeline-api] TopN and BottomN aggregate operations are added [#1140]

3. Fixes

[pipeline-api] All of ClientConfig must be serialized when connecting to remote IMDG sources and sinks [#1147]
[core] Add scaleUpDelay config option to XML config [#1148]
[core] Extract lambdas to avoid allocating new lambdas during processing [#1106, #1249]
[core] Fix for a race during snapshot creation which could result in snapshot not completing [#1101]
[core] Don't materialize distinct keys in SessionWindowP [#1121]
[core] Do not add Watermarks to a stream if there are no windowing stages [#1144]


** Hazelcast Jet 0.7 **

1. New Features

[pipeline-api] Add JMS connectors [#874]
[pipeline-api] New Merge and distinct operations and simpler co-aggregation [#885]
[pipeline-api] Add Avro connector for working with Avro files [#890, #925]
[pipeline-api] Add map/flatMap/filterUsingContext for keyed streams [#892]
[pipeline-api] Add JDBC connector [#931]
[pipeline-api] Add convenient enrichment from IMap and ReplicatedMap [#924]
[pipeline-api] Add a source builder for building custom sources [#989]
[core] Expose metrics through JMX [#926]
[core] Add full job elasticity with graceful shutdown and suspend and resume [#946]

2. Enhancements

[pipeline-api] Add support for DOT file visualization for DAG and Pipeline API [#891]
[pipeline-api] Add name to SinkBuilder [#894]
[pipeline-api] File sources and sinks have been converted to use builders for more convenience [#913]
[pipeline-api] Add exception throwing methods to distributed lambdas [#951]
[pipeline-api] Add "AggregateOperation.andThen" [#959]
[pipeline-api] Add Tuple4 and Tuple5 [#964]
[core] Improve Watermark diagnostics logging [#872]
[core] Processors should be closed as soon as processor is completed [#934]
[core] jobId(), executionId() and jobConfig() are now available on Processor.Context [#934]
[core] Use job name in logs [#939]
[core] Add JetClientConfig which uses the default jet group name and password [#950]
[core] Update Hazelcast to 3.10.5 [#1005]

3. Fixes

[pipeline-api] Using results of a window aggregation in another window shouldn't cause a window shift [#898]
[pipeline-api] mapToOutputFn in aggregations should support returning nulls [#938]
[pipeline-api] Fix for mapWithMerging which shouldn't use a stateful flush function [#968]
[kafka] Handle InterruptException in StreamKafkaP.close() [#870]
[java.util.stream] java.util.stream implementation is removed. It has been superceeded by the Pipeline API [#983]
[spring] Spring module should no longer add dependency to hazelcast when used with spring boot [#977]
[spring] Spring context should be injected to wrapped processors as well [#999]

4. Breaking Changes

[pipeline-api] API for co-aggregation has been simplified
[pipeline-api] File sources and sinks have been replaced with a builder API through Sources.filesBuilder()
[pipeline-api] SinkBuilder now requires a name and takes Processor.Context as input in createFn
[core] AbstractProcessor.setCooperative is removed
[core] Remove tempDir from config as it was unused
[core] Processor.close() no longer receives the exception for the job

** Hazelcast Jet 0.6.1 **

1. New Features

[core] Add support for configuring a custom classloader per job [#770]

2. Enhancements

[pipeline-api] Add a noop sink [#827]
[core] Optimize in memory layout of snapshot data, reducing memory usage by up to 75% [#822]
[core] Update Hazelcast to 3.10-GA [#833]
[core] Idle CPU usage improvements when there's a large number of non-cooperative processors [#816]
[core] Utility methods to load JetConfig from XML file or resource directly [#856]

3. Fixes

[pipeline-api] Fix generic output type for aggregate operations with a custom mapToOutputFn [#823]
[pipeline-api] SinkBuilder shouldn't call destroyFn if createFn wasn't called [#826]
[core] Don't shrink receive window during lulls which can lead to reduced throughput [#798]
[kafka] Kafka source should handle InterruptException in all cases
[hadoop] When matching HDFS hostnames against member hostnames, use alternative ways than just reverse DNS [#858]


** Hazelcast Jet 0.6 **

1. New Features

[pipeline-api] Windowing support and overhaul of Pipeline API to work with streaming sources [#731]
[pipeline-api] New updating and merging map sinks which update the value in place [#621]
[pipeline-api] Custom sink builder support for Pipeline API [#762]
[core] Improved job lifecycle features such as naming jobs and getting jobs by name [#666]
[core] Ability to restart jobs manually to make use of newly joined members [#693]
[spring] Add support for annotation and XML based spring configuration [#757]

2. Enhancements

[pipeline-api] Predictable vertex names when convering Pipelines to DAG [#616]
[pipeline-api] Improved AggregateOperations.allOf() to be type-safe
[pipeline-api] Add support for stateful transform operations in the pipeline API [#744]
[pipeline-api] Add ability to set parallelism and name of each stage separately [#731]
[pipeline-api] Add generic Predicate factory methods [#695]
[core] Support for idle streaming sources through a configurable idle timeout
       where idle processors are excluded from Watermark coalescing. [#660]
[core] Add support for initializing processors with Hazelcast Managed Context [#645]
[core] Improved watermark coalescing and processing [#649]
[core] Make parallelism information available to Processor.Context [#754]
[core] Include Hazelcast Javadocs in Jet distribution [#652]
[core] Add Java 9 build support and automatic module names [#720]
[core] Add ability to emit file name from file sources [#729]
[core] Several Javadoc improvements
[java.util.stream] New DistributedStream instances now can work with Pipeline API sources
[kafka] Kafka version updated to 1.0.0
[hadoop] Hadoop version updated to 2.8.3

3. Fixes

[core] Avoid race between job cancellation and completion [#604]
[core] Do not send a join request for a job unless Job.join() is explicitly called [#628]
[core] When master node leaves cluster, job would restart even if auto-restart was disabled [#683]
[core] When using map source, returning null in a projection would cause rest of the items to be dropped [#669]
[core] When DAG fails to deserialize on job submission from client, the exception was not returned to user [#794]
[core] Fix for `ClassNotFoundException` when restoring from snapshot when the key class is not on Jet classpath [#778]
[core] Assert that always same item offered to Outbox after a rejection [#808]
[kafka] Kafka sink should ensure that all records are sent before snapshot [#611]
[kafka/hadoop] Package names reorganized to have better support for module systems

4. Breaking Changes

[pipeline-api] Grouping and aggregation in Pipeline API now done through .groupingKey() and .aggregate() methods
[pipeline-api] Package names for Pipeline API have been reorganized.
[core] Job cancellation can now only be done through Job.cancel() rather than Job.getFuture().cancel()
[core] IStreamMap, IStreamList and IStreamCache respectively renamed to IMapJet, IListJet and ICacheJet
[core] Dedicated tryProcessWatermark() method is now responsible for processing Watermarks in a processor
and watermarks will be forwarded automatically once it returns true.
[core] start-jet.sh, submit-jet.sh and other scripts renamed to have prefix "jet" instead.
[core] `CloseableProcessorSupplier` is replaced with a `close()`` method on Processor instead.
[core] `complete` methods on `ProcessorMetaSupplier` and `ProcessorSupplier` have been renamed to `close()`
[java.util.stream] DistributedStream creation moved to DistributedStream class from Map and List instances. We strongly
suggest to switch to Pipeline API instead of java.util.stream API.


** Hazelcast Jet 0.5 **

1. New Features

[core] New Pipeline API with support for group by, hash join and co group [#497]
[core] Event journal streaming source for Map and Cache [#487]
[core] Improved Jet job lifecycle management including auto-restart [#492]
[core] Support for in-memory snapshots and at-least and exactly-once processing [#500]

2. Enhancements

[core] Add projection and predicate capability to map reader [#490]
[core] Hazelcast version updated to 3.9 [#474]
[core] InsertWatermarksProcessor will now log late events [#551]
[core] Add preferred local parallelism to all the sources and sinks [#552]
[core] Socket source now uses non-blocking IO [#554]
[core] Add ProcessorMetaSupplier.complete() method to support global cleanup [#571]
[java.util.stream] Support for creating a stream from any source [#360]
[kafka] Add snapshotting support for Kafka reader [#500]
[kafka] Add optional projection function to Kafka reader [#534]
[kafka] Add ability to create own ProducerRecord instances for Kafka writer [#588]

3. Fixes

[core] Fix NPE when releasing uninitialized ResourceStore  [#478]
[core] Add cache manager in order not to require a dependency on javax.cache [#485]
[core] JetClassLoader should not throw on findResource [#549]
[core] Fix ignored charset in StreamSocketP [#553]
[core] Suppress exception for flow control packet when member has already left cluster [#556]
[core] Kafka source should throw when partition count < global parallelism [#559]
[core] Traversers.traverseStream should close stream when exhausted [#560]
[core] Add missing serializer for Session type [#562]
[hdfs] Make sure proper global cleanup is performed on job cancellation [#572]

4. Code Samples Improvements

* Overall module reorganization roughly divided to code samples using pipeline API and core API.
* Several examples migrated to use the new pipeline API
* New examples using hash join enrichment and co group
* New code samples illustrating the new event journal and fault tolerance features
* New code samples showing how to use HDFS with java.util.stream

