Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用cassandra数据库查询作为Flink程序的源_Java_Sockets_Cassandra_Apache Flink - Fatal编程技术网

Java 使用cassandra数据库查询作为Flink程序的源

Java 使用cassandra数据库查询作为Flink程序的源,java,sockets,cassandra,apache-flink,Java,Sockets,Cassandra,Apache Flink,我有一个Cassandra数据库,它必须在我的Flink程序中从类似套接字的steam接收数据,以便进行流处理。因此,我编写了一个简单的客户端程序,从Cassandra读取数据并将数据发送到套接字;另外,我在server base中编写了Flink程序。事实上,我的客户端程序很简单,不使用任何Flink指令;它只发送一个字符串格式的Cassandra行到套接字,服务器必须接收该行。 首先,我运行Flink程序来监听客户机,然后运行客户机程序。客户端从服务器接收到此流(因为服务器发送数据流数据,而

我有一个Cassandra数据库,它必须在我的Flink程序中从类似套接字的steam接收数据,以便进行流处理。因此,我编写了一个简单的客户端程序,从Cassandra读取数据并将数据发送到套接字;另外,我在server base中编写了Flink程序。事实上,我的客户端程序很简单,不使用任何Flink指令;它只发送一个字符串格式的Cassandra行到套接字,服务器必须接收该行。 首先,我运行Flink程序来监听客户机,然后运行客户机程序。客户端从服务器接收到此流(因为服务器发送数据流数据,而客户端无法正确接收):

Hi Client org.apache.flink.streaming.api.datastream。DataStreamSource@68c72235

之后,两个程序都保持运行,不发送和接收任何数据,并且没有错误

Flink计划包括以下内容: 卡桑德拉中的公共类字数{

 private static int myport=9999;
 private static String hostname="localhost";
 //static ServerSocket variable
 private static ServerSocket server;
 private static int count_row=0;

 public static void main(String[] args) throws Exception {
 // Checking input parameters
 final ParameterTool params = ParameterTool.fromArgs(args);
 // set up the execution environment
 final StreamExecutionEnvironment env = 
 StreamExecutionEnvironment.getExecutionEnvironment();

 //create the socket server object
    server = new ServerSocket(myport);
 // make parameters available in the web interface
    env.getConfig().setGlobalJobParameters(params);

    while (true){
        System.out.println("Waiting for client request");
        //creating socket and waiting for client connection
        Socket socket = server.accept();
        DataStream<String> stream = env.socketTextStream(hostname, 
        myport);

        stream.print();

        //write object to Socket
        oos.writeObject("Hi Client " + stream.toString());
        oos.close();
        socket.close();

        // parse the data, group it, window it, and aggregate the 
        counts
    DataStream<Tuple2<String, Long>> counts = stream
                .flatMap(new FlatMapFunction<String, Tuple2<String, 
    Long>>() {
                    @Override
            public void flatMap(String value, 
     Collector<Tuple2<String, Long>> out) {
                        // normalize and split the line
           String[] words = value.toLowerCase().split("\\W+");

                        // emit the pairs
             for (String word : words) {

                if (!word.isEmpty()) {
                   out.collect(new Tuple2<String, Long>(word, 1L));
                            }
                        }
                    }
                })
                .keyBy(0)
                .timeWindow(Time.seconds(5))
                .sum(1);

        // emit result
        if (params.has("output")) {
            counts.writeAsText(params.get("output"));
        } else {
            System.out.println("Printing result to stdout. Use -- 
            output to specify output path.");

            counts.print();
        }

        //terminate the server if client sends exit request
        if (stream.equals("exit")){
            System.out.println("row_count : "+count_row);
            break;
        }

        // execute program
        env.execute("Streaming WordCount");
    }//while true
    System.out.println("Shutting down Socket server!!");
    server.close();
     }//main
   }
你能告诉我怎样才能解决我的问题吗


如果您有任何帮助,我们将不胜感激。

您尝试构建Flink应用程序的方式存在一些问题。请注意:

  • Flink DataStream API用于描述在调用env.execute()时发送到集群执行的数据流图。将其包装在
    while(true)
    循环中没有意义
  • socketTextStream
    设置客户端连接。您的服务器似乎没有执行任何有用的操作
  • stream.equals(“退出”)
    --流是一个数据流,而不是字符串。如果您想在流元素具有特定值时执行一些特殊操作,则需要使用一次事件处理的流操作之一来执行不同的操作。至于关闭Flink作业,流作业通常设计为无限期运行,或直到一个有限的输入源到达它的末端,在这一点上它们自己关闭
您可以大大简化事情。我将从头开始,首先用如下命令行替换您的客户端:

public class client_code {
private static Cluster cluster = 
  Cluster.builder().addContactPoint("127.0.0.1")
 .withPort(9042).build();
private static Session session = cluster.connect("mar1");

 public static void main(String[] args) throws UnknownHostException, 
   IOException, ClassNotFoundException, InterruptedException {
    String serverIP = "localhost";
    int port=9999;
    Socket socket = null;
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;

    ResultSet result = session.execute("select * from tlbtest15");
    for (Row row : result) {
        //establish socket connection to server
        socket = new Socket(serverIP, port);
        //write to socket using ObjectOutputStream
        oos = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Sending request to Socket Server");

        if (row==result) oos.writeObject("exit");
        else oos.writeObject(""+row+"");
        //read the server response message
        ois = new ObjectInputStream(socket.getInputStream());
        String message = (String) ois.readObject();
        System.out.println("Message: " + message);
        //close resources
        ois.close();
        oos.close();
        Thread.sleep(100);
    }

    cluster.close();
 }
}
cqlsh -e "SELECT * from tlbtest15;" | nc -lk 9999
在这种情况下,nc(netcat)将充当服务器,允许Flink作为客户端。这将使事情变得更容易,因为这就是env.sockettextream的使用方式


然后,您将能够使用普通的Flink应用程序处理结果。socketTextStream将生成一个包含查询结果的流,作为文本行,每行一行。

您尝试构建Flink应用程序的方式存在一些问题。请注意:

  • Flink DataStream API用于描述在调用env.execute()时发送到集群执行的数据流图。将其包装在
    while(true)
    循环中没有意义
  • socketTextStream
    设置客户端连接。您的服务器似乎没有执行任何有用的操作
  • stream.equals(“退出”)
    --流是一个数据流,而不是字符串。如果您想在流元素具有特定值时执行一些特殊操作,则需要使用一次事件处理的流操作之一来执行不同的操作。至于关闭Flink作业,流作业通常设计为无限期运行,或直到一个有限的输入源到达它的末端,在这一点上它们自己关闭
您可以大大简化事情。我将从头开始,首先用如下命令行替换您的客户端:

public class client_code {
private static Cluster cluster = 
  Cluster.builder().addContactPoint("127.0.0.1")
 .withPort(9042).build();
private static Session session = cluster.connect("mar1");

 public static void main(String[] args) throws UnknownHostException, 
   IOException, ClassNotFoundException, InterruptedException {
    String serverIP = "localhost";
    int port=9999;
    Socket socket = null;
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;

    ResultSet result = session.execute("select * from tlbtest15");
    for (Row row : result) {
        //establish socket connection to server
        socket = new Socket(serverIP, port);
        //write to socket using ObjectOutputStream
        oos = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Sending request to Socket Server");

        if (row==result) oos.writeObject("exit");
        else oos.writeObject(""+row+"");
        //read the server response message
        ois = new ObjectInputStream(socket.getInputStream());
        String message = (String) ois.readObject();
        System.out.println("Message: " + message);
        //close resources
        ois.close();
        oos.close();
        Thread.sleep(100);
    }

    cluster.close();
 }
}
cqlsh -e "SELECT * from tlbtest15;" | nc -lk 9999
在这种情况下,nc(netcat)将充当服务器,允许Flink作为客户端。这将使事情变得更容易,因为这就是env.sockettextream的使用方式


然后,您将能够使用普通的Flink应用程序处理结果。socketTextStream将生成一个包含查询结果的流,作为文本行,每行一行。

请更清楚地描述您试图完成的任务。您是在读卡桑德拉还是在写卡桑德拉?这真的是一个发出一个qu的批处理作业吗请回复Cassandra并处理结果?您尝试如何设置此项存在问题,但我们无法建议更好的方法,而不需要首先了解您希望此项功能做什么。感谢您的评论,我编辑了我的帖子。我在客户端程序中未使用任何Flink命令;因此,我认为判断我的客户端程序是错误的批处理作业或流式作业。请更清楚地描述您试图完成的任务。您是从Cassandra处阅读还是写信给Cassandra?这真的是一个向Cassandra发出一个查询并处理结果的批处理作业吗?您试图如何设置此任务存在问题,但我们无法建议更好的方法,而不需要事先了解你希望它做什么。谢谢你的评论,我编辑了我的帖子。我在我的客户端程序中没有使用任何Flink命令;所以我认为说我的客户端程序是批处理作业或流式作业是不对的。谢谢你的帮助。我有一个Cassandra集群,我想运行“cqlsh-e”SELECT*from keyspace.tlbtest15;“| nc-lk 9999”在我的电脑上。事实上,“tlbtest15”在另一台计算机上;是否可以在cqlsh命令中设置主机名?是的。阅读文档:很抱歉打扰您,如果我有Oracle数据库或CSV文件而不是Cassandra,我如何在Flink程序可以从套接字读取的特殊端口上从它们发送数据?非常感谢您的关注。Flink可以直接从文件读取。在这种情况下不需要套接字,但当然你也可以使用“cat foo.csv | nc-lk 9999”。亲爱的@David Anderson,我对cqlsh命令有一个问题。当我从tlbtest15运行“cqlsh-e”SELECT*时;“| nc-lk 9999”,它只显示一页,而Flink只能接收一页。(当我在cqlsh shell上运行它时,我必须按“回车”键)请告诉我是否有任何解决方案可以让“cql查询”自动转到其他页面?我阅读了Cassandra文档,bu