복붙노트

[HADOOP] SparkSQL에서 Hive 메타 스토어에 프로그래밍 방식으로 연결하는 방법

HADOOP

SparkSQL에서 Hive 메타 스토어에 프로그래밍 방식으로 연결하는 방법

SparkSQL과 함께 HiveContext를 사용하고 있으며 원격 Hive 메타 스토어에 연결하려고합니다. 하이브 메타 스토어를 설정하는 유일한 방법은 classpath에 hive-site.xml을 포함시키는 것입니다 (또는 / etc / spark / conf /).

hive-site.xml을 포함하지 않고 java 코드에서이 매개 변수를 프로그래밍 방식으로 설정하는 방법이 있습니까? 그렇다면 스파크 설정은 무엇을 사용합니까?

해결법

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

    1.Spark 1.x의 경우 다음과 같이 설정할 수 있습니다.

    Spark 1.x의 경우 다음과 같이 설정할 수 있습니다.

    System.setProperty("hive.metastore.uris", "thrift://METASTORE:9083");
    
    final SparkConf conf = new SparkConf();
    SparkContext sc = new SparkContext(conf);
    HiveContext hiveContext = new HiveContext(sc);
    

    또는

    final SparkConf conf = new SparkConf();
    SparkContext sc = new SparkContext(conf);
    HiveContext hiveContext = new HiveContext(sc);
    hiveContext.setConf("hive.metastore.uris", "thrift://METASTORE:9083");
    

    업데이트 하이브가 Kerberos를 사용하는 경우 :

    HiveContext를 만들기 전에 다음과 같이 설정해보십시오.

    System.setProperty("hive.metastore.sasl.enabled", "true");
    System.setProperty("hive.security.authorization.enabled", "false");
    System.setProperty("hive.metastore.kerberos.principal", hivePrincipal);
    System.setProperty("hive.metastore.execute.setugi", "true");
    
  2. ==============================

    2.스파크 2.0에서는 다음과 같이 보일 것입니다 :

    스파크 2.0에서는 다음과 같이 보일 것입니다 :

     val spark = SparkSession
              .builder()
              .appName("interfacing spark sql to hive metastore without configuration file")
              .config("hive.metastore.uris", "thrift://localhost:9083") // replace with your hivemetastore service's thrift url
              .enableHiveSupport() // don't forget to enable hive support
              .getOrCreate()
    
            import spark.implicits._
            import spark.sql
            // create an arbitrary frame
            val frame = Seq(("one", 1), ("two", 2), ("three", 3)).toDF("word", "count")
            // see the frame created
            frame.show()
            /**
             * +-----+-----+
             * | word|count|
             * +-----+-----+
             * |  one|    1|
             * |  two|    2|
             * |three|    3|
             * +-----+-----+
             */
            // write the frame
            frame.write.mode("overwrite").saveAsTable("t4")
    
  3. ==============================

    3.나도 똑같은 문제에 직면했지만 해결했다. Spark 2.0 버전에서이 단계를 따르십시오.

    나도 똑같은 문제에 직면했지만 해결했다. Spark 2.0 버전에서이 단계를 따르십시오.

    1 단계 : Hive conf 폴더의 hive-site.xml 파일을 conf 파일로 복사합니다.

    2 단계 : spark-env.sh 파일을 편집하고 mysql 드라이버를 구성하십시오. (Mysql을 하이브 메타 스토어로 사용하는 경우)

    또는 Maven / SBT에 MySQL 드라이버를 추가하십시오 (사용하는 경우)

    Step 3 : spark session을 생성 할 때 enableHiveSupport ()를 추가하십시오.

    샘플 코드 :

    package sparkSQL
    
    /**
      * Created by venuk on 7/12/16.
      */
    
    import org.apache.spark.sql.SparkSession
    
    object hivetable {
      def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder.master("local[*]").appName("hivetable").enableHiveSupport().getOrCreate()
    
        spark.sql("create table hivetab (name string, age int, location string) row format delimited fields terminated by ',' stored as textfile")
        spark.sql("load data local inpath '/home/hadoop/Desktop/asl' into table hivetab").show()
        val x = spark.sql("select * from hivetab")
        x.write.saveAsTable("hivetab")
      }
    }
    

    산출:

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

    4.아래 코드는 나를 위해 일했습니다. 로컬 metastore에 대한 hive.metastore.uris의 설정을 무시할 수 있습니다. spark는 예비웨어 하우스 디렉토리에 하이브 오브젝트를 로컬로 생성합니다.

    아래 코드는 나를 위해 일했습니다. 로컬 metastore에 대한 hive.metastore.uris의 설정을 무시할 수 있습니다. spark는 예비웨어 하우스 디렉토리에 하이브 오브젝트를 로컬로 생성합니다.

    import org.apache.spark.sql.SparkSession;
    
    object spark_hive_support1 
    {
      def main (args: Array[String]) 
       {
        val spark = SparkSession
          .builder()
          .master("yarn")
          .appName("Test Hive Support")
          //.config("hive.metastore.uris", "jdbc:mysql://localhost/metastore")
          .enableHiveSupport
          .getOrCreate();
    
        import spark.implicits._
    
        val testdf = Seq(("Word1", 1), ("Word4", 4), ("Word8", 8)).toDF;
        testdf.show;
        testdf.write.mode("overwrite").saveAsTable("WordCount");
      }
    }
    
  5. ==============================

    5.스파크 버전 : 2.0.2

    스파크 버전 : 2.0.2

    하이브 버전 : 1.2.1

    Java 코드 아래에서 Spark의 하이브 메타 스토어에 연결하려면 다음 작업을 수행하십시오.

    import org.apache.spark.sql.SparkSession;
    
    public class SparkHiveTest {
    
        public static void main(String[] args) {
    
            SparkSession spark = SparkSession
                      .builder()
                      .appName("Java Spark Hive Example")
                      .config("spark.master", "local")
                      .config("hive.metastore.uris",                
                       "thrift://maxiqtesting123.com:9083")
                      .config("spark.sql.warehouse.dir", "/apps/hive/warehouse")
                      .enableHiveSupport()
                      .getOrCreate();
    
            spark.sql("SELECT * FROM default.survey_data limit 5").show();
        }
    }
    
  6. from https://stackoverflow.com/questions/31980584/how-to-connect-to-a-hive-metastore-programmatically-in-sparksql by cc-by-sa and MIT license