Running Flink jobs in MiniCluster using the Kubernetes Operator

August 5th, 2026

I’ve submitted a Flink Improvement Proposal (FLIP) about adding support for the Flink Kubernetes Operator to run Flink’s MiniCluster in a single pod for low-throughput jobs that require isolation.

In the last few weeks, I’ve been working on a proof-of-concept to demonstrate the feasibility of this idea. I’ve done enough to convince myself that this is viable and identify where the issues will be, but I’m looking for community feedback before I take it much further.

Background

The Flink Kubernetes Operator is one of the best ways to run Flink jobs. From the documentation:

Flink deployments are declared like any other Kubernetes workload, and the operator runs their whole operational life:

  • Lifecycle Management: deployment, stateful upgrades, rollbacks, and self-healing
  • Zero-Downtime Upgrades: blue/green deployments that switch over only once the new version is proven healthy
  • Autoscaling: parallelism and memory continuously right-sized to the observed load
  • Kubernetes-Native Operations: Helm installation, RBAC, high availability, metrics, logging, and ingress

You create a FlinkDeployment Kubernetes custom resource that points to your Flink application, and the Operator handles provisioning independently schedulable and independently configurable Job Manager Deployment and Task Manager Deployment, configuring them to form a distributed Flink cluster.

This provides scalability and high availability, and is the right approach in a lot of situations. However, this comes at the cost of a fixed baseline cost of at least one JobManager pod and one or more TaskManager pods.

A smaller, lighter-weight alternative would be useful for small or intermittent jobs, where the minimum resource cost of two separately-scheduled pods is disproportionate to the job itself.

A single-pod, self-contained Flink job that starts fast and needs no multi-pod coordination could be a good fit for low-throughput jobs that aren’t suitable for session clusters because they need isolation.

Read the rest of this entry »

Generative AI with tool calling in Scratch

July 10th, 2026

In this post, I want to share a new feature in the generative AI support in Machine Learning for Kids: tool calling.

I wrote last year about how I introduced Generative AI in Machine Learning for Kids by adding support for projects using small language models. And earlier this year, I walked through my six favourite projects for explaining different aspects of Gen AI.

This week I’ve been working on extending the language model support in the site, by adding a new model that is capable of tool calling.


demo video at youtu.be/HdcTseNvjhU

Why is tool calling useful?

Try asking a model what the weather is like in New York right now.

If the temperature and top-p is high enough, many of the models will likely hallucinate an answer.

If the temperature and top-p is low enough, the models can just respond that they cannot answer that.

(If you don’t know why “temperature” makes that difference, I’ve written about that before and have a student worksheet that focuses on this.)

This second answer is more accurate at least, but it is still not helpful. The point is, if you ask the model for something that can’t possibly be represented in the knowledge used to create it, the model cannot give a helpful answer by itself.

Tool calling helps in these situations by making tools available to the model. It can call these tools to help respond to prompts that can’t be answered by the model alone.

Read the rest of this entry »

Why I enjoy my commute

July 5th, 2026

My commute to work is one of the favourite parts of my day. I’ve mentioned it before, more often than I probably should, but in this post I try and explain why I enjoy it so much.

The journey

Otterbourne village and crossing the motorway

I start off walking through Otterbourne: past the pub, across Otterbourne Hill Green and past the weird mini-castle at Otterbourne Hill Reservoir (I still don’t really understand what that’s all about).

Read the rest of this entry »

I have a new job!

July 4th, 2026

In April, I wrote an outline of my career. That post is already out of date, because I have a new job to add to the list.

I’m joining Confluent as a Principal Software Engineer working on Confluent Platform for Apache Flink.

I won’t try and describe what “Confluent Platform for Flink” is here. Partly because I’m sure I’ll have plenty to say about it in coming months. Mostly because I’ve got a lot to learn and anything I say today will almost certainly be incomplete or inaccurate in ways I’ll find embarrassing once I know more. In the meantime, the product page or the docs site are the best places to go if you’re curious.

But that won’t stop me speculating about what this all means for me.

Read the rest of this entry »

iTunes extension for Scratch

June 9th, 2026

In this post, I want to share a new Scratch extension I made today.

screenshot

It uses the iTunes Search API to let you search for songs, and play 30 second previews of them, in your Scratch projects.

The blocks are simple, and hopefully self-explanatory, but here is a short demo of them in action if it’s not obvious.

I’ve added this extension to the version of Scratch I host for Machine Learning for Kids, so you’ll need to go there to try it out. (To access the extensions library, click on the extensions button in the bottom left.)

Read the rest of this entry »

Presenting at Current / Kafka Summit

May 21st, 2026

A few of us at Current this week were talking about how Current (formerly “Kafka Summit”) has changed over the years, and it got me remembering the bits I’ve contributed.

I dug through some old posts to find seven Current / Kafka Summit talks I’ve done… it makes for an eclectic set when I see it in one list!

Embedding Tiny Language Models in Flink SQL

May 20th, 2026

I gave a talk at Current yesterday about how to embed a tiny language model inside your Flink SQL pipeline.

I used a fun mix of demos to show what I think are the main approaches available for using generative AI with Kafka events from a Flink SQL job. Some demos were definitely more sensible than others!

These are the slides I used, and what I’d planned to say.

#

In this session, I’ll be talking about your options for running language models for Flink SQL jobs.

I’ll cover:

  • your options for where you run them, in relation to Flink
  • what sorts of choices you have for the models you run
  • how to use them – the sorts of prompts and settings we’d want for Flink
  • how to keep an eye on it that it’s working well
  • and finally, some thoughts on when it’s a good idea to do any of this

Read the rest of this entry »

Instrumenting a Kafka Connect connector with metrics

May 2nd, 2026

Metrics can help provide operational insight over Kafka Connect connectors, informing users of how to better configure them. With simple updates, a Kafka Connect connector can be instrumented to make this possible by emitting useful metrics.

A couple years ago, I created a simple skeleton Connect connector project to help developers at a hackathon create their first Kafka connector.

I’ve updated the source connector from that sample to emit metrics. In this post, I’ll walk through what I did, as an example for how to add metrics to your own Kafka connector.

Read the rest of this entry »