Hadoop和HDFS基础练习
Hadoop和HDFS基础测试:
测试题目1: Hadoop操作
- 使用hadoop用户登录Linux系统,启动Hadoop(Hadoop的安装目录为“/usr/local/hadoop”),为hadoop用户在HDFS中创建用户目录“/user/hadoop”
- 接着在HDFS的目录“/user/hadoop”下,创建test文件夹,并查看文件列表
- 将Linux系统本地的“~/.bashrc”文件上传到HDFS的test文件夹中,并查看test
- 将HDFS文件夹test复制到Linux系统本地文件系统的“/usr/local/hadoop”目录下
测试题目2:HDFS操作
(一)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务:
向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;
从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
将HDFS中指定文件的内容输出到终端中;
显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
删除HDFS中指定的文件;
在HDFS中,将文件从源路径移动到目的路径。
(二)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。
(三)查看Java帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。
一.
package com.zhao.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.lang.reflect.Array; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; /** * 客户端代码常用套路 * 1.获取一个客户端对象 * 2.执行相关操作命令 * 3.关闭资源 * */ public class HdfsClient { private FileSystem fs; @Before public void init() throws URISyntaxException, IOException, InterruptedException { //连接集群的nn地址 URI url = new URI("hdfs://Hadoop102:8020"); //创建一个配置文件 Configuration configuration = new Configuration(); //用户 String user = "zhao"; //1.获取到了客户端对象 fs = FileSystem.get(url, configuration, user); } @After public void close() throws IOException { //关闭资源 fs.close(); } @Test public void textmkdir() throws URISyntaxException, IOException, InterruptedException { //2.创建一个文件夹 fs.mkdirs(new Path("/xiyou/huaguoshan2")); } //上传 /** * 参数优先级(由低向高) * hdfs-default.xml=>hdfs-site.xml=>在项目资源目录下的配置文件优先级=>代码里面的配置 */ @Test public void testput() throws IOException { //参数解读:参数一:表示删除原数据;参数二:是否允许覆盖;参数三:原数据路径;参数四:目的地路径 fs.copyFromLocalFile(true, true, new Path("G:\\text02.txt"), new Path("/user/hadoop/test")); } //文件下载 @Test public void testGet() throws IOException { //参数解读:参数一:原文件是否删除 参数二:原文件路径HDFS 参数三:目的路径win 参数四: fs.copyToLocalFile(false, new Path("/xiyou/huaguoshan"), new Path("d:\\"), false); } //删除 @Test public void testRm() throws IOException { //参数解读:参数一:要删除的路径 参数二:是否递归删除 //删除文件 //fs.delete(new Path("/jdk-8u212-linux-x64.tar.gz"),false); //删除空目录 //fs.delete(new Path("/xiyou"),false); //删除非空目录 fs.delete(new Path("/jinguo"), true); } //文件的更名和移动 @Test public void testmv() throws IOException { //参数解读:参数1:原文件路径;参数2:目标文件路径 //对文件名称的修改 //fs.rename(new Path("/wcinput/word.txt"),new Path("/wcinput/ss.txt")); //文件的移动和更名 //fs.rename(new Path("/wcinput/ss.txt"),new Path("/cls.txt")); //目录更名 fs.rename(new Path("/wcinput"), new Path("/output")); } //获取文件详细信息 @Test public void fileDetail() throws IOException { RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path("/"), true); while (iterator.hasNext()) { LocatedFileStatus fileStatus=iterator.next(); System.out.println("========" + fileStatus.getPath() + "========="); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getOwner()); System.out.println(fileStatus.getGroup()); System.out.println(fileStatus.getLen()); System.out.println(fileStatus.getModificationTime()); System.out.println(fileStatus.getReplication()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPath().getName()); //获取块信息 BlockLocation[] blockLocations=fileStatus.getBlockLocations(); System.out.println(Arrays.toString(blockLocations)); } } @Test public void testListStatus() throws IOException{ // 判断是文件还是文件夹 FileStatus[] listStatus = fs.listStatus(new Path("/")); for (FileStatus fileStatus : listStatus) { // 如果是文件 if (fileStatus.isFile()) { System.out.println("文件:" + fileStatus.getPath().getName()); } else { System.out.println("目录:" + fileStatus.getPath().getName()); } } } }
二及三:
package com.zhao.hdfs; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.commons.io.IOUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.fs.Path; public class MyFSDataInputStream extends FSDataInputStream { static{ URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } MyFSDataInputStream(InputStream in) { super(in); } public static int ReadLine(String path) throws IOException, URISyntaxException, InterruptedException { //连接集群的nn地址 URI url = new URI("hdfs://Hadoop102:8020"); //创建一个配置文件 Configuration configuration = new Configuration(); //用户 String user = "zhao"; //1.获取到了客户端对象 FileSystem fs = FileSystem.get(url, configuration, user); Path file = new Path(path); FSDataInputStream getIt = fs.open(file); BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); String content;// = d.readLine(); //读取文件一行 System.out.println("使用readline按行读取文本:"); while((content=d.readLine())!=null){ System.out.println(content); } // System.out.println(content); d.close(); //关闭文件 fs.close(); //关闭hdfs return 0; } public static void PrintFile() throws MalformedURLException, IOException{ String FilePath="hdfs://Hadoop102:8020/user/hadoop/test/test02.txt"; InputStream in=null; in=new URL(FilePath).openStream(); System.out.println("读取文本输出到终端:"); IOUtils.copy(in,System.out); } public static void main(String[] arg) throws IOException, URISyntaxException, InterruptedException { MyFSDataInputStream.ReadLine("/user/hadoop/test/test02.txt"); MyFSDataInputStream.PrintFile(); } }