CDH6.3.2中安装kylin4

本文讲述了作者在将Kylin 4.0部署在CDH 6环境中遇到的问题,涉及Spark版本选择、kerberos认证、目录权限设置、Spark下载与集成、Hive表导入问题,以及最终的包版本调整和解决步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、从kylin官网下载kylin4

因为看到版本4使用spark构建cube存与parquet中,更快更省更先进,且官网写支持cdh6

实际中kylin4要想跑起来还是很不顺利的

过程中还试验了kylin3,效果更差,启动都不行

2、选择1个kerberos认证过的用户,需要有hdfs权限?登录主机

配置kylin的整个目录的own和group都是这个用户(chgown)

配置kylin.properties,修改其中mysql数据库的配置(前提是要安装好mysql,分配好库和用户权限等)

3、执行bin/download-spark.sh 下载spark

cdh中自带有spark,通过配置spark_home来直接使用cdh的spark一直不行,应该还是版本兼容问题。最后迫于无赖根据上述命令下载了spark,成功后它会自动解压到kylin的spark目录下

4、这时候如果启动kylin,应该能成功,界面能打开并能登录进入操作,但是想载入cdh内hive中的表,还是不行,后台logs/kylin.log中会各种报错。针对此类问题,根据错误日志,逐个排查。基本都是版本不兼容导致,也很难解决

5、最终解决办法备份并删掉kylin/spark/jars/spark*.jar,然后复制 cdh/lib/spark/jars/spark*.jar 到kylin/spark/jars/ 下,再重启kylin

6、成功!

7、后续使用中遇到的问题

7.1 构建cube时error,提示的还是class找不到等问题,经过排查,确实了hive的几个包以及spark的几个包,具体:

hive-beeline-1.2.1.spark2.jar 
hive-cli-1.2.1.spark2.jar 
hive-exec-2.1.1-cdh6.3.2.jar
hive-jdbc-1.2.1.spark2.jar 
hive-metastore-1.2.1.spark2.jar 

以上几个包从cdh的hive目录下找到复制到kylin/spark/jars下

spark-mesos_2.11-2.4.7.jar  这个包cdh也没有,就不复制了

### 解决方案分析 在处理 `java.lang.NoSuchMethodException` 的问题时,通常是因为不同版本之间的不兼容性引起的。以下是针对此问题的具体解决方案: #### 1. **确认依赖版本** 需要仔细核对 Spark、Hadoop 和 Hive 版本的一致性和兼容性。根据已有信息可知 Kylin 4.0 测试版依赖于 Spark 2.4.6CDH 6.3.2[^1]。然而,CDH 6.3.2 中的 Hadoop 是 3.0 而不是 Spark 所需的 Hadoop 2.7,这可能导致类路径中的冲突。 此外,Hive 的版本也需要特别注意。如果 Spark 使用的是 Hive 1.x,而实际环境中运行的是 Hive 2.x,则可能会引发方法签名不匹配的问题。 #### 2. **排查具体异常原因** 当前错误提示表明,在调用 Hive 加载分区的方法时出现了 `NoSuchMethodException`。这意味着当前使用的 Hive JAR 文件可能缺少该方法定义。这种情况下,可以通过以下方式解决问题: - 检查项目中引入的 Hive JAR 是否与 Spark 支持的版本一致。 - 如果存在多个 Hive JAR 文件(例如来自不同的集群环境),则需要清理多余的依赖项并保留唯一正确的版本。 #### 3. **调整构建工具配置** 对于 Maven 或 SBT 构建工具来说,明确指定所需组件及其子模块非常重要。下面是一个典型的 Maven POM.xml 示例片段用于声明 Spark-Hive 连接器及相关库: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.4.6</version> </dependency> <!-- 明确指明所需的Hive版本 --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> <!-- 确保与Spark兼容 --> </dependency> ``` 上述代码展示了如何通过强制绑定特定版本来减少潜在冲突的可能性。 #### 4. **尝试隔离ClassLoader机制** 在某些复杂场景下,即使解决了显式的JAR文件冲突仍可能出现隐性的加载失败情况。此时可考虑启用独立 ClassLoader 来管理外部资源加载过程。对于 Spark 应用程序而言,可以在提交命令行参数里增加如下选项实现这一点: ```bash --conf spark.driver.userClassPathFirst=true \ --conf spark.executor.userClassPathFirst=true ``` 这些设置会让用户自定义类优先级高于系统默认提供者,从而有效规避部分由共享上下文引起的问题[^2]。 --- ### 提供一段示例 Scala 代码验证逻辑正确性 假设我们已经按照以上指导完成了必要的准备工作之后,可以编写简单的测试脚本来验证整个流程是否正常工作: ```scala import org.apache.spark.sql.SparkSession object TestHivePartitionLoad { def main(args: Array[String]): Unit = { val warehouseLocation = "/user/hive/warehouse" // 创建 Spark Session 并连接到 Hive Metastore val spark = SparkSession.builder() .appName("Test Hive Partition Load") .config("spark.sql.warehouse.dir", warehouseLocation) .enableHiveSupport() // 启动 Hive 支持功能 .getOrCreate() try { import spark.implicits._ // 假设有一个名为 &#39;example_table&#39; 表格已创建好并且含有分区字段 date=... val df = spark.read.table("default.example_table").where($"date" === "2023-01-01") println(s"Data count under specified partition is ${df.count()} rows.") } catch { case e: Exception => e.printStackTrace() } finally { spark.stop() } } } ``` 上面这段代码简单演示了读取某个特定日期分区数据的过程,并打印总数作为结果反馈给开发者查看是否存在任何执行障碍。 --- ### 总结建议 综上所述,解决此类问题的关键在于精确控制各个框架间相互作用关系的同时保持良好实践习惯。包括但不限于严格限定第三方软件包范围以及合理运用高级特性如定制化线程上下文等等措施共同协作才能达到预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值