(1)理解HDFS在Hadoop体系结构中的角色;
(2)熟练使用HDFS操作常用的Shell命令;
(3)熟悉HDFS操作常用的Java API。
(1)操作系统:Linux;
(2)Hadoop版本:2.7.4 ;
(3)JDK版本1.8;
(4)Java IDE:eclipse 。
(一)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务:
(1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件
/**
* 向HDFS中上传任意文本文件
* 如果指定的文件在 HDFS 中已经存在
* 由用户指定是追加到原有文件末尾还是覆盖原有的文件
* @param fileSystem
* @param srcPath 本地文件地址
* @param desPath HDFS文件地址
* @author yangd
*/
@Test
private static void test1(FileSystem fileSystem, Path srcPath, Path desPath) {
try {
if (fileSystem.exists(new Path("/a/test.txt"))) {
System.out.println("文件已存在,是否覆盖原有的文件? ( y 覆盖/n 追加)");
if (new Scanner(System.in).next().equals("y")) {
fileSystem.copyFromLocalFile(false, true, srcPath, desPath);
} else {
FileInputStream inputStream = new FileInputStream(srcPath.toString());
FSDataOutputStream outputStream = fileSystem.append(new Path("/test/test.txt"));
byte[] bytes = new byte[1024];
int read = -1;
while ((read = inputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, read);
}
inputStream.close();
outputStream.close();
}
} else {
fileSystem.copyFromLocalFile(srcPath, desPath);
}
} catch (IOException e) {
e.printStackTrace();
}
}
调用方法
public static void main(String args[]) throws IOException {
// HDFS路径
Path path1 = new Path("/a/test.txt");
// 本地路径
Path path2 = new Path("D:/test.txt");
System.setProperty("hadoop.home.dir", "D:\\Hadoop2.7.4\\hadoop-2.7.4");
// 构造一个配置参数对象,设置一个参数:要访问的HDFS的URI
Configuration conf = new Configuration();
// 这里指定使用的是HDFS
conf.set("fs.defaultFS", "hdfs://192.168.121.130:9000");
// 通过如下的方式进行客户端身份的设置
System.setProperty("HADOOP_USER_NAME", "root");
// 通过FileSystem的静态方法获取文件系统客户端对象
FileSystem fs = FileSystem.get(conf);
test1(fs, path2, path1);
}
结果
shell
hadoop fs -put /export/data/word.txt /test
hadoop fs -appendToFile /export/data/word.txt /test
hadoop fs -copyFromLocal -f /export/data/word.txt /test
(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
/**
* 从HDFS中下载指定文件 若本地文件与要下载的文件名称相同
* 则自动对下载的文件重命名
* @param fileSystem
* @param remotePath HDFS文件地址
* @param localPath 本地文件地址
* @author yangd
*/
@Test
private static void test2(FileSystem fileSystem, Path remotePath, Path localPath) {
try {
if (fileSystem.exists(remotePath)) {
if(!(fileSystem.equals(localPath))){
fileSystem.copyToLocalFile(remotePath, localPath);
System.out.println("从HDFS中下载文件成功!");
}else {
fileSystem.copyToLocalFile(remotePath, new Path("localPath"+ new Random().nextInt() + ".txt"));
System.out.println("从HDFS中下载文件并重命名成功!");
}
} else {
System.out.println("在HDFS中找不到此文件!");
}
}catch (IOException e) {
e.printStackTrace();
}
}
hadoop fs -copyToLocal /a/test.txt /export/data/test.txt
(3)将HDFS中指定文件的内容输出到终端中;
hadoop fs -cat /a/test.txt
/**
* 将HDFS中指定文件的内容输出到终端中
*
* @param fileSystem
* @param remotePath
* @author yangd
*/
@Test
private static void test3(FileSystem fileSystem, Path remotePath) {
try {
FSDataInputStream inputStream = fileSystem.open(remotePath);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
System.out.println("HDFS中文件内容为:");
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
/**
* 显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息
* @param fileSystem
* @param remotePath HDFS文件地址
* @author yangd
*/
private static void test4(FileSystem fileSystem, Path remotePath) {
try {
FileStatus[] fileStatus = fileSystem.listStatus(remotePath);
System.out.println("HDFS中指定的文件的读写权限、大小、创建时间、路径信息如下:");
for (FileStatus status : fileStatus) {
System.out.println(status.getPermission());
System.out.println(status.getBlockSize());
System.out.println(status.getAccessTime());
System.out.println(status.getPath());
}
} catch (IOException e) {
e.printStackTrace();
}
}
hadoop fs -ls -h /a/test.txt
完整实验过程及源代码和运行结果截图下载链接:
实验2常用的HDFS操作.doc-Linux文档类资源-CSDN文库