mirror of
				https://github.com/datahub-project/datahub.git
				synced 2025-10-31 18:59:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			240 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Integrating with Confluent Cloud
 | |
| 
 | |
| DataHub provides the ability to easily leverage Confluent Cloud as your Kafka provider. To do so, you'll need to configure DataHub to talk to a broker and schema registry hosted by Confluent.
 | |
| 
 | |
| Doing this is a matter of configuring the Kafka Producer and Consumers used by DataHub correctly. There are 2 places where Kafka configuration should be provided: the metadata service (GMS) and the frontend server (datahub-frontend). Follow the steps below to configure these components for your deployment.
 | |
| 
 | |
| ## **Step 1: Create topics in Confluent Control Center**
 | |
| 
 | |
| First, you'll need to create following new topics in the [Confluent Control Center](https://docs.confluent.io/platform/current/control-center/index.html). By default they have the following names:
 | |
| 
 | |
| 1. **MetadataChangeProposal_v1**
 | |
| 2. **FailedMetadataChangeProposal_v1**
 | |
| 3. **MetadataChangeLog_Versioned_v1**
 | |
| 4. **MetadataChangeLog_Timeseries_v1**
 | |
| 5. **DataHubUsageEvent_v1**: User behavior tracking event for UI
 | |
| 6. (Deprecated) **MetadataChangeEvent_v4**: Metadata change proposal messages
 | |
| 7. (Deprecated) **MetadataAuditEvent_v4**: Metadata change log messages
 | |
| 8. (Deprecated) **FailedMetadataChangeEvent_v4**: Failed to process #1 event
 | |
| 9. **MetadataGraphEvent_v4**:
 | |
| 10. **PlatformEvent_v1**
 | |
| 11. **DataHubUpgradeHistory_v1**: Notifies the end of DataHub Upgrade job so dependants can act accordingly (_eg_, startup).
 | |
|     Note this topic requires special configuration: **Infinite retention**. Also, 1 partition is enough for the occasional traffic.
 | |
| 
 | |
| The first five are the most important, and are explained in more depth in [MCP/MCL](../advanced/mcp-mcl.md). The final topics are
 | |
| those which are deprecated but still used under certain circumstances. It is likely that in the future they will be completely
 | |
| decommissioned.
 | |
| 
 | |
| To create the topics, navigate to your **Cluster** and click "Create Topic". Feel free to tweak the default topic configurations to
 | |
| match your preferences.
 | |
| 
 | |
| <p align="center">
 | |
|   <img width="70%"  src="https://raw.githubusercontent.com/datahub-project/static-assets/main/imgs/confluent-create-topic.png"/>
 | |
| </p>
 | |
| 
 | |
| ## Step 2: Configure DataHub Container to use Confluent Cloud Topics
 | |
| 
 | |
| ### Docker Compose
 | |
| 
 | |
| If you are deploying DataHub via docker compose, enabling connection to Confluent is a matter of a) creating topics in the Confluent Control Center and b) changing the default container environment variables.
 | |
| 
 | |
| First, configure GMS to connect to Confluent Cloud by changing `docker/gms/env/docker.env`:
 | |
| 
 | |
| ```
 | |
| KAFKA_BOOTSTRAP_SERVER=pkc-g4ml2.eu-west-2.aws.confluent.cloud:9092
 | |
| KAFKA_SCHEMAREGISTRY_URL=https://plrm-qwlpp.us-east-2.aws.confluent.cloud
 | |
| 
 | |
| # Confluent Cloud Configs
 | |
| SPRING_KAFKA_PROPERTIES_SECURITY_PROTOCOL=SASL_SSL
 | |
| SPRING_KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule   required username='XFA45EL1QFUQP4PA' password='ltyf96EvR1YYutsjLB3ZYfrk+yfCXD8sQHCE3EMp57A2jNs4RR7J1bU9k6lM6rU';
 | |
| SPRING_KAFKA_PROPERTIES_SASL_MECHANISM=PLAIN
 | |
| SPRING_KAFKA_PROPERTIES_CLIENT_DNS_LOOKUP=use_all_dns_ips
 | |
| SPRING_KAFKA_PROPERTIES_BASIC_AUTH_CREDENTIALS_SOURCE=USER_INFO
 | |
| SPRING_KAFKA_PROPERTIES_BASIC_AUTH_USER_INFO=P2ETAN5QR2LCWL14:RTjqw7AfETDl0RZo/7R0123LhPYs2TGjFKmvMWUFnlJ3uKubFbB1Sfs7aOjjNi1m23
 | |
| ```
 | |
