MQTT Source Connector for Confluent Cloud¶
The fully-managed MQTT Source connector for Confluent Cloud attaches to an MQTT broker, subscribes to specified topics, and streams data from these topics into Apache Kafka®.
Note
- This Quick Start is for the fully-managed Confluent Cloud connector. If you are installing the connector locally for Confluent Platform, see MQTT Source Connector for Confluent Platform.
- If you require private networking for fully-managed connectors, make sure to set up the proper networking beforehand. For more information, see Manage Networking for Confluent Cloud Connectors.
Features¶
The MQTT Source connector provides the following features:
- Topics created automatically: The connector can automatically create the Kafka topic.
- Multiple tasks: The connector supports multiple tasks. More tasks may improve performance.
- SSL support: Supports two-way SSL.
- MQTT client version: The connector uses
paho mqttv3 client
.
For more information and examples to use with the Confluent Cloud API for Connect, see the Confluent Cloud API for Connect Usage Examples section.
Limitations¶
Be sure to review the following information.
At least once delivery¶
To support at-least-once semantics, you should run the connector with
mqtt.clean.session.enabled
set to false
. Under this mode, the
connector will assign each task a unique client ID, which will be used for a
persistent connection.
The topics are distributed across tasks. Confluent recommends you do not change the topic assignments–that is, do not alter the task count, or change the topic listing once the connector is up and running. This can potentially lead to data loss as the connector will be restarted with a different topic to task assignments, and hence, a different client ID.
Others¶
- For connector limitations, see MQTT Source Connector limitations.
- If you plan to use one or more Single Message Transforms (SMTs), see SMT Limitations.
- If you plan to use Confluent Cloud Schema Registry, see Schema Registry Enabled Environments.
Quick Start¶
Use this quick start to get up and running with the Confluent Cloud MQTT source connector. The quick start shows how to attach the connector to an MQTT broker, subscribe to the specified topics, and stream data into Apache Kafka®.
- Prerequisites
- Authorized access to a Confluent Cloud cluster on Amazon Web Services (AWS), Microsoft Azure (Azure), or Google Cloud.
- Access to an MQTT broker.
- The Confluent CLI installed and configured for the cluster. See Install the Confluent CLI.
- The connector automatically creates Kafka topics or you can create the topic manually.
- Schema Registry must be enabled to use a Schema Registry-based format (for example, Avro, JSON_SR (JSON Schema), or Protobuf). See Schema Registry Enabled Environments for additional information.
- For networking considerations, see Networking and DNS. To use a set of public egress IP addresses, see Public Egress IP Addresses for Confluent Cloud Connectors.
- Kafka cluster credentials. The following lists the different ways you can provide credentials.
- Enter an existing service account resource ID.
- Create a Confluent Cloud service account for the connector. Make sure to review the ACL entries required in the service account documentation. Some connectors have specific ACL requirements.
- Create a Confluent Cloud API key and secret. To create a key and secret, you can use confluent api-key create or you can autogenerate the API key and secret directly in the Cloud Console when setting up the connector.
Using the Confluent Cloud Console¶
Step 1: Launch your Confluent Cloud cluster¶
See the Quick Start for Confluent Cloud for installation instructions.
Step 2: Add a connector¶
In the left navigation menu, click Connectors. If you already have connectors in your cluster, click + Add connector.
Step 4: Enter the connector details¶
Note
- Make sure you have all your prerequisites completed.
- An asterisk ( * ) designates a required entry.
At the Add MQTT Source Connector screen, complete the following:
- Select the way you want to provide Kafka Cluster credentials. You can
choose one of the following options:
- My account: This setting allows your connector to globally access everything that you have access to. With a user account, the connector uses an API key and secret to access the Kafka cluster. This option is not recommended for production.
- Service account: This setting limits the access for your connector by using a service account. This option is recommended for production.
- Use an existing API key: This setting allows you to specify an API key and a secret pair. You can use an existing pair or create a new one. This method is not recommended for production environments.
- Click Continue.
- Enter the MQTT connection details:
- List of Server URIs: The URI of the MQTT broker. This must be
given in the format
<PROTOCOL>//:URI>
. The supported protocols are TCP, SSL, WS, WSS. Note that for a connection that uses TLS, you must provide the required key stores and trust stores. - Username: The username the connector will use to connect to the host.
- MQTT Topics: MQTT topics to subscribe to.
- Password: Password to connect with.
- SSL Keystore: The key store containing the server certificate.
- Keystore Password: Password used to open the Java KeyStore file.
- Key Password: Password for the client certificate contained in the Java KeyStore.
- SSL Truststore: The trust store containing server CA certificate.
- Truststore Password: Password used to open the Java TrustStore file.
- List of Server URIs: The URI of the MQTT broker. This must be
given in the format
- Click Continue.
Set the following configuration:
- MQTT QOS: The MQTT QOS level to subscribe to. Valid values are 0, 1, and 2.
Show advanced configurations
Schema context: Select a schema context to use for this connector, if using a schema-based data format. This property defaults to the Default context, which configures the connector to use the default schema set up for Schema Registry in your Confluent Cloud environment. A schema context allows you to use separate schemas (like schema sub-registries) tied to topics in different Kafka clusters that share the same Schema Registry environment. For example, if you select a non-default context, a Source connector uses only that schema context to register a schema and a Sink connector uses only that schema context to read from. For more information about setting up a schema context, see What are schema contexts and when should you use them?.
Clean Session?: Select whether the client and server should remember state across restarts and reconnects.
Connection Timeout: Sets the connection timeout value in seconds.
Connection Keepalive: Defines the maximum time interval in seconds between messages sent or received.
Max Retry Time: The maximum amount of time in milliseconds (ms) the connector will spend backing off and retrying failed operations (connecting to the MQTT broker and publishing records).
Transforms and Predicates: See the Single Message Transforms (SMT) documentation for details.
Click Continue
Based on the number of topic partitions you select, you will be provided with a recommended number of tasks.
- To change the number of tasks, use the Range Slider to select the desired number of tasks.
- Click Continue.
Verify the connection details by previewing the running configuration.
Tip
For information about previewing your connector output, see Data Previews for Confluent Cloud Connectors.
Once you’ve validated that the properties are configured to your satisfaction, click Launch.
The status for the connector should go from Provisioning to Running.
Step 5: Check the Kafka topic¶
After the connector is running, verify that messages are populating your Kafka topic.
For more information and examples to use with the Confluent Cloud API for Connect, see the Confluent Cloud API for Connect Usage Examples section.
Using the Confluent CLI¶
Complete the following steps to set up and run the connector using the Confluent CLI.
Note
Make sure you have all your prerequisites completed.
Step 1: List the available connectors¶
Enter the following command to list available connectors:
confluent connect plugin list
Step 2: List the connector configuration properties¶
Enter the following command to show the connector configuration properties:
confluent connect plugin describe <connector-plugin-name>
The command output shows the required and optional configuration properties.
Step 3: Create the connector configuration file¶
Create a JSON file that contains the connector configuration properties. The following example shows the required connector properties.
{
"connector.class": "MqttSource",
"name": "MqttSource_0",
"kafka.auth.mode": "KAFKA_API_KEY",
"kafka.api.key": "<my-kafka-api-key>",
"kafka.api.secret": "<my-kafka-api-secret>",
"kafka.topic" : "data_topic_0",
"mqtt.server.uri" : "tcp://192.0.0.1:1881",
"mqtt.topics" : "broker_topic_0",
"tasks.max" : "1"
}
Note the following property definitions:
"name"
: Sets a name for your new connector."connector.class"
: Identifies the connector plugin name.
"kafka.auth.mode"
: Identifies the connector authentication mode you want to use. There are two options:SERVICE_ACCOUNT
orKAFKA_API_KEY
(the default). To use an API key and secret, specify the configuration propertieskafka.api.key
andkafka.api.secret
, as shown in the example configuration (above). To use a service account, specify the Resource ID in the propertykafka.service.account.id=<service-account-resource-ID>
. To list the available service account resource IDs, use the following command:confluent iam service-account list
For example:
confluent iam service-account list Id | Resource ID | Name | Description +---------+-------------+-------------------+------------------- 123456 | sa-l1r23m | sa-1 | Service account 1 789101 | sa-l4d56p | sa-2 | Service account 2
"kafka.topic"
: The Kafka topic name where you want data sent. If not used, the default topic name created ismqtt
."mqtt.server.uri"
: The MQTT broker URI. Must be in the format<PROTOCOL>//:URI
. If the MQTT broker does not support anonymous mode, you must add the following two additional properties:"mqtt.username"
:"<mqtt_broker_username>"
"mqtt.password"
:"<user_password>"
The supported protocols are TCP, SSL, WS, and WSS.
For TLS connections, you must supply the keystore and/or truststore file contents and the file passwords creating the connector configuration JSON. The truststore and keystore files are binary files. For the
mqtt.ssl.trust.store.file
and themqtt.ssl.key.store.file
properties, you encode the truststore or keystore file in base64, take the encoded string, add thedata:text/plain:base64
prefix, and then use the entire string as the property entry. For example:"mqtt.ssl.key.store.file" : "data:text/plain;base64,/u3+7QAAAAIAAAACAAAAAQAGY2xpZ...omitted...=="
In addition to adding the file contents, you must also supply the passwords using the properties
mqtt.ssl.key.password
, mqtt.ssl.key.store.password
and mqtt.ssl.trust.store.password
. These are
the passwords you used while creating the jks and pkcs12 keystore and truststore. For all property values and
definitions, see Configuration Properties.
"mqtt.topics"
: The broker topic (or comma-separated broker topics) to subscribe to."tasks.max"
: Enter the number of tasks in use by the connector. The connector supports multiple tasks. More tasks may improve performance.
Single Message Transforms: See the Single Message Transforms (SMT) documentation for details about adding SMTs. See Unsupported transformations for a list of SMTs that are not supported with this connector.
Step 4: Load the properties file and create the connector¶
Enter the following command to load the configuration and start the connector:
confluent connect cluster create --config-file <file-name>.json
For example:
confluent connect cluster create --config-file mqtt-source.json
Example output:
Created connector MqttSource_0 lcc-ix4dl
Step 5: Check the connector status¶
Enter the following command to check the connector status:
confluent connect plugin list
Example output:
ID | Name | Status | Type
+-----------+-----------------+---------+-------+
lcc-ix4dl | MqttSource_0 | RUNNING | source
Step 6: Check the results on the broker.¶
After the connector is running, verify that messages are populating your Kafka topic.
For more information and examples to use with the Confluent Cloud API for Connect, see the Confluent Cloud API for Connect Usage Examples section.
Configuration Properties¶
Use the following configuration properties with the fully-managed connector. For self-managed connector property definitions and other details, see the connector docs in Self-managed connectors for Confluent Platform.
How should we connect to your data?¶
name
Sets a name for your connector.
- Type: string
- Valid Values: A string at most 64 characters long
- Importance: high
Kafka Cluster credentials¶
kafka.auth.mode
Kafka Authentication mode. It can be one of KAFKA_API_KEY or SERVICE_ACCOUNT. It defaults to KAFKA_API_KEY mode.
- Type: string
- Default: KAFKA_API_KEY
- Valid Values: KAFKA_API_KEY, SERVICE_ACCOUNT
- Importance: high
kafka.api.key
Kafka API Key. Required when kafka.auth.mode==KAFKA_API_KEY.
- Type: password
- Importance: high
kafka.service.account.id
The Service Account that will be used to generate the API keys to communicate with Kafka Cluster.
- Type: string
- Importance: high
kafka.api.secret
Secret associated with Kafka API key. Required when kafka.auth.mode==KAFKA_API_KEY.
- Type: password
- Importance: high
Which topic do you want to send data to?¶
kafka.topic
Identifies the topic name to write the data to.
- Type: string
- Importance: high
How should we connect to MQTT Broker?¶
mqtt.server.uri
The URI of the MQTT broker. This must be given in the format <PROTOCOL>//:URI. The supported protocols are tcp, ssl, ws, wss. Note that for a connection that uses TLS, you must provide the required key stores and trust stores.
- Type: list
- Importance: high
mqtt.username
Username to connect with, or blank if a username is not required. Note: username field is masked as it may contain sensitive information
- Type: password
- Importance: high
mqtt.password
Password to connect with, or blank if a password is not required.
- Type: password
- Default: [hidden]
- Importance: high
MQTT secure connection¶
mqtt.ssl.key.store.file
The location of the Java KeyStore file containing the private key to use for authenticating with the server.
- Type: password
- Default: [hidden]
- Importance: low
mqtt.ssl.key.store.password
Password used to open the Java KeyStore file.
- Type: password
- Default: [hidden]
- Importance: medium
mqtt.ssl.key.password
Password for the client certificate contained in the Java KeyStore.
- Type: password
- Default: [hidden]
- Importance: high
mqtt.ssl.trust.store.file
The location of the Java TrustStore file containing the certificates required to validate the SSL connection to the server.
- Type: password
- Default: [hidden]
- Importance: medium
mqtt.ssl.trust.store.password
Password used to open the Java TrustStore file.
- Type: password
- Default: [hidden]
- Importance: medium
Connection Details¶
mqtt.clean.session.enabled
Sets whether the client and server should remember state across restarts and reconnects. Note that for unreceived messages to be received after reconnect you should set the QOS to 1 or above.
- Type: boolean
- Default: false
- Importance: medium
mqtt.connect.timeout.seconds
Sets the connection timeout value in seconds.
- Type: int
- Default: 30
- Importance: medium
mqtt.keepalive.interval.seconds
This value, measured in seconds, defines the maximum time interval between messages sent or received. In the absence of a data-related message during the time period, the client sends a very small “ping” message, which the server will acknowledge.
- Type: int
- Default: 60
- Importance: medium
max.retry.time.ms
The maximum time in milliseconds (ms) the connector will spend backing off and retrying failed operations (connecting to the MQTT broker and publishing records).
- Type: int
- Default: 30000 (30 seconds)
- Importance: medium
mqtt.topics
The MQTT topics to subscribe to.
- Type: list
- Importance: high
mqtt.qos
The MQTT QOS level to subscribe to. Valid values are 0, 1 and 2.
- Type: int
- Default: 0
- Importance: low
records.buffer.queue.size
The capacity of the buffer queue that stores the data before sending it to the Kafka Topic.
- Type: int
- Default: 50000
- Valid Values: [10000,…,100000]
- Importance: low
records.buffer.queue.max.batch.size
The maximum size of the batch to send to Kafka topic in a single request.
- Type: int
- Default: 4096
- Valid Values: [100,…,4096]
- Importance: low
records.buffer.queue.empty.timeout
Timeout to wait on an empty buffer queue for extracting records.
- Type: int
- Default: 100
- Valid Values: [10,…,10000]
- Importance: low
records.buffer.queue.full.timeout
Timeout to wait on a full buffer queue for inserting new records.
- Type: int
- Default: 60000
- Valid Values: [30000,…,300000]
- Importance: low
Number of tasks for this connector¶
tasks.max
Maximum number of tasks for the connector.
- Type: int
- Valid Values: [1,…]
- Importance: high
Next Steps¶
For an example that shows fully-managed Confluent Cloud connectors in action with Confluent Cloud ksqlDB, see the Cloud ETL Demo. This example also shows how to use Confluent CLI to manage your resources in Confluent Cloud.