大数据练习二

实验2:熟悉常用的HDFS操作
实验环境
操作系统:Ubuntu 18.04
Hadoop版本:3.1.3
JDK版本:1.8.0_212
Eclipse版本:2020-03

实验内容与完成情况
(一)HDFS Shell命令实现
序号 功能 命令
1 向HDFS上传文件,存在时由用户指定追加或覆盖 # 上传,存在时询问
hdfs dfs -put -f localfile hdfsfile # 覆盖
hdfs dfs -appendToFile localfile hdfsfile # 追加
2 从HDFS下载文件,本地存在时自动重命名 # 下载,自动重命名
hdfs dfs -get hdfsfile localfile && if [ -f localfile ]; then mv localfile localfile_$(date +%s); fi
3 将HDFS中指定文件的内容输出到终端 hdfs dfs -cat hdfsfile
4 显示HDFS中指定文件的信息 hdfs dfs -ls -h hdfsfile
5 递归显示HDFS目录下所有文件信息 hdfs dfs -ls -R hdfsdirectory
6 创建/删除HDFS文件,目录不存在时自动创建 # 创建文件
hdfs dfs -mkdir -p $(dirname hdfsfile) && hdfs dfs -touchz hdfsfile
# 删除文件
hdfs dfs -rm hdfsfile
7 创建/删除HDFS目录,创建时自动创建父目录,删除时询问非空目录 # 创建目录
hdfs dfs -mkdir -p hdfsdirectory
# 删除目录,非空时询问
hdfs dfs -rmdir hdfsdirectory # 空目录直接删除
hdfs dfs -rm -r -skipTrash hdfsdirectory # 非空目录强制删除
8 向HDFS文件追加内容,指定开头或结尾 # 追加到结尾
hdfs dfs -appendToFile localfile hdfsfile
# 追加到开头(需先下载修改再上传)
hdfs dfs -get hdfsfile tempfile && cat newcontent tempfile > tempfile2 && hdfs dfs -put -f tempfile2 hdfsfile
9 删除HDFS中指定的文件 hdfs dfs -rm hdfsfile
10 在HDFS中将文件从源路径移动到目的路径 hdfs dfs -mv hdfssrc hdfsdest

(二)Java API实现自定义FSDataInputStream类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;

public class MyFSDataInputStream extends FSDataInputStream {

public MyFSDataInputStream(FSDataInputStream in) {
super(in.getWrappedStream());
}

public String readLine() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(this));
return reader.readLine();
}

public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path path = new Path(args[0]);
FSDataInputStream in = fs.open(path);
MyFSDataInputStream myIn = new MyFSDataInputStream(in);
String line;
while ((line = myIn.readLine()) != null) {
System.out.println(line);
}
myIn.close();
fs.close();
}
}
(三)使用java.net.URL和FsURLStreamHandlerFactory输出HDFS文件内容
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;

public class HDFSURLReader {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}

public static void main(String[] args) throws IOException {
URL url = new URL(args[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}
}
编译和运行命令

编译

hadoop com.sun.tools.javac.Main MyFSDataInputStream.java HDFSURLReader.java

运行MyFSDataInputStream

hadoop jar myhdfs.jar MyFSDataInputStream hdfs://localhost:9000/user/hadoop/test/.bashrc

运行HDFSURLReader

hadoop jar myhdfs.jar HDFSURLReader hdfs://localhost:9000/user/hadoop/test/.bashrc
出现的问题及解决方案
问题 解决方案
Java API编译时找不到Hadoop类 使用hadoop命令编译,或配置正确的classpath
运行时提示权限不足 确保Hadoop用户对操作的HDFS路径有相应权限
URL方式访问HDFS时提示“unknown protocol: hdfs” 确保正确设置了FsUrlStreamHandlerFactory

posted @ 2025-11-07 22:06  YOLO霖  阅读(3)  评论(0)    收藏  举报