kylin问题分析:org.apache.kylin.metadata.datatype.DataType.<clinit>(DataType.java:134)

博客指出kylin2.6.1使用spark引擎进行build cube任务时,自2.4.0至2.6.2版本存在异常。经源码分析,是因yarn集群服务器无kylin.properties文件但配置了KYLIN_HOME,导致文件检验失败抛异常。给出两种解决方案,一是扩大异常捕获范围,二是去掉yarn集群服务器的$KYLIN_HOME配置。

kylin2.6.1

使用spark引擎进行build cube任务的时候,出现如下异常,该异常自从kylin2.4.0版本至最新的kylin2.6.2版本依然存在。

19/05/05 17:36:42 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, spslave4.bigdata.ly, executor 1): java.lang.ExceptionInInitializerError
        at org.apache.kylin.metadata.datatype.DataType.<clinit>(DataType.java:134)
        at java.io.ObjectStreamClass.hasStaticInitializer(Native Method)
        at java.io.ObjectStreamClass.computeDefaultSUID(ObjectStreamClass.java:1787)
        at java.io.ObjectStreamClass.access$100(ObjectStreamClass.java:72)
        at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:253)
        at java.io.ObjectStreamClass$1.run(ObjectStreamClass.java:251)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.getSerialVersionUID(ObjectStreamClass.java:250)
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:611)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1630)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1781)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1714)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
        at java.util.HashSet.readObject(HashSet.java:333)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1909)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
        at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
        at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:85)
        at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
        at org.apache.spark.scheduler.Task.run(Task.scala:99)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:325)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: fail to locate kylin.properties
        at org.apache.kylin.common.KylinConfig.buildSiteOrderedProps(KylinConfig.java:378)
        at org.apache.kylin.common.KylinConfig.buildSiteProperties(KylinConfig.java:354)
        at org.apache.kylin.common.KylinConfig.getInstanceFromEnv(KylinConfig.java:134)
        at org.apache.kylin.measure.MeasureTypeFactory.init(MeasureTypeFactory.java:120)
        at org.apache.kylin.measure.MeasureTypeFactory.<clinit>(MeasureTypeFactory.java:98)
        ... 71 more

通过查看源码发现在MeasureTypeFactory这个类的init方法中有一段代码.
该代码的逻辑主要是读取配置文件中前缀为kylin.metadata.custom-measure-types.的配置项,从而获取自定义的MeasureType类型。由于在通过KylinConfig.getInstanceFromEnv来获取KylinConfig的时候报错,而try{}catch{}并没有捕获到该异常导致任务执行失败。

 try {
     Map<String, String> customMeasureTypes = KylinConfig.getInstanceFromEnv().getCubeCustomMeasureTypes();
     for (String customFactory : customMeasureTypes.values()) {
  try {
      logger.info("Checking custom measure types from kylin config: " + customFactory);
      factoryInsts.add((MeasureTypeFactory<?>) Class.forName(customFactory).newInstance());
  } catch (Exception e) {
      throw new IllegalArgumentException("Unrecognized MeasureTypeFactory classname: " + customFactory,
       e);
  }
     }
 } catch (KylinConfigCannotInitException e) {
     logger.warn("Will not add custome MeasureTypeFactory as KYLIN_CONF nor KYLIN_HOME is set");
 }

我们跟踪KylinConfig.getInstanceFromEnv()方法对应的代码,发现在执行buildSiteProperties()方法的时候报的错。

public static KylinConfig getInstanceFromEnv() {
        synchronized (KylinConfig.class) {
            KylinConfig config = THREAD_ENV_INSTANCE.get();
            if (config != null) {
                return config;
            }

            if (SYS_ENV_INSTANCE == null) {
                try {
                    //build default ordered properties will only be called once.
                    //This logic no need called by CoProcessor due to it didn't call getInstanceFromEnv.
                    buildDefaultOrderedProperties();

                    config = new KylinConfig();
                    config.reloadKylinConfig(buildSiteProperties());

                    logger.info("Initialized a new KylinConfig from getInstanceFromEnv : "
                            + System.identityHashCode(config));
                    SYS_ENV_INSTANCE = config;
                } catch (IllegalArgumentException e) {
                    throw new IllegalStateException("Failed to find KylinConfig ", e);
                }
            }
            return SYS_ENV_INSTANCE;
        }
    }

