Integration with Kafka
The Kafka and SQL Stream Builder integration enables you to use the Kafka-specific syntax to customize your SQL queries based on your deployment and use case.
Performance & Scalability
You can achieve high performance and scalability with SQL Stream Builder, but the proper configuration and design of the source Kafka topic is critical. SQL Stream Builder can read a maximum of one thread per Kafka partition. You can achieve the highest performance configuration when setting the SQL Stream Builder threads equal to or higher than the number of Kafka partitions.
If the number of partitions is less than the number of SQL Stream Builder threads, then SQL Stream Builder has idle threads and messages show up in the logs indicating as such. For more information about Kafka partitioning, see the Kafka partitions documentation.
Kafka record metadata access
There are cases when it is required to access additional metadata from the Kafka record to implement the correct processing logic. SQL Stream Builder has access to this information using the Input Transforms functionality. For more information about Input Transforms, see the Input Transforms section.
record.topic
record.key
record.value
record.headers
record.offset
record.partition
var out = JSON.parse(record);
out['topic'] = message.topic;
out['partition'] = message.partition;
JSON.stringify(out);
{
"name": "myschema",
"type": "record",
"namespace": "com.cloudera.test",
"fields": [
{
"name": "id",
"type": "int"
},
{
"name": "topic",
"type": "string"
},
{
"name": "partition",
"type": "string"
}
]
}
record.headers
is an array that can be iterated
over:var out = JSON.parse(record);
var header = JSON.parse(record.headers);
var interested_keys = ['DC']; // should match schema definition
out['topic'] = record.topic;
out['partition'] = record.partition;
Object.keys(header).forEach(function(key) {
if (interested_keys.indexOf(key) > -1){ // if match found for schema, set value
out[key] = header[key];
}
});
JSON.stringify(out);
{
"name": "myschema",
"type": "record",
"namespace": "com.cloudera.test",
"fields": [
{
"name": "id",
"type": "int"
},
{
"name": "topic",
"type": "string"
},
{
"name": "partition",
"type": "string"
},
{
"name": "DC",
"type": "string"
}
]
}