Nice programing

통합 테스트 Hive 작업

nicepro 2020. 10. 30. 21:02
반응형

통합 테스트 Hive 작업


Hive Thrift 및 JDBC 인터페이스를 사용하여 사소하지 않은 Hive 작업을 작성하려고하는데 적절한 JUnit 테스트를 설정하는 데 문제가 있습니다. 사소하지 않다는 것은 메타 스토어 만 처리하는 것이 아니라 작업이 적어도 하나의 MapReduce 단계를 생성한다는 것을 의미합니다.

테스트는 Hive 서버를 실행하고 일부 데이터를 테이블에로드하고 해당 테이블에 대해 사소하지 않은 쿼리를 실행하고 결과를 확인해야합니다.

Spring reference 에 따라 Spring 컨텍스트를 연결했습니다 . 그러나 작업이 MapReduce 단계에서 실패하고 Hadoop 바이너리가 존재하지 않는다고 불평합니다.

java.io.IOException : "/ usr / bin / hadoop"프로그램을 실행할 수 없습니다 ( "/ Users / yoni / opower / workspace / intellij_project_root"디렉토리) : error = 2, 해당 파일 또는 디렉토리가 없습니다.

문제는 Hive 서버가 메모리 내에서 실행되지만 실행하려면 Hive의 로컬 설치에 의존한다는 것입니다. 내 프로젝트가 자체 포함 되려면 HDFS 및 MapReduce 클러스터를 포함하여 Hive 서비스가 포함되어야합니다. 동일한 Spring 메서드를 사용하여 Hive 서버를 시작 하고 Hive QTestUtil 소스 및 HBaseTestUtility 에서 사용 된 패턴과 유사한 MiniDFSClusterMiniMRCluster가리켜 보았습니다 . 그러나 나는 그것을 작동시킬 수 없었다.

3 일 동안 Hive 통합 테스트를 시도한 후 커뮤니티에 다음과 같이 질문 할 것이라고 생각했습니다.

  1. 통합 테스트 Hive 작업을 어떻게 권장합니까?
  2. 인 메모리 HDFS, MR 및 Hive 인스턴스를 사용하여 Hive 작업을 테스트하는 통합 JUnit 예제가 있습니까?

내가 살펴본 추가 리소스 :

편집 : 로컬이든 원격이든 Hadoop 클러스터에 대해 작업하면 전체 스택 Hive 인스턴스에 대해 통합 테스트를 실행할 수 있다는 것을 잘 알고 있습니다. 언급했듯이 문제는 이것이 Hive 워크 플로를 효과적으로 테스트하기위한 실행 가능한 솔루션이 아니라는 것입니다.


이상적으로는 LocalJobRunner미니 클러스터 테스트에 의존하지 않고 하이브 쿼리를 테스트 할 수 있습니다 . 그러나 때문 HIVE-3816 와 하이브 실행 mapred.job.tracker=local(귀하의 질문에 설명 된대로) 시스템에 설치된 하이브 CLI 실행에 대한 호출 결과.

HIVE-3816이 해결 될 때까지 미니 클러스터 테스트가 유일한 옵션입니다. 아래는 CDH 4.4에 대해 테스트 한 하이브 테스트를위한 최소 미니 클러스터 설정입니다.

Configuration conf = new Configuration();

/* Build MiniDFSCluster */
MiniDFSCluster miniDFS = new MiniDFSCluster.Builder(conf).build();

/* Build MiniMR Cluster */
System.setProperty("hadoop.log.dir", "/path/to/hadoop/log/dir"); // MAPREDUCE-2785
int numTaskTrackers = 1;
int numTaskTrackerDirectories = 1;
String[] racks = null;
String[] hosts = null;
miniMR = new MiniMRCluster(numTaskTrackers, miniDFS.getFileSystem().getUri().toString(),
                           numTaskTrackerDirectories, racks, hosts, new JobConf(conf));

/* Set JobTracker URI */
System.setProperty("mapred.job.tracker", miniMR.createJobConf(new JobConf(conf)).get("mapred.job.tracker"));

