There are a few separate issues in here that we should
tackle/investigate in parallel.
Improve storage of latency metrics
Given how absurdly the number of latency metrics scale with # of
operators / parallelism
it makes sense to introduce a special case here. I'm not quite sure yet
how easily this can
be done though, as this isn't just about storage but also about
transmission from the TM -> JM,
which is just as inefficient as the storage.
Configurable granularity for latency metrics
The main reason for the scaling issue above is that we track latency
from each operator subtask
to each source subtask. If we only accounted for the source ID instead
we would significantly
reduce the number of metrics, while still providing some insight into
latency.
Here's a comparison for the number of individual data points in the
MetricStore,
for 2 sources, 6 subsequent operators, parallelism=100:
Current: 1.320.000
SourceID-only: 13.200
Separate dispatcher thread-pool from REST API / metrics
We currently use the same thread-pool for inserting metrics / processing
REST requests
that is also used for the Dispatcher RPC, i.e., intra-cluster communication.
To better isolate the Dispatcher we should provide separate thread-pools
to both
components to prevent worst-case scenarios in the future.
Find the bottleneck
I've run some preliminary benchmarks and the MetricStore itself appears
to be fast enough
to handle these loads, so the search continues...
On 24.08.2018 15:06, Jozef Vilcek wrote:
With `latencyTrackingInterval` set to `0` cluster runs fine.
So, is this something which make sense to be improved? JIRA I can track or
file one?
On Fri, Aug 24, 2018 at 11:50 AM Chesnay Schepler <ches...@apache.org>
wrote:
I believe the only thing you can do is disable latency tracking, by
setting the `latencyTrackingInterval` in `env.getExecutionConfig()` to 0 or
a negative value.
The update frequency is not configurable and currently set to 10 seconds.
Latency metrics are tracked as the cross-product of all subtasks of all
operators and all subtasks of all sources.
That is, if you have 2 sources, with 2 other operators and a parallelism
of 10 you can end up with 400 latency metrics.
10 (subtasks per source) * 10 (subtasks per operator) * 2 (# operators) *
2 (#-sources)
On 24.08.2018 11:28, Jozef Vilcek wrote:
For my small job, I see ~24k those latency metrics @
'/jobs/.../metrics'. That job is much smaller in terms of production
parallelism.
Are there any options here. Can it be turned off, reduced histogram
metrics, reduced update frequency, ... ?
Also, keeping it flat seems to use quite some memory of JM
{"id":"latency.source_id.2f6436c1f4f0c70e401663acf945a822.source_subtask_index.2.operator_id.4060d9664a78e1d82671ac80921843cd.operator_subtask_index.1.latency_stddev"}
On Fri, Aug 24, 2018 at 10:08 AM Chesnay Schepler <ches...@apache.org>
wrote:
In 1.5 the latency metric was changed to be reported on the job-level,
that's why you see it under /jobs/.../metrics now, but not in 1.4.
In 1.4 you would see something similar under
/jobs/.../vertices/.../metrics, for each vertex.
Additionally it is now a proper histogram, which significantly increases
the number of accesses to the ConcurrentHashMaps that store metrics fort
he UI. It could be that this code is just too slow for the amount of
metrics.
On 23.08.2018 19:06, Jozef Vilcek wrote:
parallelism is 100. I tried clusters with 1 and 2 slots per TM yielding
100 or 50 TMs in cluster.
I did notice that URL http://jobmanager:port/jobs/job_id/metrics in
1.5.x
returns huge list of "latency.source_id. ...." IDs. Heap dump shows that
hash map takes 1.6GB for me. I am guessing that is the one dispatcher
threads keep updating. Not sure what are those. In 1.4.0 that URL
returns
something else, very short list.
On Thu, Aug 23, 2018 at 6:44 PM Piotr Nowojski <pi...@data-artisans.com
wrote:
Hi,
How many task slots do you have in the cluster and per machine, and
what
parallelism are you using?
Piotrek
On 23 Aug 2018, at 16:21, Jozef Vilcek <jozo.vil...@gmail.com> wrote:
Yes, on smaller data and therefore smaller resources and parallelism
exactly same job runs fine
On Thu, Aug 23, 2018, 16:11 Aljoscha Krettek <aljos...@apache.org>
wrote:
Hi,
So with Flink 1.5.3 but a smaller parallelism the job works fine?
Best,
Aljoscha
On 23. Aug 2018, at 15:25, Jozef Vilcek <jozo.vil...@gmail.com>
wrote:
Hello,
I am trying to get my Beam application (run on newer version of
Flink
(1.5.3) but having trouble with that. When I submit application,
everything
works fine but after a few mins (as soon as 2 minutes after job
start)
cluster just goes bad. Logs are full of timeouts for heartbeats,
JobManager
lost leadership, TaskExecutor timed out etc.
At that time, also WebUI is not usable. Looking into job manager, I
did
notice that all of "flink-akka.actor.default-dispatcher" threads are
busy
or blocked. Most blocks are on metrics:
=======================================
java.lang.Thread.State: BLOCKED (on object monitor)
at
org.apache.flink.runtime.rest.handler.legacy.metrics.MetricStore.addAll(MetricStore.java:84)
- waiting to lock <0x000000053df75510> (a
org.apache.flink.runtime.rest.handler.legacy.metrics.MetricStore)
at
org.apache.flink.runtime.rest.handler.legacy.metrics.MetricFetcher.lambda$queryMetrics$5(MetricFetcher.java:205)
at
org.apache.flink.runtime.rest.handler.legacy.metrics.MetricFetcher$$Lambda$201/995076607.accept(Unknown
Source)
at
java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
...
=======================================
I tried to increase memory, as MetricStore seems to hold quite a lot
stuff,
but it is not helping. On 1.4.0 job manager was running with 4GB
heap,
now,
this behaviour also occur with 10G.
Any suggestions?
Best,
Jozef
P.S.: Executed Beam app has problem in setup with 100 parallelism,
100
task
slots, 2100 running task, streaming mode. Smaller job runs without
problem