복붙노트

[HADOOP] Java를 통한 Apache 드릴 연결

HADOOP

Java를 통한 Apache 드릴 연결

Apache Drill의 Wiki에서 SqlLine 클라이언트를 통해 실행되는 쿼리 만 볼 수있었습니다. REST API 이외의 드릴에서 쿼리를 실행하기위한 프로그래밍 방식의 방법이 있습니까? 어떤 샘플이나 포인터?

또는 SQL 쿼리를 실행하기 위해 JDBC 드라이버를 사용하는 것과 동일합니까?

해결법

  1. ==============================

    1.Drill JDBC 드라이버는 http://drill.apache.org/docs/using-the-jdbc-driver/에 문서화되어 있습니다.

    Drill JDBC 드라이버는 http://drill.apache.org/docs/using-the-jdbc-driver/에 문서화되어 있습니다.

    Maven을 사용하여 Java 프로그램을 빌드하는 경우 로컬에서 드릴 종속성을 설치해야합니다.

    mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-java-exec-1.0.0-rebuffed.jar -DgroupId=org.apache.drill.exec -DartifactId=drill-java-exec -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=/opt/apache-drill-1.0.0/jars/drill-common-1.0.0-rebuffed.jar -DgroupId=org.apache.drill -DartifactId=drill-common -Dversion=1.0.0 -Dpackaging=jar -DgeneratePom=true
    

    여기에 예제가 있습니다. https://github.com/vicenteg/DrillJDBCExample

  2. ==============================

    2.JDBC Part의 경우 Java 코드에서 이와 비슷한 것을 사용합니다.

    JDBC Part의 경우 Java 코드에서 이와 비슷한 것을 사용합니다.

    -------------
    Dependency
    -------------
        <dependency>
          <groupId>org.apache.drill.exec</groupId>
          <artifactId>drill-jdbc</artifactId>
          <version>1.1.0</version>
        </dependency>
    
    ----------
    Testcase
    ----------
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Properties;
    
    import org.apache.drill.exec.ExecConstants;
    import org.apache.drill.jdbc.Driver;
    
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    public class TestDrillJdbcDriver {
    
      /* Drill JDBC Uri for local/cluster zookeeper */
      public static final String DRILL_JDBC_LOCAL_URI = "jdbc:drill:zk=local";
    
      /* Sample query used by Drill */
      public static final String DRILL_SAMPLE_QUERY = "SELECT * FROM cp.`employee.json` LIMIT 20";
    
    
      @Test
      public void testDrillJdbcDriver() throws Exception {
        Connection con = null;
    
        try {
          con = new Driver().connect(DRILL_JDBC_LOCAL_URI, getDefaultProperties());
          Statement stmt = con.createStatement();
          ResultSet rs = stmt.executeQuery(DRILL_SAMPLE_QUERY);
    
          int count = 0;
          while (rs.next()) {
            System.out.println(rs.getString(1));
            System.out.println(rs.getString(2));
            System.out.println(rs.getString(3));
            count++;
          }
          Assert.assertEquals(count, 20, "Twenty rows were expected.");
        } catch (Exception ex) {
          System.out.println(ex);
        } finally {
          if (con != null) {
            con.close();
          }
        }
      }
    
      public static Properties getDefaultProperties() {
        final Properties properties = new Properties();
        properties.setProperty(ExecConstants.HTTP_ENABLE, "false");
        return properties;
      }
    }
    
  3. ==============================

    3.당신이 사용할 수있는 sqlline 이외

    당신이 사용할 수있는 sqlline 이외

  4. ==============================

    4.

    Other way to execute query by Calling REST API in Apache Drill
    

    public class RequestQuery {

    private String queryType;
    private String query;
    
    public String getQueryType() {
        return queryType;
    }
    public void setQueryType(String queryType) {
        this.queryType = queryType;
    }
    public String getQuery() {
        return query;
    }
    public void setQuery(String query) {
        this.query = query;
    }
    

    }

    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.Entity;
    import javax.ws.rs.client.WebTarget;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.ramyam.eis.apache.drill.api.model.RequestQuery;
    
    public class RestAPI {
    
        private static Log logger = LogFactory.getLog(RestAPI.class);
        public static void main(String[] args) {
            getQueryResponce();
        }
    
        private static void getQueryResponce(){
            Client client = null;
            WebTarget target = null;
            try {
                logger.info("---------Started execution-----------");
                RequestQuery query = new RequestQuery();
                query.setQueryType("SQL");
                //MySQL
                //query.setQuery("SELECT * FROM MYSQL.foodmart.collections");
                //query.setQuery("SELECT * FROM MYSQL.foodmart.collections limit 100");
                //query.setQuery("SELECT payment_due_from,NumItems FROM MYSQL.foodmart.collections limit 10");
                //query.setQuery("SELECT count(SPORTS_PREFERENCE) FROM MYSQL.foodmart.collections group by SPORTS_PREFERENCE");
                //query.setQuery("SELECT DISTINCT payment_due_from FROM MYSQL.foodmart.collections ");
    
                //Mongo DB
                //query.setQuery("select * from mongo.apache_drill.pt_BMS_preferences_data where SPORTS_PREFERENCE = 'Cricket' limit 10");
                //query.setQuery("SELECT COUNT(SPORTS_PREFERENCE) FROM mongo.apache_drill.pt_BMS_preferences_data GROUP BY SPORTS_PREFERENCE");
                query.setQuery("SELECT DISTINCT(SPORTS_PREFERENCE) FROM mongo.apache_drill.pt_BMS_preferences_data ");
                client = ClientBuilder.newClient();
                target = client.target("http://localhost:8047/query.json");
                //target = target.path(path);
                Response response = target.request().accept(MediaType.APPLICATION_JSON)
                        .post(Entity.json(query), Response.class);
                if (response.getStatus() != 200) {
                    throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
                }
                String string = response.readEntity(String.class);
                logger.info(query.getQueryType()+"->"+query.getQuery());
                logger.info("Responce:\n"+string);
                logger.info("---------End execution-----------");
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(e.getMessage(),e);
            }
        }
    
  5. from https://stackoverflow.com/questions/29443706/apache-drill-connection-through-java by cc-by-sa and MIT license