| 
 | |
| Next, configure datahub-frontend to connect to Confluent Cloud by changing `docker/datahub-frontend/env/docker.env`:
 | |
| 
 | |
| ```
 | |
| KAFKA_BOOTSTRAP_SERVER=pkc-g4ml2.eu-west-2.aws.confluent.cloud:9092
 | |
| 
 | |
| # Confluent Cloud Configs
 | |
| KAFKA_PROPERTIES_SECURITY_PROTOCOL=SASL_SSL
 | |
| KAFKA_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule   required username='XFA45EL1QFUQP4PA' password='ltyf96EvR1YYutsjLB3ZYfrk+yfCXD8sQHCE3EMp57A2jNs4RR7J1bU9k6lM6rU';
 | |
| KAFKA_PROPERTIES_SASL_MECHANISM=PLAIN
 | |
| KAFKA_PROPERTIES_CLIENT_DNS_LOOKUP=use_all_dns_ips
 | |
| KAFKA_PROPERTIES_BASIC_AUTH_CREDENTIALS_SOURCE=USER_INFO
 | |
| KAFKA_PROPERTIES_BASIC_AUTH_USER_INFO=P2ETAN5QR2LCWL14:RTjqw7AfETDl0RZo/7R0123LhPYs2TGjFKmvMWUFnlJ3uKubFbB1Sfs7aOjjNi1m23
 | |
| ```
 | |
| 
 | |
| Note that this step is only required if `DATAHUB_ANALYTICS_ENABLED` environment variable is not explicitly set to false for the datahub-frontend
 | |
| container.
 | |
| 
 | |
| If you're deploying with Docker Compose, you do not need to deploy the Zookeeper, Kafka Broker, or Schema Registry containers that ship by default.
 | |
| 
 | |
| #### DataHub Actions
 | |
| 
 | |
| Configuring Confluent Cloud for DataHub Actions requires some additional edits to your `executor.yaml`. Under the Kafka
 | |
| source connection config you will need to add the Python style client connection information:
 | |
| 
 | |
| ```yaml
 | |
| connection:
 | |
|   bootstrap: ${KAFKA_BOOTSTRAP_SERVER:-localhost:9092}
 | |
|   schema_registry_url: ${SCHEMA_REGISTRY_URL:-http://localhost:8081}
 | |
|   consumer_config:
 | |
|     security.protocol: ${KAFKA_PROPERTIES_SECURITY_PROTOCOL:-PLAINTEXT}
 | |
|     sasl.mechanism: ${KAFKA_PROPERTIES_SASL_MECHANISM:-PLAIN}
 | |
|     sasl.username: ${KAFKA_PROPERTIES_SASL_USERNAME}
 | |
|     sasl.password: ${KAFKA_PROPERTIES_SASL_PASSWORD}
 | |
|   schema_registry_config:
 | |
|     basic.auth.user.info: ${KAFKA_PROPERTIES_BASIC_AUTH_USER_INFO}
 | |
| ```
 | |
| 
 | |
| Specifically `sasl.username` and `sasl.password` are the differences from the base `executor.yaml` example file.
 | |
| 
 | |
| Additionally, you will need to set up environment variables for `KAFKA_PROPERTIES_SASL_USERNAME` and `KAFKA_PROPERTIES_SASL_PASSWORD`
 | |
| which will use the same username and API Key you generated for the JAAS config.
 | |
| 
 | |
