[Python] Apache Flink sinkfunction python code throws exception

Discussão em 'Python' iniciado por Stack, Agosto 2, 2025.

  1. Stack

    Stack Membro Participativo

    The Apache Flink 2.1 does not support mongodb python connectors. So I make the sample python codes by using SinkFunction.

    from pyflink.datastream import StreamExecutionEnvironment
    from pyflink.datastream.functions import SinkFunction
    from pymongo import MongoClient
    import json

    class MongoSink(SinkFunction):

    def __init__(self, uri, database, collection):
    self._uri = uri
    self._db = database
    self._coll = collection
    self._client = None

    def open(self, runtime_context):
    self._client = MongoClient(self._uri)
    self.collection = self._client[self._db][self._coll]

    def invoke(self, value, context):
    doc = value
    if isinstance(value, str):
    doc = json.loads(value)
    self.collection.insert_one(doc)

    def close(self):
    if self._client:
    self._client.close()


    def main():
    env = StreamExecutionEnvironment.get_execution_environment()
    env.add_jars('file:///home/joseph/flink/jars/flink-connector-mongodb-2.0.0-1.20.jar'
    ,'file:///home/joseph/flink/jars/flink-connector-mongodb-cdc-3.0.1.jar')
    # your data stream
    ds = env.from_collection([
    '{"_id":1, "name":"Alice"}',
    '{"_id":2, "name":"Bob"}'
    ])
    ds.add_sink(MongoSink(
    uri="mongodb://user:pass@127.0.0.1:27017",
    database="my_db",
    collection="my_coll"
    ))
    env.execute("PyFlink MongoDB")

    if __name__ == "__main__":
    main()


    But the exceptions are thrown from Sink class.

    Traceback (most recent call last):
    File "/home/joseph/VSCode_Workspace/etl-stream-python/com/aaa/etl/etl_data_uploader_mysql.py", line 78, in <module>
    main()
    File "/home/joseph/VSCode_Workspace/etl-stream-python/com/aaa/etl/etl_data_uploader_mysql.py", line 70, in main
    ds.add_sink(MongoSink(
    File "/home/joseph/VSCode_Workspace/.venv-etl/lib/python3.11/site-packages/pyflink/datastream/data_stream.py", line 819, in add_sink
    return DataStreamSink(self._j_data_stream.addSink(sink_func.get_java_function()))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/home/joseph/VSCode_Workspace/.venv-etl/lib/python3.11/site-packages/pyflink/datastream/functions.py", line 586, in get_java_function
    return self._j_function
    ^^^^^^^^^^^^^^^^
    AttributeError: 'MongoSink' object has no attribute '_j_function'


    I want to know if I can make sink class with pyflink 2.1 or not. Kindly inform me the python MongoDB sink class example codes.

    Continue reading...

Compartilhe esta Página