테스트를 위해 별도의 hiveserver 또는 hiveserver2 프로세스를 실행할 필요가 없습니다. jdbc 연결 URL을 다음으로 설정하여 임베디드 hiveserver2 프로세스로 테스트 할 수 있습니다.jdbc:hive2:///


꽤 좋은 도구 인 HiveRunner를 찾았습니다 . 하이브 스크립트를 테스트하는 것은 jUnit 위에있는 프레임 워크입니다. 내부적으로는 메모리 HSQL을 메타 스토어로 사용하여 독립형 HiveServer를 시작합니다.


Hive는 Hive 테이블에 대한 메타 정보를 저장하는 RDBMS가 로컬 또는 독립형 서버에서 실행될 수 있다는 점에서만 임베디드 모드를 지원합니다 (자세한 내용은 https://cwiki.apache.org/confluence/display/Hive/HiveClient 참조). ). 또한 함께 제공되는 데이터베이스가있는 하이브는 MapReduce 작업 문자열에 대한 오케 스트레이터 일 뿐이며, Hadoop 프레임 워크도 실행해야합니다.

사전 구성된 Hadoop 스택 http://hortonworks.com/products/hortonworks-sandbox/ 가있는이 가상 머신을 사용하는 것이 좋습니다 . Hortonworks는 2 개의 주요 Hadoop 배포 제공 업체 중 하나이므로 잘 지원됩니다.


2014 년 2 월 수락 된 답변 이후 변경된 사항이 확실하지 않지만 Hive 1.2.0부터 OP에 설명 된 문제에 대해 다음 작업이 수행됩니다.

System.setProperty(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD.varname, "false");

구성 문서에 제공된 경고에 유의하십시오.

로컬 작업 (일반적으로 mapjoin 해시 테이블 생성 단계)이 별도의 JVM (참 권장)에서 실행되는지 여부를 결정합니다. 새 JVM 생성 오버 헤드를 피하지만 메모리 부족 문제가 발생할 수 있습니다.

다음과 같은 이유로 문제를 해결할 수 있습니다 MapredLocalTask.java.

  @Override
  public int execute(DriverContext driverContext) {
    if (conf.getBoolVar(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD)) {
      // send task off to another jvm
      return executeInChildVM(driverContext);
    } else {
      // execute in process
      return executeInProcess(driverContext);
    }
  }

기본 구성 값으로 인해 executeInChildVM()메서드가 호출되며 문자 그대로 hadoop jar. 다른 코드 경로는 지금까지 내 테스트에서 해결되었습니다. 잠재적 인 메모리 문제는 Java 힙 구성 (Xmx, Xms 등)을 조정하여 해결할 수 있습니다.


HiveRunner를 구현했습니다.

https://github.com/klarna/HiveRunner

우리는 Mac에서 테스트했으며 Windows에서 약간의 문제가 있었지만 유틸리티 아래에 나열된 몇 가지 변경 사항이 잘 작동했습니다.

For windows here are some of the changes that were done in order to have HiveRunner work in windows environment. After these changes unit testing is possible for all Hive queries.

1.Clone the project at https://github.com/steveloughran/winutils to anywhere on your computer, Add a new environment variable, HADOOP_HOME, pointing to the /bin directory of that folder. no forward slashes or spaces allowed. 2.Clone the project at https://github.com/sakserv/hadoop-mini-clusters to anywhere on your computer. Add a new environment variable HADOOP_WINDOWS_LIBS, pointing to the /lib directory of that folder. Again, no forward slashes or spaces allowed. 3.I also installed cygwin, assuming severla win utils for linux might be available through.

gitbub에 대한이 풀은 https://github.com/klarna/HiveRunner/pull/63 에서 Windows에서 작동하도록 도왔습니다.


또 다른 Hive JUnit 러너는 https://github.com/edwardcapriolo/hive_test에 있습니다.

참고 URL : https://stackoverflow.com/questions/16719541/integration-testing-hive-jobs

반응형