Запрос друида из Java-приложения

Я новичок в друид. Я хочу запросить удаленный кластер друидов из моего Java-приложения. Я прочитал в группе google druid-user, что мы можем использовать io.druid.client.DirectDruidClient . Может кто-нибудь помочь мне или указать ресурс с примером для того же?

2 ответа

Ну, если вы все еще используете Друид

Проверьте Друидры.

Вот простое Java-приложение Spring Boot, которое запрашивает данные Druid с помощью драйвера Avatica JDBC и печатает первую строку из запроса.

Предполагая, что Druid работает локально и у вас уже есть данные в таблице с именем "druid_table", которая имеет столбец sourceIP

FlinkDruidApplication.java

@SpringBootApplication
public class FlinkDruidApplication {

    public static void main(String[] args) {
        SpringApplication.run(FlinkDruidApplication.class, args);
        Logger log = LoggerFactory.getLogger("FlinkDruidApplication");
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Row> dbData =
                env.createInput(
                        JDBCInputFormat
                                .buildJDBCInputFormat()
                                .setDrivername("org.apache.calcite.avatica.remote.Driver")
                                .setDBUrl("jdbc:avatica:remote:url=http://localhost:8082/druid/v2/sql/avatica/")
                                .setUsername("null")
                                .setPassword("null")
                                .setQuery(
                                        "SELECT sourceIP FROM druid_table"
                                )
                                .setRowTypeInfo((RowTypeInfo) Types.ROW(Types.STRING))
                                .finish()
                );

        try {

            log.info("Printing first IP :: {} " + dbData.collect().iterator().next());
        } catch (Exception e) {
            log.error(e.getMessage());
        }


    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.shashank</groupId>
    <artifactId>FlinkDruid</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>FlinkDruid</name>
    <description>Flink Druid Connection</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-core -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-core</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-streaming-java -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.9.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-java -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-clients -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-jdbc -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-jdbc_2.12</artifactId>
            <version>1.8.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.calcite.avatica/avatica-core -->
        <dependency>
            <groupId>org.apache.calcite.avatica</groupId>
            <artifactId>avatica-core</artifactId>
            <version>1.15.0</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Родной способ запроса в Druid - через JSON через HTTP. У них есть Java-клиент по адресу https://github.com/implydata/druid-client но, похоже, он не находится в активной разработке. (Последний коммит на момент написания этой статьи был 2 года назад.) Так что он может не поддерживать все функции нативного языка запросов JSON.

Если вы пытаетесь запросить Druid из приложения Java, лучшим подходом будет создание запроса JSON в Java, а затем отправка запроса по HTTP.

Еще один пример настройки и тестирования.

Проверка соединения DRUID-JDBC с использованием простой программы на Java:

JdbcTest.java

import java.sql.*;
import java.util.Properties;

public class jdbcTest{    

public static void main(String args[]) {        

// Connect to /druid/v2/sql/avatica/ on your Broker.        

String url = "jdbc:avatica:remote:url=http://ec2-15-206-160-168.ap-south-1.compute.amazonaws.com:8082/druid/v2/sql/avatica/";        

Properties connectionProperties = new Properties();                
connectionProperties.setProperty("user", "vaibhav");                
connectionProperties.setProperty("password", "Qwe@2019");        
try (Connection connection = 
DriverManager.getConnection(url,connectionProperties)) {            
  try (                    
      final Statement statement = connection.createStatement();                    
      final ResultSet rs = statement.executeQuery("select count(*) from wikipedia");            
  )            
  {                

    while (rs.next()) {                    
      // Do something                    
      System.out.println("The Count Result is=" + rs.getString(1));                
    }
  }        
}      

catch (Exception e)        
  {            
    System.out.println(e.toString());        
  }    

 }

}

Как пользоваться этой программой:

1) Создайте файл java с именем jdbcTest.java с указанным выше содержимым, заменив необходимые данные [HostName:PortNo,User,Password,DataSource Name].

2) Для компиляции:javac JdbcTest.java
Например. $ javac JdbcTest.java

  1. Загрузите драйвер Avatica JDBC

Драйвер можно загрузить из следующего репозитория Imply:  https://static.imply.io/support/avatica-1.12.0.jar.%C2%A0.

Скопируйте jar avatica jar на свою машину.

4) Выполнить: java -cp .:/ Avatica-1.12.0.jar JdbcTest

Например: $ java-cp.:/Users/vaibhav/Downloads/avatica-1.12.0.jar JdbcTest SLF4J: не удалось загрузить класс org.slf4j.impl.StaticLoggerBinder. SLF4J: По умолчанию реализация регистратора без операции (NOP) SLF4J: Дополнительные сведения см. На http://www.slf4j.org/codes.html#StaticLoggerBinder. Результат подсчета =24433

Ожидаемый результат: Успешное полное выполнение должно возвращать счетчик (*) для источника данных [в данном случае моим источником данных является Википедия], как показано ниже: Результат счета =

public static void Connect() {

        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        DataSet<Row> dbData =
                env.createInput(
                        JDBCInputFormat
                                .buildJDBCInputFormat()
                                .setDrivername("org.apache.calcite.avatica.remote.Driver")
                                .setDBUrl("jdbc:avatica:remote:url=http://hostname:8082/druid/v2/sql/avatica/")
                                .setUsername("null")
                                .setPassword("null")
                                .setQuery(
                                        "SELECT __time,account,empname FROM temp where  name ='abc'"
                                )
                                .setRowTypeInfo((RowTypeInfo) Types.ROW(Types.SQL_TIMESTAMP,Types.STRING, Types.STRING))
                                .finish()
                );

        try {
            ArrayList<Row> list = (ArrayList<Row>) dbData.collect();
            System.out.println("List Size: "+list.size());
            for(Row row : list) {
                java.sql.Timestamp time = (java.sql.Timestamp) row.getField(0);
                System.out.print("Time  :" + time);
                String account = (String) row.getField(1);
                System.out.print(" Account :" + account);
                String awsregion = (String) row.getField(2);
                System.out.println(" empname :" + empname);
            }

            //System.out.println("Account:" + dbData.collect().iterator().next());
        } catch (Exception e) {
            e.printStackTrace();

        }
}
Другие вопросы по тегам