Spark连接Hadoop读取HDFS问题小结

本文介绍了如何让Spark 0.7.2版本与Hadoop 2版本兼容的方法。包括替换hadoop-core-1.0.4.jar为hadoop-2-core.jar,添加hadoop配置文件,以及解决缺少libhadoop.so和libsnappy.so的问题。

Spark与hadoop版本

我使用0.7.2的Spark版本,且是pre-built过的版本,支持的hadoop版本是hadoop1。在http://spark-project.org/files/上能下载的预编译过的spark版本里,凡是预编译cdh4的压缩包,下载后解压会中断,文件本身有问题。我在google论坛上发帖说明了这个问题:https://groups.google.com/forum/#!topic/spark-users/Y4iJ1458d18。所以我现在使用预编译了1代hadoop的spark,来连接2代hadoop。按理说在编译spark的时候,通过改动SPARK_HOME/project/SparkBuild.scala,可以指定要支持的hadoop版本:

  1. // Hadoop version to build against. For example, "0.20.2", "0.20.205.0", or  
  2. // "1.0.4" for Apache releases, or "0.20.2-cdh3u5" for Cloudera Hadoop.  
  3. val HADOOP_VERSION = "1.0.4"  
  4. val HADOOP_MAJOR_VERSION = "1"  
  5.   
  6. // For Hadoop 2 versions such as "2.0.0-mr1-cdh4.1.1", set the HADOOP_MAJOR_VERSION to "2"  
  7. //val HADOOP_VERSION = "2.0.0-mr1-cdh4.1.1"  
  8. //val HADOOP_MAJOR_VERSION = "2"  

解决方案

1. 受了https://groups.google.com/forum/#!topic/spark-users/XKj__psY-EA这个帖子的启发,替换了SPARK_HOME/lib_managed/jars下的hadoop-core-1.0.4.jar,换成了自己hadoop-client里hadoop/lib下的hadoop-2-core.jar包。

2. 在SPARK_HOME/conf下要添加hadoop的配置文件。我是添加了hadoop-site.xml和hadoop-default.xml两个配置文件。原因是,前者提供了连接的hdfs集群信息和账户密码;后者提供了下面这个配置:

  1. <property>  
  2.    <name>fs.hdfs.impl</name>  
  3.    <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>  
  4.    <description>The FileSystem for hdfs: uris.</description>  
  5. </property>  
完成这两步后,进入./spark-shell,运行下
  1. val file = sc.textFile("hdfs://xxx")  
  2. file.count()  
能正常跑出结果的话就OK了。


其他问题

这边再提供一个Unable to load native-hadoop library 和 Snappy native library not loaded的解决方案。这个问题主要是jre目录下缺少了libhadoop.so和libsnappy.so两个文件。具体是,spark-shell依赖的是scala,scala依赖的是JAVA_HOME下的jdk,libhadoop.so和libsnappy.so两个文件应该放到JAVA_HOME/jre/lib/amd64下面。要注意的是要知道真正依赖到的JAVA_HOME是哪一个,把两个.so放对地方。这两个so:libhadoop.so和libsnappy.so。前一个so可以在HADOOP_HOME下找到,比如hadoop\lib\native\Linux-amd64-64。第二个libsnappy.so需要下载一个snappy-1.1.0.tar.gz,然后./configure,make编译出来。snappy是google的一个压缩算法,在hadoop jira下https://issues.apache.org/jira/browse/HADOOP-7206记录了这次集成。


单替换了hadoop的core包后,可能还会出一些WARN或者ERROR的提示,主要牵扯到的是hadoop别的包的一些兼容啊,版本提升的问题。具体问题具体再解决吧。


(全文完)

在 Apache Spark 中,`spark.sql` 是 Spark SQL 模块的一部分,用于处理结构化数据(如 Parquet、JSON、CSV 等格式)。它可以通过 `DataFrame` 或 `SQL` 接口读取 HDFS 上的数据。下面是 **Spark SQL 读取 HDFS 数据的完整流程**,包括配置、读取、处理和输出等步骤。 --- ## ✅ 一、基本流程概述 1. **初始化 SparkSession** 2. **配置 Hadoop 文件系统(HDFS连接参数** 3. **读取 HDFS 上的结构化数据文件(如 Parquet、CSV、JSON)** 4. **使用 DataFrame 或 SQL 对数据进行处理** 5. **输出结果或写回 HDFS** --- ## ✅ 二、完整代码示例(以 Parquet 为例) ```python from pyspark.sql import SparkSession # 1. 创建 SparkSession spark = SparkSession.builder \ .appName("Read HDFS Data") \ .getOrCreate() # 2. 读取 HDFS 上的 Parquet 文件 df = spark.read.parquet("hdfs://namenode:8020/user/hadoop/input/data.parquet") # 3. 显示数据结构和内容 df.printSchema() df.show() # 4. 使用 DataFrame API 进行操作(例如筛选) filtered_df = df.filter(df["age"] > 30) # 5. 使用 SQL 询(需先注册为临时视图) df.createOrReplaceTempView("people") sql_df = spark.sql("SELECT * FROM people WHERE age > 30") sql_df.show() # 6. 将结果写回 HDFS filtered_df.write.parquet("hdfs://namenode:8020/user/hadoop/output/result.parquet") # 7. 停止 SparkSession spark.stop() ``` --- ## ✅ 三、读取不同格式的 HDFS 数据 | 文件格式 | Spark SQL 读取方式 | |----------|---------------------| | Parquet | `spark.read.parquet(path)` | | CSV | `spark.read.csv(path, header=True, inferSchema=True)` | | JSON | `spark.read.json(path)` | | ORC | `spark.read.orc(path)` | | Avro | 需要额外依赖:`spark.read.format("avro").load(path)` | --- ## ✅ 四、HDFS 配置注意事项 1. **Hadoop 集群配置**:确保 Spark 节点能够访问 Hadoop 集群的 `core-site.xml` 和 `hdfs-site.xml`,通常放在 `SPARK_HOME/conf/` 或通过 `--conf` 传入。 2. **HDFS 地址格式**:路径应以 `hdfs://namenode:8020/path` 格式书写。 3. **权限问题**:确保运行 Spark 应用的用户有权限访问 HDFS 路径。 --- ## ✅ 五、Spark SQL 与 HDFS 交互的完整流程图解(文字描述) ``` [Spark Driver] ↓ 初始化 SparkSession ↓ 配置 Hadoop 连接参数(可选) ↓ 调用 spark.read.xxx(...) 读取 HDFS 数据 ↓ 返回 DataFrame(逻辑计划) ↓ 调用 show(), count(), write() 等 action 操作 ↓ 生成物理执行计划并执行(Spark Executor 读取 HDFS 分片) ↓ 处理数据(过滤、聚合、转换) ↓ 将结果输出到控制台或写入 HDFS ``` --- ## ✅ 六、常见问题 - **报错:UnknownHostException**:检 HDFS 的 Namenode 地址是否正确,DNS 是否能解析。 - **报错:File does not exist**:检 HDFS 路径是否正确,文件是否存在。 - **报错:Permission denied**:检运行 Spark 的用户是否有权限访问 HDFS- **性能问题**:Parquet/ORC 等列式存储格式读取效率更高;使用分区表可加速询。 --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值