| See [Overwriting a System Action Config](https://github.com/acryldata/datahub-actions/blob/main/docker/README.md#overwriting-a-system-action-config) for detailed reflection procedures.
 | |
| 
 | |
| Next, configure datahub-actions to connect to Confluent Cloud by changing `docker/datahub-actions/env/docker.env`:
 | |
| 
 | |
| ```
 | |
| KAFKA_BOOTSTRAP_SERVER=pkc-g4ml2.eu-west-2.aws.confluent.cloud:9092
 | |
| SCHEMA_REGISTRY_URL=https://plrm-qwlpp.us-east-2.aws.confluent.cloud
 | |
| 
 | |
| # Confluent Cloud Configs
 | |
| KAFKA_PROPERTIES_SECURITY_PROTOCOL=SASL_SSL
 | |
| KAFKA_PROPERTIES_SASL_USERNAME=XFA45EL1QFUQP4PA
 | |
| KAFKA_PROPERTIES_SASL_PASSWORD=ltyf96EvR1YYutsjLB3ZYfrk+yfCXD8sQHCE3EMp57A2jNs4RR7J1bU9k6lM6rU
 | |
| KAFKA_PROPERTIES_SASL_MECHANISM=PLAIN
 | |
| KAFKA_PROPERTIES_CLIENT_DNS_LOOKUP=use_all_dns_ips
 | |
| KAFKA_PROPERTIES_BASIC_AUTH_CREDENTIALS_SOURCE=USER_INFO
 | |
| KAFKA_PROPERTIES_BASIC_AUTH_USER_INFO=P2ETAN5QR2LCWL14:RTjqw7AfETDl0RZo/7R0123LhPYs2TGjFKmvMWUFnlJ3uKubFbB1Sfs7aOjjNi1m23
 | |
| ```
 | |
| 
 | |
| ### Helm
 | |
| 
 | |
| If you're deploying on K8s using Helm, you can simply change the **datahub-helm** `values.yml` to point to Confluent Cloud and disable some default containers:
 | |
| 
 | |
| First, disable the `cp-schema-registry` service:
 | |
| 
 | |
| ```
 | |
| cp-schema-registry:
 | |
|   enabled: false
 | |
| ```
 | |
| 
 | |
| Next, disable the `kafkaSetupJob` service:
 | |
| 
 | |
| ```
 | |
| kafkaSetupJob:
 | |
|     enabled: false
 | |
| ```
 | |
| 
 | |
| Then, update the `kafka` configurations to point to your Confluent Cloud broker and schema registry instance, along with the topics you've created in Step 1:
 | |
| 
 | |
| ```
 | |
| kafka:
 | |
|       bootstrap:
 | |
|         server: pkc-g4ml2.eu-west-2.aws.confluent.cloud:9092
 | |
|       schemaregistry:
 | |
|         url: https://plrm-qwlpp.us-east-2.aws.confluent.cloud
 | |
| ```
 | |
| 
 | |
| Next, you'll want to create 2 new Kubernetes secrets, one for the JaaS configuration which contains the username and password for Confluent,
 | |
| and another for the user info used for connecting to the schema registry. You'll find the values for each within the Confluent Control Center. Specifically,
 | |
| select "Clients" -> "Configure new Java Client". You should see a page like the following:
 | |
| 
 | |
| <p align="center">
 | |
|   <img width="70%"  src="https://raw.githubusercontent.com/datahub-project/static-assets/main/imgs/confluent-cloud-config.png"/>
 | |
| </p>
 | |
| 
 | |
| You'll want to generate both a Kafka Cluster API Key & a Schema Registry key. Once you do so,you should see the config
 | |
| automatically populate with your new secrets:
 | |
| 
 | |
| <p align="center">
 | |
|   <img width="70%"  src="https://raw.githubusercontent.com/datahub-project/static-assets/main/imgs/confluent-cloud-config-2.png"/>
 | |
| </p>
 | |
| 
 | |
| You'll need to copy the values of `sasl.jaas.config` and `basic.auth.user.info`
 | |
| for the next step.
 | |
| 
 | |
| The next step is to create K8s secrets containing the config values you've just generated. Specifically, you can run the following commands:
 | |
| 
 | |
| ```shell
 | |
| kubectl create secret generic confluent-secrets --from-literal=sasl_jaas_config="<your-sasl.jaas.config>"
 | |
| kubectl create secret generic confluent-secrets --from-literal=basic_auth_user_info="<your-basic.auth.user.info>"
 | |
| ```
 | |
| 
 | |
| With your config values substituted as appropriate. For example, in our case we'd run:
 | |
| 
 | |
| ```shell
 | |
| kubectl create secret generic confluent-secrets --from-literal=sasl_jaas_config="org.apache.kafka.common.security.plain.PlainLoginModule   required username='XFA45EL1QFUQP4PA' password='ltyf96EvR1YYutsjLB3ZYfrk+yfCXD8sQHCE3EMp57A2jNs4RR7J1bU9k6lM6rU';"
 | |
| kubectl create secret generic confluent-secrets --from-literal=basic_auth_user_info="P2ETAN5QR2LCWL14:RTjqw7AfETDl0RZo/7R0123LhPYs2TGjFKmvMWUFnlJ3uKubFbB1Sfs7aOjjNi1m23"
 | |
| ```
 | |
| 
 | |
| Finally, we'll configure our containers to pick up the Confluent Kafka Configs by changing two config blocks in our `values.yaml` file. You
 | |
| should see these blocks commented at the bottom of the template. You'll want to uncomment them and set them to the following values:
 | |
| 
 | |
| ```
 | |
| credentialsAndCertsSecrets:
 | |
|   name: confluent-secrets
 | |
|   secureEnv:
 | |
|     sasl.jaas.config: sasl_jaas_config
 | |
|     basic.auth.user.info: basic_auth_user_info
 | |
| 
 | |
| 
 | |
| springKafkaConfigurationOverrides:
 | |
|       security.protocol: SASL_SSL
 | |
|       sasl.mechanism: PLAIN
 | |
|       client.dns.lookup: use_all_dns_ips
 | |
|       basic.auth.credentials.source: USER_INFO
 | |
| ```
 | |
| 
 | |
| Then simply apply the updated `values.yaml` to your K8s cluster via `kubectl apply`.
 | |
| 
 | |
| #### DataHub Actions
 | |
| 
 | |
| Configuring Confluent Cloud for DataHub Actions requires some additional edits to your `executor.yaml`. Under the Kafka
 | |
| source connection config you will need to add the Python style client connection information:
 | |
| 
 | |
| ```yaml
 | |
| connection:
 | |
|   bootstrap: ${KAFKA_BOOTSTRAP_SERVER:-localhost:9092}
 | |
|   schema_registry_url: ${SCHEMA_REGISTRY_URL:-http://localhost:8081}
 | |
|   consumer_config:
 | |
|     security.protocol: ${KAFKA_PROPERTIES_SECURITY_PROTOCOL:-PLAINTEXT}
 | |
|     sasl.mechanism: ${KAFKA_PROPERTIES_SASL_MECHANISM:-PLAIN}
 | |
|     sasl.username: ${KAFKA_PROPERTIES_SASL_USERNAME}
 | |
|     sasl.password: ${KAFKA_PROPERTIES_SASL_PASSWORD}
 | |
|   schema_registry_config:
 | |
|     basic.auth.user.info: ${KAFKA_PROPERTIES_BASIC_AUTH_USER_INFO}
 | |
| ```
 | |
| 
 | |
| Specifically `sasl.username` and `sasl.password` are the differences from the base `executor.yaml` example file.
 | |
| 
 | |
| Additionally, you will need to set up secrets for `KAFKA_PROPERTIES_SASL_USERNAME` and `KAFKA_PROPERTIES_SASL_PASSWORD`
 | |
| which will use the same username and API Key you generated for the JAAS config.
 | |
| 
 | |
| See [Overwriting a System Action Config](https://github.com/acryldata/datahub-actions/blob/main/docker/README.md#overwriting-a-system-action-config) for detailed reflection procedures.
 | |
| 
 | |
| ```yaml
 | |
| credentialsAndCertsSecrets:
 | |
|   name: confluent-secrets
 | |
|   secureEnv:
 | |
|     sasl.jaas.config: sasl_jaas_config
 | |
|     basic.auth.user.info: basic_auth_user_info
 | |
|     sasl.username: sasl_username
 | |
|     sasl.password: sasl_password
 | |
| ```
 | |
| 
 | |
| The Actions pod will automatically pick these up in the correctly named environment variables when they are named this exact way.
 | |
| 
 | |
| ## Contribution
 | |
| 
 | |
| Accepting contributions for a setup script compatible with Confluent Cloud!
 | |
| 
 | |
| The kafka-setup-job container we ship with is only compatible with a distribution of Kafka wherein ZooKeeper
 | |
| is exposed and available. A version of the job using the [Confluent CLI](https://docs.confluent.io/confluent-cli/current/command-reference/kafka/topic/confluent_kafka_topic_create.html)
 | |
| would be very useful for the broader community.
 | 