继续跟踪代码,是由于buildSiteOrderedProps()方法导致的错误。

private static Properties buildSiteProperties() {
        Properties conf = new Properties();

        OrderedProperties orderedProperties = buildSiteOrderedProps();
        for (Map.Entry<String, String> each : orderedProperties.entrySet()) {
            conf.put(each.getKey(), each.getValue().trim());
        }

        return conf;
    }

继续跟踪代码

 private static OrderedProperties buildSiteOrderedProps() {

        try {
            // 1. load default configurations from classpath.
            // we have kylin-defaults.properties in kylin/core-common/src/main/resources
            // Load them each time will caused thread block when multiple query request to Kylin
            OrderedProperties orderedProperties = new OrderedProperties();
            orderedProperties.putAll(defaultOrderedProperties);

            // 2. load site conf, to keep backward compatibility it's still named kylin.properties
            // actually it's better to be named kylin-site.properties
            File propFile = getSitePropertiesFile();
            if (propFile == null || !propFile.exists()) {
                logger.error("fail to locate " + KYLIN_CONF_PROPERTIES_FILE + " at '"
                        + (propFile != null ? propFile.getAbsolutePath() : "") + "'");
                throw new RuntimeException("fail to locate " + KYLIN_CONF_PROPERTIES_FILE);
            }
            loadPropertiesFromInputStream(new FileInputStream(propFile), orderedProperties);

            // 3. still support kylin.properties.override as secondary override
            // not suggest to use it anymore
            File propOverrideFile = new File(propFile.getParentFile(), propFile.getName() + ".override");
            if (propOverrideFile.exists()) {
                loadPropertiesFromInputStream(new FileInputStream(propOverrideFile), orderedProperties);
            }
            return orderedProperties;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

跟踪getSitePropertiesFile() 方法。

  static File getSitePropertiesFile() {
        String kylinConfHome = System.getProperty(KYLIN_CONF);
        if (!StringUtils.isEmpty(kylinConfHome)) {
            logger.info("Use KYLIN_CONF=" + kylinConfHome);
            return existFile(kylinConfHome);
        }

        logger.debug("KYLIN_CONF property was not set, will seek KYLIN_HOME env variable");

        String kylinHome = getKylinHome();
        if (StringUtils.isEmpty(kylinHome))
            throw new KylinConfigCannotInitException("Didn't find KYLIN_CONF or KYLIN_HOME, please set one of them");

        logger.info("Use KYLIN_HOME=" + kylinHome);
        String path = kylinHome + File.separator + "conf";
        return existFile(path);
    }

发现getSitePropertiesFile()其实返回的是kylin配置文件存储的路径,该路径通过KYLIN_HOME环境变量添加/conf/kylin.properties获得,或者是通过KYLIN_CONF环境变量方式获取。
由于该段代码的执行是通过spark提交到yarn集群中运行的,而yarn集群所处的服务器并不存在kylin.properties配置文件,但是配置了KYLIN_HOME的环境变量,从而导致在进行proFile.exists()检验文件是否存在的时候,返回的false。从而抛出了RuntimeException。
而MeasureTypeFactory这个类的init方法只捕获了Exception并封装成IllegalArgumentException异常抛出,因此在此处便抛出异常,导致程序运行失败。

解决方案

方案一:对于没有自定义的MeasureType类型只需要简单修改异常捕获,扩大异常范围。

 try {
     Map<String, String> customMeasureTypes = KylinConfig.getInstanceFromEnv().getCubeCustomMeasureTypes();
     for (String customFactory : customMeasureTypes.values()) {
  try {
      logger.info("Checking custom measure types from kylin config: " + customFactory);
      factoryInsts.add((MeasureTypeFactory<?>) Class.forName(customFactory).newInstance());
  } catch (Exception e) {
      throw new IllegalArgumentException("Unrecognized MeasureTypeFactory classname: " + customFactory,
       e);
  }
     }
 } catch (Exception e) {
     logger.warn("Will not add custome MeasureTypeFactory as KYLIN_CONF nor KYLIN_HOME is set");
 }

方案二:在yarn集群的服务器中去掉$KYLIN_HOME的配置,这样代码就不会去读取$KYLIN_HOME下面相关的配置参数去初始化KylinConfig这个类了。

<think> 我们正在处理一个关于Kylin的AclTableMigrationCLI运行时的错误。错误信息包括两个主要部分: 1. `Failed to find metadata store by url: kylin_metadata@hbase` 2. `java.lang.ClassNotFoundException: org.apache.hadoop.hbase.filter.Filter` 根据引用[4]中的信息,类似的问题(启动Kylin出现Could not find or load main class org.apache.hadoop.hbase.util.GetJavaProperty)的解决方法是修改HBase的配置,将HBase的依赖包添加到classpath中。 具体到我们的错误,第二个错误`ClassNotFoundException`表明类路径中缺少HBase的相关类,特别是`org.apache.hadoop.hbase.filter.Filter`。这通常是因为HBase的jar包没有在类路径中被正确加载。 第一个错误`Failed to find metadata store by url: kylin_metadata@hbase`则表明Kylin无法连接到HBase中的元数据存储。这可能是由于HBase服务未正常运行,或者Kylin配置的HBase连接信息不正确,或者因为缺少HBase的依赖导致连接失败。 结合引用[4]的解决方法,我们可以尝试以下步骤: ### 步骤1: 检查HBase服务状态 确保HBase服务已经启动并运行正常。可以通过以下命令检查: ```bash hbase shell ``` 在hbase shell中执行`status`命令,查看HBase状态。 ### 步骤2: 检查Kylin配置 确认Kylin的配置文件中关于HBase的连接配置正确。主要配置文件是`$KYLIN_HOME/conf/kylin.properties`。检查以下配置项: ```properties kylin.metadata.url=kylin_metadata@hbase ``` 这表示使用HBase作为元数据存储,默认表名为`kylin_metadata`。确保HBase中确实存在这张表(通常Kylin会在初始化时创建)。 ### 步骤3: 添加HBase依赖到类路径 根据引用[4]的解决方案,我们需要将HBase的依赖包添加到Kylin的类路径中。具体操作如下: 1. 打开Kylin的启动脚本`$KYLIN_HOME/bin/kylin.sh`(或`find-env.sh`,具体位置可能因版本而异)。 2. 在脚本中找到设置`CLASSPATH`的地方,将HBase的依赖包路径添加进去。例如,在`kylin.sh`中可能有一行类似于: ```bash CLASSPATH=${KYLIN_HOME}/conf:${KYLIN_HOME}/lib/*:... ``` 我们需要将HBase的lib目录下的所有jar包加入类路径。假设HBase的安装目录是`$HBASE_HOME`,则添加: ```bash CLASSPATH=${CLASSPATH}:$HBASE_HOME/lib/* ``` 注意:如果已经存在HBase的类路径,请检查是否正确;如果没有,则添加。 引用[4]中提到修改`kylin.sh`,在设置`CLASSPATH`的地方追加HBase的lib路径。具体操作可能如下: ```bash # 在kylin.sh中找到设置CLASSPATH的行,然后追加 CLASSPATH=${CLASSPATH}:${HBASE_HOME}/lib/* ``` 另外,确保`HBASE_HOME`环境变量已经设置。如果没有,你需要在脚本中设置,或者直接在命令中使用绝对路径。 ### 步骤4: 检查Hadoop和HBase版本兼容性 Kylin对Hadoop和HBase的版本有特定要求。请确保你使用的Kylin版本与HBase版本兼容。根据引用[2]中的信息,HBase版本为`2.1.0-cdh6.3.1`,Flume版本为`1.9.0-cdh6.3.1`,因此Kylin也应当使用相同CDH版本的发行版。 ### 步骤5: 检查是否有多个HBase版本冲突 如果环境中存在多个HBase版本,可能会导致类加载冲突。确保Kylin使用的HBase依赖与运行的HBase版本一致。 ### 步骤6: 重新启动Kylin服务 修改配置后,重新启动Kylin服务,然后再次运行AclTableMigrationCLI。 ### 步骤7: 手动上传HBase的jar包(备选) 如果以上步骤无效,可以尝试将HBase的jar包手动复制到Kylin的lib目录下(注意版本一致),然后重启Kylin。但这种方法可能会导致依赖冲突,需谨慎。 ### 总结 主要问题在于类路径中缺少HBase的相关类,因此重点是将HBase的jar包加入到Kylin的类路径中。同时确保HBase服务正常运行且配置正确。 如果问题仍然存在,请提供以下信息以便进一步排查: - Kylin、HBase、Hadoop的具体版本 - `kylin.properties`配置文件中关于存储和HBase的配置部分 - 完整的错误堆栈信息 §§相关问题§§ 1. 如何检查HBase中是否存在Kylin的元数据表? 2. 如何设置Kylin的环境变量? 3. Kylin与HBase的版本兼容性如何确定? </think> ### 解决Kylin AclTableMigrationCLI运行时错误的步骤 #### 🔍 错误原因分析 1. **`Failed to find metadata store by url: kylin_metadata@hbase`** 表示Kylin无法访问HBase中的元数据表`kylin_metadata`,通常由以下原因导致: - HBase服务未启动或不可达 - HBase客户端配置缺失 - 元数据表损坏或未初始化 2. **`ClassNotFoundException: org.apache.hadoop.hbase.filter.Filter`** 表明Kylin运行时缺少HBase的核心依赖库(如`hbase-client.jar`),常见于: - HBase类库未加入CLASSPATH - 组件版本不兼容(HBase/Kylin/Hadoop版本冲突) - 环境变量配置错误 --- #### 🛠️ 解决方案 ##### 步骤1:验证HBase服务状态 ```bash # 检查HBase是否正常运行 hbase shell > status # 查看集群状态 > list # 确认存在kylin_metadata表 ``` - 若表不存在,需初始化Kylin元数据:`$KYLIN_HOME/bin/kylin.sh start` ##### 步骤2:修复CLASSPATH配置(关键步骤) 修改Kylin启动脚本,**强制添加HBase依赖库**: 1. 打开`$KYLIN_HOME/bin/kylin.sh` 2. 在`CLASSPATH`配置段追加以下内容(参考引用[4]): ```bash # 添加HBase依赖库(根据实际路径调整) export HBASE_HOME=/usr/lib/hbase # 替换为你的HBase安装路径 export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib/* ``` ⚠️ **重点**:必须确保路径包含以下JAR文件: - `hbase-client-*.jar` - `hbase-common-*.jar` - `hbase-protocol-*.jar` ##### 步骤3:检查版本兼容性 确认组件版本匹配(参考引用[2]): ```bash hbase version # 记录HBase版本 kylin version # 记录Kylin版本 hadoop version # 记录Hadoop版本 ``` - 📌 **兼容要求**:Kylin版本需与CDH/HDP发行版一致(如CDH6.3.x需使用Kylin 3.x) ##### 步骤4:手动添加缺失JAR(备选方案) 若仍报`ClassNotFoundException`,直接将HBase JAR复制到Kylin的lib目录: ```bash cp $HBASE_HOME/lib/hbase-client-*.jar $KYLIN_HOME/lib/ cp $HBASE_HOME/lib/hbase-common-*.jar $KYLIN_HOME/lib/ ``` ##### 步骤5:重启服务并验证 ```bash # 停止Kylin $KYLIN_HOME/bin/kylin.sh stop # 启动Kylin $KYLIN_HOME/bin/kylin.sh start # 重新执行迁移命令 $KYLIN_HOME/bin/kylin.sh org.apache.kylin.tool.AclTableMigrationCLI ``` --- #### 💡 预防措施 1. **环境变量标准化**:在`/etc/profile`中明确定义: ```bash export HBASE_HOME=/path/to/hbase export KYLIN_HOME=/path/to/kylin export CLASSPATH=$CLASSPATH:$HBASE_HOME/lib/* ``` 2. **版本控制**:使用同版本CDH/HDP套件安装HBase/Kylin/Hadoop[^2][^4] 3. **权限检查**:确保Kylin用户有权限访问HBase: ```bash kinit kylin_user@EXAMPLE.COM # Kerberos环境 hbase shell -user kylin_user ``` > 📌 **关键提示**:90%的`ClassNotFoundException`错误源于CLASSPATH配置缺失,务必检查`kylin.sh`中的路径配置[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值