Skip to content

bundle librdkafka binaries for aarch64 #1326

Closed
@sibeream

Description

@sibeream

Description

docker run -ti python:3.8-slim-buster /bin/bash
pip install confluent-kafka==1.8.2

The above commands produce different results on x86_64 and aarch64 platforms.

Operating systems in use:

  • Fedora 34 (Intel i7)
  • macOS 12.3.1 (Apple M1)

For x86_64 confluent-kafka is just installed inside the container, for aarch64 the output is the following:

Collecting confluent-kafka==1.8.2
  Downloading confluent-kafka-1.8.2.tar.gz (104 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.6/104.6 KB 6.0 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: confluent-kafka
  Building wheel for confluent-kafka (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [46 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-aarch64-3.8
      creating build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/serializing_producer.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/deserializing_consumer.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      creating build/lib.linux-aarch64-3.8/confluent_kafka/admin
      copying src/confluent_kafka/admin/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/admin
      creating build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_producer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_consumer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      creating build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/avro.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/schema_registry_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/protobuf.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/json_schema.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      creating build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/load.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/cached_schema_registry_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      creating build/lib.linux-aarch64-3.8/confluent_kafka/serialization
      copying src/confluent_kafka/serialization/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/serialization
      creating build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      copying src/confluent_kafka/avro/serializer/message_serializer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      copying src/confluent_kafka/avro/serializer/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      running build_ext
      building 'confluent_kafka.cimpl' extension
      creating build/temp.linux-aarch64-3.8
      creating build/temp.linux-aarch64-3.8/tmp
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src
      gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.8 -c /tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src/confluent_kafka.c -o build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src/confluent_kafka.o
      unable to execute 'gcc': No such file or directory
      error: command 'gcc' failed with exit status 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for confluent-kafka
  Running setup.py clean for confluent-kafka
Failed to build confluent-kafka
Installing collected packages: confluent-kafka
  Running setup.py install for confluent-kafka ... error
  error: subprocess-exited-with-error

  × Running setup.py install for confluent-kafka did not run successfully.
  │ exit code: 1
  ╰─> [46 lines of output]
      running install
      running build
      running build_py
      creating build
      creating build/lib.linux-aarch64-3.8
      creating build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/serializing_producer.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      copying src/confluent_kafka/deserializing_consumer.py -> build/lib.linux-aarch64-3.8/confluent_kafka
      creating build/lib.linux-aarch64-3.8/confluent_kafka/admin
      copying src/confluent_kafka/admin/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/admin
      creating build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_producer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      copying src/confluent_kafka/kafkatest/verifiable_consumer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/kafkatest
      creating build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/avro.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/schema_registry_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/protobuf.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      copying src/confluent_kafka/schema_registry/json_schema.py -> build/lib.linux-aarch64-3.8/confluent_kafka/schema_registry
      creating build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/load.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/error.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      copying src/confluent_kafka/avro/cached_schema_registry_client.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro
      creating build/lib.linux-aarch64-3.8/confluent_kafka/serialization
      copying src/confluent_kafka/serialization/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/serialization
      creating build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      copying src/confluent_kafka/avro/serializer/message_serializer.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      copying src/confluent_kafka/avro/serializer/__init__.py -> build/lib.linux-aarch64-3.8/confluent_kafka/avro/serializer
      running build_ext
      building 'confluent_kafka.cimpl' extension
      creating build/temp.linux-aarch64-3.8
      creating build/temp.linux-aarch64-3.8/tmp
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka
      creating build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src
      gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.8 -c /tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src/confluent_kafka.c -o build/temp.linux-aarch64-3.8/tmp/pip-install-78fm53p7/confluent-kafka_060c7cd0cc7442439d07b79c45239cd7/src/confluent_kafka/src/confluent_kafka.o
      unable to execute 'gcc': No such file or directory
      error: command 'gcc' failed with exit status 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> confluent-kafka

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.

I assume the reason for the discrepancy in the behaviour is that some binaries are bundled for x86_64, but are missing for aarch64.
Is it possible to prebuild and bundle those binaries from your side?
The discrepancy in deliverables make it far more complicated to support different architectures for users of the package.

How to reproduce

Run the following commands on aarch64 platform (Apple M1 for instance)
docker run -ti python:3.8-slim-buster /bin/bash
pip install confluent-kafka==1.8.2

Checklist

Please provide the following information:

  • confluent-kafka-python and librdkafka version (confluent_kafka.version() and confluent_kafka.libversion()):
  • Apache Kafka broker version:
  • Client configuration: {...}
  • Operating system: macOS 12.3.1 (Apple M1) and Fedora 34 (Intel i7)
  • Provide client logs (with 'debug': '..' as necessary)
  • Provide broker log excerpts
  • Critical issue

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions