irpas技术客

实验2熟悉常用的HDFS操作_小楊学编程_常用的hdfs操作

irpas 2442

1.实验目的

(1)理解HDFS在Hadoop体系结构中的角色;

(2)熟练使用HDFS操作常用的Shell命令;

(3)熟悉HDFS操作常用的Java API。

2. 实验平台

(1)操作系统:Linux;

(2)Hadoop版本:2.7.4 ;

(3)JDK版本1.8;

(4)Java IDE:eclipse ?。

3. 实验步骤

(一)编程实现以下功能,并利用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文库


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #常用的hdfs操作 #API #2 #3JDK版本184Java #IDEeclipse