복붙노트

[HADOOP] 임베디드 모드에서 스파크 - 사용자 / 하이브 /웨어 하우스를 찾을 수 없음

HADOOP

임베디드 모드에서 스파크 - 사용자 / 하이브 /웨어 하우스를 찾을 수 없음

임베디드 로컬 모드에서 아파치 스파크를 사용하고 있습니다. 필자는 pom.xml과 동일한 버전 (spark-core_2.10, spark-sql_2.10 및 spark-hive_2.10)에 모든 종속성을 포함시킵니다.

HiveQL 쿼리를 실행하여 (Parquet로 저장된) 테이블을 만들고 싶습니다.

다음과 같은 코드를 실행합니다.

public class App {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        SparkConf sparkConf = new SparkConf().setAppName("JavaSparkSQL").setMaster("local[2]").set("spark.executor.memory", "1g");
        JavaSparkContext ctx = new JavaSparkContext(sparkConf);
        HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());

        String createQuery = "CREATE TABLE IF NOT EXISTS Test (id int, name string) STORED AS PARQUET";
        sqlContext.sql(createQuery);
    }
}

... 다음 예외가 반환됩니다.

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:file:/user/hive/warehouse/test is not a directory or unable to create one)

metastore_db 폴더가 프로젝트 루트에 생성 된 것을 볼 수 있습니다.

필자는 검색 한 솔루션이 도움이되지 못했습니다. 대부분 임베디드 모드가 아니 었습니다.

지금 아이디어가 부족합니다. 누군가 다른 제안을 할 수 있습니까?

해결법

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

    1.로컬 임베디드 모드로 실행 중이므로 HDFS를 고려하지 않습니다. 이것이 hdfs : // localhost : 9000 / user / hive / warehouse / test가 아닌 file : / user / hive / warehouse / test입니다. / user / hive / warehouse / test가 로컬 시스템에 존재할 것으로 기대합니다. 로컬로 생성 해보십시오.

    로컬 임베디드 모드로 실행 중이므로 HDFS를 고려하지 않습니다. 이것이 hdfs : // localhost : 9000 / user / hive / warehouse / test가 아닌 file : / user / hive / warehouse / test입니다. / user / hive / warehouse / test가 로컬 시스템에 존재할 것으로 기대합니다. 로컬로 생성 해보십시오.

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

    2.단지 이것이 다른 누구에게도 도움이된다면 HiveContext를 사용하는 Spark 코드에 대한 단위 테스트를 작성하려고합니다. 나는 파일들이 테스트를 위해 작성된 경로를 변경하기 위해 hiveContext.setConf를 호출해야한다는 것을 발견했다. 또한 OP와 동일한 접근 방식을 시도하여 SET 쿼리를 수행했지만 작동하지 않았습니다. 다음은 작동하는 것 같습니다!

    단지 이것이 다른 누구에게도 도움이된다면 HiveContext를 사용하는 Spark 코드에 대한 단위 테스트를 작성하려고합니다. 나는 파일들이 테스트를 위해 작성된 경로를 변경하기 위해 hiveContext.setConf를 호출해야한다는 것을 발견했다. 또한 OP와 동일한 접근 방식을 시도하여 SET 쿼리를 수행했지만 작동하지 않았습니다. 다음은 작동하는 것 같습니다!

    hive.setConf("hive.metastore.warehouse.dir", 
      "file:///custom/path/to/hive/warehouse")
    

    그리고이 코드를 좀 더 유용하게 만들기 위해 필자는이 경로를 내 코드가 액세스 할 수있는 위치로 설정했습니다.

    hive.setConf("hive.metastore.warehouse.dir", 
      getClass.getResource(".").toString)
    

    이를 통해 하이브 쿼리와 Spark API를 사용하여 코드에 대한 단위 테스트를 작성할 수있었습니다.

  3. from https://stackoverflow.com/questions/31985728/spark-on-embedded-mode-user-hive-warehouse-not-found by cc-by-sa and MIT license