자바 코드 를 사용 하여 Spark 의 hive sql 작업 을 제출 합 니 다. run as 자바 application

나의 환경: hadop 2.7.1, spark 1.6.0, hive 2.0, 자바 1.7
  • 목표: 자바 - jar xxx. jar 방식 으로 spark 제출 애플 리 케 이 션 을 실행 하고 hiv sql 조 회 를 실행 합 니 다.
  • 문제 1: 우선 자바 - jar 에 따라 실행 하면 자바. lang. OutOfmory Error: PermGen space 오류 가 발생 하기 때문에 다음 매개 변 수 를 사용 하여 시작 해 야 합 니 다
  • java -Xms1024m -Xmx1024m -XX:MaxNewSize=256m  -XX:MaxPermSize=256m -jar spark.jar
  • 문제 2: datanucleus 의 jar 가방 세 개 를 추가 하지 않 으 면 다음 과 같은 오 류 를 보고 합 니 다.http://zengzhaozheng.blog.51cto.com/8219051/1597902?utm_source=tuicool&utm_medium=referral 
  • javax.jdo.JDOFatalUserException: Class org.datanucleus.api.jdo.JDOPersistenceManagerFactory was not found.
            at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1175)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701)
            at org.apache.hadoop.hive.metastore.ObjectStore.getPMF(ObjectStore.java:365)
            at org.apache.hadoop.hive.metastore.ObjectStore.getPersistenceManager(ObjectStore.java:394)
            。。。
    NestedThrowablesStackTrace:
    java.lang.ClassNotFoundException: org.datanucleus.api.jdo.JDOPersistenceManagerFactory
            at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:274)
            at javax.jdo.JDOHelper$18.run(JDOHelper.java:2018)
            at javax.jdo.JDOHelper$18.run(JDOHelper.java:2016)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.jdo.JDOHelper.forName(JDOHelper.java:2015)
            at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1162)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:808)
            at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:701)
            at org.apache.hadoop.hive.metastore.ObjectStore.getPMF(ObjectStore.java:365)
            at org.apache.hadoop.hive.metastore.ObjectStore.getPersistenceManager(ObjectStore.java:394)
            at org.apache.hadoop.hive.metastore.ObjectStore.initialize(ObjectStore.java:291)
            at org.apache.hadoop.hive.metastore.ObjectStore.setConf(ObjectStore.java:258)
            at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:73)
            at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
            at org.apache.hadoop.hive.metastore.RawStoreProxy.<init>(RawStoreProxy.java:57)
            at org.apache.hadoop.hive.metastore.RawStoreProxy.getProxy(RawStoreProxy.java:66)
            at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.newRawStore(HiveMetaStore.java:593)
            at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:571)
            at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:620)
            at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:461)
           。。。
  • 문제 3: 자바 코드 에서 SparkConf 가 설정 한 master, 즉 선택 한 spark 모드 입 니 다.저 는 Yrn - client 모드 를 사용 합 니 다. Yrn - cluster 를 쓰 면 틀 릴 수 있 습 니 다.http://stackoverflow.com/questions/31327275/pyspark-on-yarn-cluster-mode, 그 홈 페이지 내용 의 요약 부분:
  • 1.     spark        web app ,     yarn-client
    2.       spark         yarn-cluster        ,       python       spark-submit   yarn-cluster  。
  • 문제 4: 세 개의 프로필 을 추가 해 야 합 니 다: core - site. xml, hdfs - site. xml, hive - site. xml.그렇지 않 으 면 자바 - jar 명령 을 시작 하면 바로 오류 가 발생 합 니 다.

  • 따라서 정확 한 자바 호출 spark 실행 hive sql 코드 는 다음 과 같 습 니 다.
    자바 프로젝트 를 만 들 고 spark - assembly - 1.6.0 - hadop 2.6.0. jar 패 키 지 를 도입 합 니 다.이 가방 은 spark 설치 디 렉 터 리 의 lib 디 렉 터 리 아래 178 M 이 있 습 니 다. 정말 큽 니 다.
    자바 호출 코드 는 다음 과 같 습 니 다. 제 코드 는 나중에 spark. jar 로 포장 되 고 디 렉 터 리 는/data/houxm/spark/spark. jar 입 니 다.
    package cn.centaur.test.spark;
    
    import org.apache.spark.SparkConf;
    import org.apache.spark.api.java.JavaSparkContext;
    import org.apache.spark.sql.hive.HiveContext;
     
    public class SimpleDemo {
        public static void main(String[] args) {
        	String[] jars = new String[]{"/data/houxm/spark/spark.jar"};
            SparkConf conf = new SparkConf().setAppName("simpledemo").setMaster("yarn-client").set("executor-memory", "2g").setJars(jars).set("driver-class-path", "/data/spark/lib/mysql-connector-java-5.1.21.jar");
            JavaSparkContext sc = new JavaSparkContext(conf);
            HiveContext hiveCtx = new HiveContext(sc);
            testHive(hiveCtx);
            sc.stop();
            sc.close();
        }
     
        //  spark sql  hive    
        public static void testHive(HiveContext hiveCtx) {
            hiveCtx.sql("create table temp_spark_java as select mobile,num from default.mobile_id_num02 limit 10");
        }
    }

    자바 프로젝트 의 루트 디 렉 터 리 에 MANIFEST. MF 파일 을 새로 만 듭 니 다. 코드 는 다음 과 같 습 니 다.
    Manifest-Version: 1.0
    Class-Path: /data/spark/lib/spark-assembly-1.6.0-hadoop2.6.0.jar
       /data/spark/lib/mysql-connector-java-5.1.21.jar
       /data/spark/lib/datanucleus-api-jdo-3.2.6.jar
       /data/spark/lib/datanucleus-core-3.2.10.jar
       /data/spark/lib/datanucleus-rdbms-3.2.9.jar
    Main-Class: cn.centaur.test.spark.SimpleDemo

    resources 디 렉 터 리 (저 는 maven 프로젝트 입 니 다. 일반 자바 프로젝트 는 src 에 파일 을 추가 하면 됩 니 다) 에 core - site. xml, hdfs - site. xml, hive - site. xml 세 개의 프로필 을 추가 합 니 다.
    eclipse 를 사용 하여 이 manifest 파일 에 따라 자바 코드 를 포장 합 니 다.jar 파일 을 생 성하 여 서버 에 업로드 하면 실행 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기