无法通过Spark访问Cloudera Hadoop集群主节点的技术求助
用Scala+Spark连接Cloudera Hadoop集群的完整配置方案
嘿,看你已经搞定了基础环境——10节点的Cloudera集群跑起来了,用IntelliJ远程开发Scala+Spark应用,还已经在SBT里加了部分依赖。我先帮你补全缺失的Spark SQL依赖,再一步步说清楚连接集群的关键配置,确保你能顺利连上:
第一步:补全SBT依赖配置
首先,Spark SQL的版本必须和Spark Core保持一致(你用的是2.2.0),另外还要加上匹配Cloudera版本的Hadoop客户端依赖,避免连接HDFS时出现版本不兼容问题。注意把hadoop-client的版本换成你Cloudera集群对应的Hadoop版本(比如CDH 5.15对应2.6.0-cdh5.15.0):
libraryDependencies ++= Seq( "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test, "com.h2database" % "h2" % "1.4.196", // 标记为Provided,因为集群上已经预装了Spark,打包时不用包含这些依赖 "org.apache.spark" %% "spark-core" % "2.2.0" % Provided, "org.apache.spark" %% "spark-sql" % "2.2.0" % Provided, // 替换为你的Cloudera Hadoop版本 "org.apache.hadoop" % "hadoop-client" % "2.6.0-cdh5.15.0" % Provided )
为什么加Provided?因为Cloudera集群本身已经部署了Spark和Hadoop的核心库,打包时把这些依赖排除掉,既能减少jar包体积,又能避免版本冲突。
第二步:编写Spark连接集群的代码
下面是一个最小化的连接示例,关键配置都标出来了,你需要替换成自己集群的主机地址:
import org.apache.spark.sql.SparkSession object ClouderaSparkConnector { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("ClouderaClusterConnectionTest") // Cloudera默认用YARN做资源管理器,所以指定master为yarn .master("yarn") // 替换为你的ResourceManager主机和端口(默认8032是提交端口) .config("spark.hadoop.yarn.resourcemanager.address", "your-rm-host:8032") // 替换为你的NameNode主机和HDFS端口(默认8020) .config("spark.hadoop.fs.defaultFS", "hdfs://your-nn-host:8020") // 指定集群上Spark jars的HDFS路径,避免远程提交时重复上传依赖 .config("spark.yarn.jars", "hdfs:///user/spark/jars/*") .getOrCreate() // 测试读取HDFS上的文件,替换成你集群上存在的文件路径 val testDF = spark.read.text("hdfs://your-nn-host:8020/sample.txt") testDF.show() spark.stop() } }
第三步:IntelliJ的关键配置
光有代码还不够,IntelliJ这边还要做两个重要设置:
- Scala版本匹配:Spark 2.2.0对应Scala 2.11.x,别用2.12版本,不然会出现兼容性问题。在IntelliJ的Project Structure里确认Scala SDK版本和集群一致。
- Hadoop配置文件加载:把集群上的
core-site.xml、yarn-site.xml、hdfs-site.xml拷贝到本地目录,然后在IntelliJ的运行配置里添加VM参数:
这样Spark就能自动读取集群的配置,不用在代码里硬编码所有参数,更灵活。-DHADOOP_CONF_DIR=/path/to/your/local/cloudera-config-folder - 网络连通性:确保你的开发主机能访问集群的ResourceManager、NameNode以及各个DataNode的端口(比如8032、8020、8088等),如果有防火墙的话要开放这些端口。
这样配置下来,你应该就能顺利从IntelliJ远程连接到Cloudera Hadoop集群,运行Spark任务了。如果遇到问题,比如权限或者版本冲突,再针对性排查就行~
内容的提问来源于stack exchange,提问作者JeyJ
相关产品推荐
相关产品推荐

