Ways to write & read HDFS files

本文介绍了三种在Hadoop中操作HDFS文件的方法:使用FSDataOutputStream直接进行读写、利用BufferedReader/Writer进行文本处理及SequenceFile进行高效的数据序列化读写。这些方法适用于不同的场景需求。

Ways to write & read HDFS files

- Output Stream

 
FSDataOutputStream dos = fs.create(new Path("/user/tmp"), true); 
dos.writeInt(counter); 
dos.close();

- Buffered Writer/Reader
//Writer
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fs.create(new Path("/user/tmp"), true)));
bw.write(counter.toString());
bw.close();

//Reader
Configuration conf = context.getConfiguration();
FileSystem fs = FileSystem.get(conf);
 
DataInputStream d = new DataInputStream(fs.open(new Path(inFile)));
BufferedReader reader = new BufferedReader(new InputStreamReader(d));
while ((line = reader.readLine()) != null){
...
}
reader.close();
  

- SequenceFile Reader and Writer (I think most preferable way for Hadoop jobs):
//writer
SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, new Path(pathForCounters, context.getTaskAttemptID().toString()), Text.class, Text.class);
   writer.append(new Text(firtUrl.toString()+"__"+ context.getTaskAttemptID().getTaskID().toString()), new Text(counter+""));
   writer.close(); 

//reader
SequenceFile.Reader reader = new SequenceFile.Reader(fs, new Path(makeUUrlFileOffsetsPathName(FileInputFormat.getInputPaths(context)[0].toString())),  conf);
   while (reader.next(key, val)){
    offsets.put(key.toString(), Integer.parseInt(val.toString()));
   }

HDFS 上读取 Parquet 文件失败的问题可能由多种原因引起,例如文件路径错误、HDFS 配置问题、权限问题或元数据损坏等。以下是一些可能的解决方案和相关建议: ### 1. 检查 HDFS 路径 确保提供的路径是正确的,并且该路径下的文件确实存在。可以使用以下命令验证文件是否存在以及其内容是否正常: ```bash hdfs dfs -ls /path/to/parquet/files hdfs dfs -cat /path/to/parquet/files/part-*.parquet ``` 如果路径错误或文件不存在,则需要重新确认路径[^3]。 ### 2. 配置 HDFS 默认路径 如果遇到 `Wrong FS` 错误(如 `hdfs://192.168.1.xx:9000/output`),可以通过设置 HDFS 的默认路径来解决。在 Spark 或 Flink 的主程序中添加以下配置: ```java Configuration configuration = new Configuration(); configuration.set("fs.defaultFS", "hdfs://<your_hdfs_namenode_address>:<port>"); ``` 请将 `<your_hdfs_namenode_address>` 和 `<port>` 替换为实际的 HDFS NameNode 地址和端口[^3]。 ### 3. 权限问题 确保当前用户对 HDFS 上的目标目录具有读取权限。可以使用以下命令检查和修改权限: ```bash hdfs dfs -chmod -R 755 /path/to/parquet/files hdfs dfs -chown -R <user>:<group> /path/to/parquet/files ``` 如果权限不足,可能会导致无法读取文件。 ### 4. 使用 Spark 读取 Parquet 文件 通过 Spark 读取 HDFS 上的 Parquet 文件时,可以使用以下代码示例: ```python spark.read.parquet("hdfs://<namenode_address>:<port>/path/to/parquet/files") ``` 确保路径正确,并且 Spark 程序能够访问 HDFS 集群[^2]。 ### 5. 处理损坏的 Parquet 文件 如果 Parquet 文件本身损坏,可能会导致读取失败。可以尝试以下步骤: - **删除损坏的分区**:如果某个分区的数据有问题,可以手动删除该分区并重新上传正确的数据。 ```bash hdfs dfs -rm -r /path/to/parquet/files/dt_year_id=2020/dt_month_id=202005/dt_day_id=20200501 ``` - **刷新表元数据**:如果使用的是 Hive 表,可以通过以下 SQL 命令刷新元数据: ```sql invalidate metadata table_name; ``` 这有助于解决因元数据不一致导致的读取问题[^4]。 ### 6. 检查 HDFS 集群状态 如果 HDFS 集群的状态异常(如 DataNode 不可用或磁盘故障),也可能导致读取失败。可以运行以下命令检查 HDFS 状态: ```bash hdfs fsck /path/to/parquet/files ``` 如果有损坏的块,可以尝试修复或重新上传数据。 ### 7. 其他常见错误处理 - **Disk I/O Error**:如果报错 `[Error Code: 0, SQL State: HY000] Disk I/O error`,可能是由于 HDFS 文件系统的问题或网络不稳定引起的。可以尝试重启 HDFS 集群或检查网络连接[^4]。 - **Schema 不匹配**:如果 Parquet 文件的 Schema 与读取程序中的 Schema 不匹配,也会导致读取失败。可以通过以下方式验证 Schema: ```python spark.read.parquet("hdfs://<namenode_address>:<port>/path/to/parquet/files").printSchema() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值