You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@storm.apache.org by Sa Li <sa...@gmail.com> on 2014/12/09 07:36:09 UTC

questions about storm-kafka-RDBMS

Hi, All

I have been struggling for the work to getting data from Kafka and write data into database (postgresql).  I thought it supposed to a simple task, but seems I stuck here. I’ve tried two ways. both of them didn’t work properly, here are my problems:

1. storm-kafka spout along with storm-RDBMS. I can get data from kafka by storm-kafka spout, but with the problem to write into DB, even I can write into DB, it write into DB per row not bulk copy. 

2. I used trident topology, and persistAggregator to update DB, with this method, I can write into DB, but can’t do bulk copy. Then I wrote a baseFunction to do that, still having trouble to pass connection into it, should I use singleton connection pool?


public static class WriteDB extends BaseFunction {
        PreparedStatement ps = null ;
        postgresConnector connector = new postgresConnector() ;
        Connection conn = connector.connectToDatabaseOrDie();
        @Override
        public final void execute(final TridentTuple tuple, final TridentCollector collector) {
            int user = tuple.getInteger(0);
            String value = tuple.getString(1);
            final StringBuilder queryBuilder = new StringBuilder()
                    .append("INSERT INTO test.state(userid, event) VALUES(")
                    .append(user)
                    .append(", '")
                    .append(value)
                    .append("')");
            try {
                ps = conn.prepareStatement(queryBuilder.toString()) ;
                ps.execute();
                collector.emit(new Values(tuple.getStringByField("event")));
            } catch (SQLException ex) {
                System.err.println("Caught IOException: " + ex.getMessage());
            }finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException ex) {
                    }
                }
            }
        }
    }

I am sure writing data from kafka into database should not be a big issue with batch mode, however I can’t find a proper way to do it. Any help?


thanks

Alec

Re: questions about storm-kafka-RDBMS

Posted by John Reilly <jr...@inconspicuous.org>.
I have not tried extending BaseFunction, but I would assume that you should
be implementing the prepare method and setting connector and connection
fields in there.

On Mon Dec 08 2014 at 10:37:19 PM Sa Li <sa...@gmail.com> wrote:

> Hi, All
>
> I have been struggling for the work to getting data from Kafka and write
> data into database (postgresql).  I thought it supposed to a simple task,
> but seems I stuck here. I’ve tried two ways. both of them didn’t work
> properly, here are my problems:
>
> 1. storm-kafka spout along with storm-RDBMS. I can get data from kafka by
> storm-kafka spout, but with the problem to write into DB, even I can write
> into DB, it write into DB per row not bulk copy.
>
> 2. I used trident topology, and persistAggregator to update DB, with this
> method, I can write into DB, but can’t do bulk copy. Then I wrote a
> baseFunction to do that, still having trouble to pass connection into it,
> should I use singleton connection pool?
>
>
> public static class WriteDB extends BaseFunction {
>         PreparedStatement ps = null ;
>         postgresConnector connector = new postgresConnector() ;
>         Connection conn = connector.connectToDatabaseOrDie();
>         @Override
>         public final void execute(final TridentTuple tuple, final
> TridentCollector collector) {
>             int user = tuple.getInteger(0);
>             String value = tuple.getString(1);
>             final StringBuilder queryBuilder = new StringBuilder()
>                     .append("INSERT INTO test.state(userid, event)
> VALUES(")
>                     .append(user)
>                     .append(", '")
>                     .append(value)
>                     .append("')");
>             try {
>                 ps = conn.prepareStatement(queryBuilder.toString()) ;
>                 ps.execute();
>                 collector.emit(new Values(tuple.getStringByField(
> "event")));
>             } catch (SQLException ex) {
>                 System.err.println("Caught IOException: " +
> ex.getMessage());
>             }finally {
>                 if (ps != null) {
>                     try {
>                         ps.close();
>                     } catch (SQLException ex) {
>                     }
>                 }
>             }
>         }
>     }
>
> I am sure writing data from kafka into database should not be a big issue
> with batch mode, however I can’t find a proper way to do it. Any help?
>
>
> thanks
>
> Alec