• HDFS操作

    在这里插入图片描述
    之前我们对hdfs的操作主要是通过在linux命令行里进行的,而在实际的应用中,为了实现本地与HDFS 的文件传输,我们主要借助于eclipse的开发环境开发的javaAPI来实现对远程HDFS的文件创建,上传,下载和删除等操作

    Hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,Hadoop类库中最终面向用户提供的接口类是FileSystem,该类封装了几乎所有的文件操作,例如CopyToLocalFile、CopyFromLocalFile、mkdir及delete等。综上基本上可以得出操作文件的程序库框架:

    operator( ) {
    
    	得到Configuration对象
    	得到FileSystem对象
    	进行文件操作 
    }
    

    下面介绍实现上述程序库框架中各个操作的具体步骤

    Java抽象类org.apache.hadoop.fs.FileSystem定义了hadoop的一个文件系统接口。该类是一个抽象类,通过以下两种静态工厂方法可以过去FileSystem实例:

    public static FileSystem.get(Configuration conf) throws IOException
    
    public static FileSystem.get(URI uri, Configuration conf) throws IOException
    

    HDFS上的文件创建,上传,下载,删除等操作的具体方法实现:

    (1)public boolean mkdirs(Path f) throws IOException

    一次性新建所有目录(包括父目录), f是完整的目录路径。

    (2)public FSOutputStream create(Path f) throws IOException

    创建指定path对象的一个文件,返回一个用于写入数据的输出流

    create()有多个重载版本,允许我们指定是否强制覆盖已有的文件、文件备份数量、写入文件缓冲区大小、文件块大小以及文件权限。

    (3)public boolean copyFromLocal(Path src, Path dst) throws IOException

    将本地文件拷贝到文件系统

    (4)public boolean exists(Path f) throws IOException

    检查文件或目录是否存在

    (5)public boolean delete(Path f, Boolean recursive)

    永久性删除指定的文件或目录,如果f是一个空目录或者文件,那么recursive的值就会被忽略。只有recursive=true时,一个非空目录及其内容才会被删除。

    (6)FileStatus类封装了文件系统中文件和目录的元数据,包括文件长度、块大小、备份、修改时间、所有者以及权限信息

    废话说了一大堆,还是直接上操作过程吧,就是简单的用java实现一个小的功能好在各个平台上都能运行。

    首先前提条件是你要先把hadoop搭好,然后把hadoopAPI插件装到你的eclipse下
    参考之前博客里的操作。
    然后,再来看下面一波操作。

    首先你要启动hadoop
    ./start-all.sh
    然后需要下载hadoop的依赖包hadoop2lib.tar.gz,解压备用
    新建JAVA项目,名为hadoop4

    在这里插入图片描述

    在这里插入图片描述
    然后新建包
    在这里插入图片描述
    在这里插入图片描述
    在hadoop4项目下创建目录,名为hadoop4lib,用于存放项目所需依赖包。
    在这里插入图片描述
    在这里插入图片描述
    从hadoop2lib目录下拷贝所有jar包到项目下的hadoop4lib目录,就像这样
    在这里插入图片描述
    然后add to build path, 按住shift键选中第一个jar,然后点击最后一个,全选,右击,选择buildPath=》Add to Build Path,这样环境就准备好了

    还记得新建的包吗?对,就是my.hdfs,再包里写自己的API就好了。其实就是新建类

    比如:在my.hdfs包下,新建类MakeDir,程序功能是在HDFS的根目录下,创建名为hdfstest的目录。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class MakeDir {
    	public static void main(String[] args) throws IOException, URISyntaxException {
    		Configuration conf = new Configuration();
    		String hdfsPath = "hdfs://localhost:9000";
    		FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);
    		String newDir = "/hdfstest";
    		boolean result = hdfs.mkdirs(new Path(newDir));
    		if (result) {
    			System.out.println("Success!");
    		}else {
    			System.out.println("Failed!");
    		}
    	}
    }
    

    新建类TouchFile,程序功能是在HDFS的目录/hdfstest下,创建名为touchfile的文件。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class TouchFile {
    public static void main(String[] args) throws IOException, URISyntaxException {
    	Configuration configuration = new Configuration();
    
    	String hdfsPath = "hdfs://localhost:9000";
    	FileSystem hdfs = FileSystem.get(new URI(hdfsPath), configuration);
    
    	String filePath = "/hdfstest/touchfile";
    
    	FSDataOutputStream create = hdfs.create(new Path(filePath));
    
    	System.out.println("Finish!");
    	}
    }
    

    创建类CopyFromLocalFile.class,程序功能是将本地linux操作系统上的文件/data/hadoop4/sample_data,上传到HDFS文件系统的/hdfstest目录下。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class CopyFromLocalFile {
    public static void main(String[] args) throws IOException, URISyntaxException {
    	Configuration conf = new Configuration();
    	String hdfsPath = "hdfs://localhost:9000";
    	FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);
    	String from_Linux = "/data/hadoop4/sample_data";
    	String to_HDFS = "/hdfstest/";
    	hdfs.copyFromLocalFile(new Path(from_Linux), new Path(to_HDFS));
    	System.out.println("Finish!");
    	}
    }
    

    创建类CopyToLocalFile.class,程序功能是将HDFS文件系统上的文件/hdfstest/sample_data,下载到本地/data/hadoop4/copytolocal 。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class CopyToLocalFile {
    public static void main(String[] args) throws IOException, URISyntaxException {
    	Configuration conf = new Configuration();
    
    	String hdfsPath = "hdfs://localhost:9000";
    	FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);
    
    	String from_HDFS = "/hdfstest/sample_data";
    	String to_Linux = "/data/hadoop4/copytolocal";
    
    	hdfs.copyToLocalFile(false, new Path(from_HDFS), new Path(to_Linux));
    
    	System.out.println("Finish!");
    	}
    }
    

    新建类ListFiles,程序功能是列出HDFS文件系统/hdfstest目录下,所有的文件,以及文件的权限、用户组、所属用户。

    package my.hdfs;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.URI;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class IteratorListFiles {
    public static void main(String[] args) throws IOException {
    	Configuration conf = new Configuration();
    	String hdfspath = "hdfs://localhost:9000/";
    	FileSystem hdfs = FileSystem.get(URI.create(hdfspath), conf);
    	String watchHDFS = "/";
    
    	iteratorListFile(hdfs, new Path(watchHDFS));
    }
    public static void iteratorListFile(FileSystem hdfs, Path path)
    		throws FileNotFoundException, IOException {
    	FileStatus[] files = hdfs.listStatus(path);
    	for (FileStatus file : files) {
    		if (file.isDirectory()) {
    			System.out.println(file.getPermission() + " " + file.getOwner()
    					+ " " + file.getGroup() + " " + file.getPath());
    			iteratorListFile(hdfs, file.getPath());
    		} else if (file.isFile()) {
    			System.out.println(file.getPermission() + " " + file.getOwner()
    					+ " " + file.getGroup() + " " + file.getPath());
    		}
    	}
    }
    

    }

    新建类LocateFile,程序功能是查看HDFS文件系统上,文件/hdfstest/sample_data的文件块信息。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.BlockLocation;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class LocateFile {
    public static void main(String[] args) throws IOException, URISyntaxException {
    	Configuration conf = new Configuration();
    	String hdfsPath = "hdfs://localhost:9000";
    	FileSystem hdfs = FileSystem.get(new URI(hdfsPath), conf);
    
    	Path file = new Path("/hdfstest/sample_data");
    	FileStatus fileStatus = hdfs.getFileStatus(file);
    
    	BlockLocation[] location = hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
    	for (BlockLocation block : location) {
    		String[] hosts = block.getHosts();
    		for (String host : hosts) {
    			System.out.println("block:" +block + " host:"+ host);
    		}
    	}
    }
    

    }

    新建类WriteFile,程序功能是在HDFS上,创建/hdfstest/writefile文件并在文件中写入内容“hello world hello data!”。

    	package my.hdfs;
    	import java.io.IOException;
    	import java.net.URI;
    	import org.apache.hadoop.conf.Configuration;
    	import org.apache.hadoop.fs.FSDataOutputStream;
    	import org.apache.hadoop.fs.FileSystem;
        import org.apache.hadoop.fs.Path;
       public class WriteFile {
    	public static void main(String[] args) throws IOException {
    		Configuration conf = new Configuration();
    
    		String hdfsPath = "hdfs://localhost:9000";
    		FileSystem hdfs = FileSystem.get(URI.create(hdfsPath), conf);
    
    		String filePath = "/hdfstest/writefile";
    
    		FSDataOutputStream create = hdfs.create(new Path(filePath));
    
    		System.out.println("Step 1 Finish!");
    
    		String sayHi = "hello world hello data!";
    		byte[] buff = sayHi.getBytes();
    		create.write(buff, 0, buff.length);
    		create.close();
    		System.out.println("Step 2 Finish!");
    	}
    }
    

    在Eclipse里执行,然后在HDFS上查看实验结果。

    hadoop fs -lsr /hdfstest
    hadoop fs -cat /hdfstest/writefile
    

    首先切换到/data/hadoop4目录下,将该目录下的所有文件删除(此时要求/data/hadoop4中必须全是文件,不能有目录)。

    cd /data/hadoop4
    rm -r /data/hadoop4/*
    

    然后在该目录下新建两文件,分别命名为file1 ,file2。

    touch file1
    touch file2
    

    向file1和file2中,分别输入内容如下

    echo "hello file1" > file1
    echo "hello file2" > file2
    

    在my.hdfs包下,新建类PutMerge,程序功能是将Linux本地文件夹/data/hadoop4/下的所有文件,上传到HDFS上并合并成一个文件/hdfstest/mergefile。

    package my.hdfs;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    public class PutMerge {
    	public static void main(String[] args) throws IOException, URISyntaxException {
    		Configuration conf = new Configuration();
    		String hdfsPath = "hdfs://localhost:9000";
    		FileSystem hdfs  = FileSystem.get(new URI(hdfsPath), conf);
    		FileSystem local = FileSystem.getLocal(conf);
    		String from_LinuxDir = "/data/hadoop4/";
    		String to_HDFS = "/hdfstest/mergefile";
    		FileStatus[] inputFiles = local.listStatus(new Path(from_LinuxDir));
    		FSDataOutputStream out = hdfs.create(new Path(to_HDFS));
    
    		for (FileStatus file : inputFiles) {
    			FSDataInputStream in = local.open(file.getPath());
    			byte[] buffer = new byte[256];
    			int bytesRead = 0;
    			while ( (bytesRead = in.read(buffer) ) > 0) {
    				out.write(buffer, 0, bytesRead);
    			}
    			in.close();
    		}
    		System.out.println("Finish!");
    	}
    }
    
    展开全文
  • Hadoop常用API

    2018-06-04 20:26:16
    Hadoop API 命令 上传文件 hadoop fs -put 文件 hdfs文件夹 hadoop fs -put test.txt /files #将test.txt文件上传到hdfs文件夹files下 删除文件hadoop fs -rm -r 文件/文件夹 hadoop fs -rm -rf /quanfeihu/...

    Hadoop API

    命令

    • 上传文件 hadoop fs -put 文件 hdfs文件夹

      hadoop fs -put test.txt /files     #将test.txt文件上传到hdfs文件夹files下
    • 删除文件hadoop fs -rm -r 文件/文件夹

      hadoop fs -rm -rf /quanfeihu/test.txt
    • 查看文件hadoop fs -ls [-R] 文件夹

      hadoop fs -ls -R /quanfeihu   #递归显示quanfiehu文件夹下的文件
    • 创建文件夹hadoop fs -mkdir [-p] 文件夹

      hadoop fs -mkdir -p /quanfeihu/test/01 #创建文件夹/quanfeihu/test/01
    • 下载文件hadoop fs -get 远程文件 本地文件

      hadoop fs -get /quanfeihu/test.txt c://
    • 复制文件hadoop fs -cp 远程文件 远程文件夹

      hadoop fs -cp /quanfeihu/test.txt /quanfeihu/test/
    • 移动/重命名 hadoop fs -mv 远程文件 远程文件(夹)

      hadoop fs -mv /quanfeihu/test.txt /quanfeihu/test/
    • tail查看文件hadoop fs -tail [-f] 远程文件

      hadoop fs -tail -f /quanfeihu/test.txt
    • 在文件后追加hadoop fs -appendToFile 本地文件 远程文件(将本地文件追加到远程文件下)

      hadoop fs -appendToFile c://test.txt /quanfiehu/test.txt
    • 修改文件组/用户hadoop fs -chown owner:group 文件

      hadoop fs -chown root:root /quanfeihu/test.txt

    java API

    • maven依赖

      <dependency>
         <groupId>org.apache.hadoop</groupId>
         <artifactId>hadoop-client</artifactId>
         <version>2.8.3</version>
      </dependency>
    • 初始化

    //创建客户端对象
    Configuration conf = new Configuration();
    conf.set("dfs.blocksize", "128m");   //设置block大小
    FileSystem fs = FileSystem.get(new URI("hdfs://linux11:9000/"), conf, "root");
    • 创建文件夹

      fs.mkdirs(new Path("/quanfeihu/"));
    • 上传文件

      //将test.txt 上传到hdfs远程/quanfeihu文件夹下
      fs.copyFromLocalFile(new Path("C:\\test.txt"), new Path("/quanfeihu"));
    • 下载文件

      /*将远程文件/quanfeihu/test.txt下载到本地C盘*/
      //使用hadoop本地环境 
      fs.copyToLocalFile(new Path("/quanfeihu/test.txt"), new Path("C:\\"));
      //不适用hadoop本地环境
      fs.copyToLocalFile(false, new Path("/quanfeihu/test.txt"), new Path("C:\\"),true);
    • 移动或者重命名

      fs.rename(new Path("/quanfeihu/test.txt"), new Path("/quanfeihu/test1.txt"));
    • 删除文件/文件夹

      fs.delete(new Path("/quanfiehu"), true);
    • 查看目录信息

      FileSystem fs = FileSystem.get(new URI("hdfs://linux:9000/"), new Configuration(), "root");
      
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
            while (listFiles.hasNext()) {
                LocatedFileStatus nextFile = listFiles.next();
      
                System.out.println("get file path:" + nextFile.getPath().toString());
                System.out.println("get file Permission:" + nextFile.getPermission());
                System.out.println("get file Owner:" + nextFile.getOwner());
                System.out.println("get file Group:" + nextFile.getGroup());
                System.out.println("get file AccessTime:" + nextFile.getAccessTime());
                System.out.println("get file BlockSize:" + nextFile.getBlockSize());
                System.out.println("get file Len:" + nextFile.getLen());
                System.out.println("get file Replication:" + nextFile.getReplication());
      //            System.out.println("get file Replication:" + nextFile.getBlockLocations());
                BlockLocation[] blockLocations = nextFile.getBlockLocations();
                for (BlockLocation b : blockLocations) {
                    System.out.println("blk 的长度:" + b.getLength());
                    System.out.println("blk 的偏移量:" + b.getOffset());
                    for (String host : b.getHosts()) {
                        System.out.println("blk 的主机名:" + host);
      
                    }
      
                }
            }
            fs.close();
    • 判断文件是否存在

      boolean exist = fs.exists(new Path("/quanfeihu/hdfs_my_start.sh"));
    • 写入文件

      FileSystem fs = FileSystem.get(conf);
      FSDataOutputStream out = fs.create(new Path("/2.txt"));
      
      out.write("xuanxuan\n".getBytes());
      
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));
      bufferedWriter.write("测试一下");
      bufferedWriter.newLine();
      
      bufferedWriter.close();
      out.close();
      fs.close();
    • 读取文件流

      FileSystem fs = FileSystem.get(conf);
      FSDataInputStream in = fs.open(new Path("/quanfeihu/hadoop-2.8.3.tar.gz"));
      FileOutputStream out = new FileOutputStream(new File("g://hadoop.tar.gz"));
      in.seek(0); //从文件什么地方开始读(字节)
      byte[] b = new byte[1024];
      int read = -1;
      int count = 0;
      while ((read = in.read(b)) != -1) {
        /*System.out.println(new String(b, 0, read));*/
        out.write(b, 0, read);
      }
      in.close();
      fs.close();
      out.close();
    展开全文
  • hadoop中文版API

    2020-07-02 11:29:32
    hadoop中文版API.chm文件,查找hadoop的类中方法、方法的用法等,方便、好用
  • Hadoop API 使用介绍

    2018-09-30 11:34:28
    转载地址:... Hadoop API被分成(divide into)如下几种主要的包(package) org.apache.hadoop.conf 定义了系统参数的配置文件处理API。 org.apache.hadoop.fs 定义了抽象的文件系统API...

    转载地址:https://blog.csdn.net/wt346326775/article/details/53301117

    Hadoop API被分成(divide into)如下几种主要的包(package)

    org.apache.hadoop.conf     定义了系统参数的配置文件处理API。
    org.apache.hadoop.fs          定义了抽象的文件系统API。
    org.apache.hadoop.io         定义了通用的I/O API,用于针对网络,数据库,文件等数据对象做读写操作。
    org.apache.hadoop.ipc       用于网络服务端和客户端的工具,封装了网络异步I/O的基础模块。
    org.apache.hadoop.mapred         Hadoop分布式计算系统(MapReduce)模块的实现,包括任务的分发调度等。
    org.apache.hadoop.metrics        定义了用于性能统计信息的API,主要用于mapred和dfs模块。
    org.apache.hadoop.record 定义了针对记录的I/O API类以及一个记录描述语言翻译器,用于简化将记录序列化成语言中性的格式(language-neutral manner)。
    org.apache.hadoop.tools    定义了一些通用的工具。
    org.apache.hadoop.util       定义了一些公用的API。

    hadoop中关于文件操作类基本上全部是在"org.apache.hadoop.fs"包中,
     这些API能够支持的操作包含:打开文件,读写文件,删除文件等。
     Hadoop类库中最终面向用户提供的接口类是FileSystem,该类是个抽象类,只能通过来类的get方法得到具体类。
    get方法存在几个重载版本,常用的是这个:static FileSystem get(Configuration conf);

    package hdfstest;
     
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
     
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
     
    public class HdfsTest {
        // 创建新文件
        public static void createFile(String dst, byte[] contents) throws IOException {
            Configuration conf = new Configuration();
    		
            conf.set("fs.defaultFS", "hdfs://192.168.146.128:9000");
    		
            FileSystem fs = FileSystem.get(conf);
            Path dstPath = new Path(dst); // 目标路径
            // 打开一个输出流
            FSDataOutputStream outputStream = fs.create(dstPath);
            outputStream.write(contents);
            outputStream.close();
            fs.close();
            System.out.println("文件创建成功!");
        }
     
        // 上传本地文件
        public static void uploadFile(String src, String dst) throws IOException {
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(conf);
            Path srcPath = new Path(src); // 原路径
            Path dstPath = new Path(dst); // 目标路径
            // 调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默认为false
            fs.copyFromLocalFile(false, srcPath, dstPath);
     
            // 打印文件路径
            System.out.println("Upload to " + conf.get("fs.default.name"));
            System.out.println("------------list files------------" + "\n");
            FileStatus[] fileStatus = fs.listStatus(dstPath);
            for (FileStatus file : fileStatus) {
                System.out.println(file.getPath());
            }
            fs.close();
        }
     
        // 文件重命名
        public static void rename(String oldName, String newName) throws IOException {
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(conf);
            Path oldPath = new Path(oldName);
            Path newPath = new Path(newName);
            boolean isok = fs.rename(oldPath, newPath);
            if (isok) {
                System.out.println("rename ok!");
            } else {
                System.out.println("rename failure");
            }
            fs.close();
        }
     
        // 删除文件
        public static void delete(String filePath) throws IOException {
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(conf);
            Path path = new Path(filePath);
            boolean isok = fs.deleteOnExit(path);
            if (isok) {
                System.out.println("delete ok!");
            } else {
                System.out.println("delete failure");
            }
            fs.close();
        }
     
        // 创建目录
        public static void mkdir(String path) throws IOException {
    	Configuration conf = new Configuration();
    	FileSystem fs = FileSystem.get(conf);
    	Path srcPath = new Path(path);
    	boolean isok = fs.mkdirs(srcPath);
    	if (isok) {
    	    System.out.println("create dir ok!");
    	} else {
    	    System.out.println("create dir failure");
    	}
    	fs.close();
        }
     
        // 读取文件的内容
        public static void readFile(String filePath) throws IOException {
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(conf);
    	Path srcPath = new Path(filePath);
    	InputStream in = null;
    	try {
    	    in = fs.open(srcPath);
                IOUtils.copyBytes(in, System.out, 4096, false); // 复制到标准输出流
    	} finally {
                IOUtils.closeStream(in);
            }
        }
     
        public static void main(String[] args) throws IOException {
            // 测试上传文件
    	uploadFile("D:\\c.txt", "/input");
    	// 测试创建文件
    		
    	byte[] contents = "hello world 世界你好\n".getBytes();
    	createFile("/input/d.txt",contents);
    		 
    	// 测试重命名
    	// rename("/user/hadoop/test/d.txt", "/user/hadoop/test/dd.txt");
    	// 测试删除文件
    	// delete("test/dd.txt"); //使用相对路径
    	// delete("test1"); //删除目录
    	// 测试新建目录
    	// mkdir("test1");
    	// 测试读取文件
    	readFile("/input/d.txt");
        }
     }

    HDFS javaAPI
     
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://h6:9000");
    FileSystem fileSystem = FileSystem.get(conf);
     

    1.创建文件夹
     判断是否存在,不存在再创建。

    if (!fileSystem.exists(new Path("/weir01"))) {
        fileSystem.mkdirs(new Path("/weir01"));
    }

    2.创建文件
    in - InputStream to read from 原文件路径
    out - OutputStream to write to  hdfs 目录
    the size of the buffer  缓冲大小
    close - whether or not close the InputStream and OutputStream at the end. The streams are closed in the finally clause. 是否关闭流

    FSDataOutputStream out = fileSystem.create(new Path("/d1"));
    FileInputStream in = new FileInputStream("f:/hadoop.zip");
    IOUtils.copyBytes(in, out, 1024, true);

    3.上传本地文件
    delSrc - whether to delete the src是否删除源文件
    overwrite - whether to overwrite an existing file是否覆盖已存在的文件
    srcs - array of paths which are source 可以上传多个文件数组方式
    dst – path 目标路径

    fileSystem.copyFromLocalFile(src, dst);
    fileSystem.copyFromLocalFile(delSrc, src, dst);
    fileSystem.copyFromLocalFile(delSrc, overwrite, src, dst);
    fileSystem.copyFromLocalFile(delSrc, overwrite, srcs, dst);

    4 重命名HDFS文件

    fileSystem.rename(src, dst);

    5.删除文件

    # True 表示递归删除
    fileSystem.delete(new Path("/d1"), true);

    6.查看目录及文件信息

    FileStatus[] fs = fileSystem.listStatus(new Path("/"));
    for (FileStatus f : fs) {
        String dir = f.isDirectory() ? "目录":"文件";
        String name = f.getPath().getName();
        String path = f.getPath().toString();
        System.out.println(dir+"----"+name+"  path:"+path);
        System.out.println(f.getAccessTime());
        System.out.println(f.getBlockSize());
        System.out.println(f.getGroup());
        System.out.println(f.getLen());
        System.out.println(f.getModificationTime());
        System.out.println(f.getOwner());
        System.out.println(f.getPermission());
        System.out.println(f.getReplication());
        System.out.println(f.getSymlink());
    }

    7.查找某个文件在HDFS集群的位置

    FileStatus fs = fileSystem.getFileStatus(new Path("/data"));
    BlockLocation[] bls=fileSystem.getFileBlockLocations(fs, 0, fs.getLen());
    for (int i = 0,h=bls.length; i < h; i++) {
        String[] hosts= bls[i].getHosts();
        System.out.println("block_"+i+"_location:  "+hosts[0]);
    }
     

    8.获取HDFS集群上所有节点名称信息

    DistributedFileSystem hdfs = (DistributedFileSystem) fileSystem;
    DatanodeInfo[] dns=hdfs.getDataNodeStats();
    for (int i = 0,h=dns.length; i < h; i++) {
        System.out.println("datanode_"+i+"_name:  "+dns[i].getHostName());
    }

    HDFS写入文件的重要概念

    https://blog.csdn.net/dyllove98/article/details/8592686

    fs.default.name详解

    jsiofdjso

     

    fileSystem.rename(src, dst);
     
    
     
    
     
    
     
    
     
     
    
     
    
     
    
     
     
    
     
     
     
     
    --------------
    http://blog.csdn.net/dyllove98/article/details/8592686
    ---------------core-site.xml  hdfs-site.xml
     
     -----------------------fs.default.name详解--------------------------
     
     -fs.default.name - 这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号),集群里面的每一台机器都需要知道NameNode的地址。
     DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。独立的客户端程序通过这个URI跟DataNode交互,以取得文件的块列表。-->
     <property>
                  <name>fs.default.name</name>
                  <value>hdfs://localhost:9000</value>
            </property>
     
           <!—hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,很多路径都依赖它。如果hdfs-site.xml中不配置namenode和datanode的存放位置,默认就放在这个路径中-->
      <property>
          <name>hadoop.tmp.dir</name>
           <value>/home/hdfs/tmp</value>
       </property>
       
     3.  在conf/hdfs-site.xml中增加如下内容:
           <!-- dfs.replication -它决定着 系统里面的文件块的数据备份个数。对于一个实际的应用,它 应该被设为3
           (这个数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的可靠性(系统故障时,也许会造成数据丢失)-->
         <property>
             <name>dfs.replication</name>
             <value>1</value>
         </property>
     
              <!--  dfs.data.dir - 这是DataNode结点被指定要存储数据的本地文件系统路径。DataNode结点上 的这个路径没有必要完全相同,
              因为每台机器的环境很可能是不一样的。但如果每台机器上的这            个路径都是统一配置的话,会使工作变得简单一些。默认的情况下,
              它的值hadoop.tmp.dir, 这  个路径只能用于测试的目的,因为,它很可能会丢失掉一些数据。所以,这个值最好还是被覆 盖。 
    dfs.name.dir - 这是NameNode结点存储hadoop文件系统信息的本地系统路径。这个值只对NameNode有效,DataNode并不需要使用到它。
    上面对于/temp类型的警告,同样也适用于这里。在实际应用中,它最好被覆盖掉。-->
               <property>
                 <name>dfs.name.dir</name>
                 <value>/home/hdfs/name</value>
            </property>
           <property>
            <name>dfs.data.dir</name>
            <value>/home/hdfs/data</value>
       </property>
     
     
     <!—解决:org.apache.hadoop.security.AccessControlException:Permission    denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 。
    因为Eclipse使用hadoop插件提交作业时,会默认以 DrWho 身份去将作业写入hdfs文件系统中,对应的也就是 HDFS 上的/user/hadoop ,
      由于 DrWho 用户对hadoop目录并没有写入权限,所以导致异常的发生。解决方法为:放开 hadoop 目录的权限,
       命令如下 :$ hadoop fs -chmod 777 /user/hadoop -->
                   <property> 
                       <name>dfs.permissions</name>
                       <value>false</value>
    <description>
                          If "true", enable permission checking in HDFS. If "false", permission checking is turned   off,   
                          but all other behavior is unchanged. Switching from one parameter value to                                
                             the other does   not change the mode, owner or group of files or directories
                  </description>
     
            </property>
     
       4.  在conf/mapred-site.xml中增加如下内容:
    <!-- mapred.job.tracker -JobTracker的主机(或者IP)和端口。-->
          <property>
           <name>mapred.job.tracker</name>
          <value>localhost:9001</value>
    </property>
     
     
     
     -----------------
    展开全文
  • 3.如何查看hadoop API?很多同学开发都没有二手资料,原因很简单觉得不会英语,但是其实作为软件行业,多多少少大家会英语的,但是就是不善长,这是很多人面对的问题。英语的不善长,造成我们获取知识慢,很多问题都...

    问题导读:
    1.如何访问hadoop官网?
    2.如何下载hadoop各个版本?
    3.如何查看hadoop API?





    很多同学开发都没有二手资料,原因很简单觉得不会英语,但是其实作为软件行业,多多少少大家会英语的,但是就是不善长,这是很多人面对的问题。英语的不善长,造成我们获取知识慢,很多问题都需要向别人请教。这里交给大家该如何从我们已有的资源中查找API.
    首先我们登录官网:
    http://hadoop.apache.org/

    一、官网初步介绍


    图1
    上面主要介绍了三个区域:
    (1)文档区是
    这里介绍了HDFS、mapreduce、yarn这些都是第一手资料
    (2)hadoop相关项目
    (3)hadoop下载区

    二、hadoop 2.4.0下载

    1.这里以下载hadoop2.4.0为例子,我们点击图一所示"下载hadoop",进入下面页面

    图2

    2.单击图2,进入下面页面


    图3

    3.同样按照图示继续往下走


    图4

    4.通过上面,进入镜像区,选择其中任意一个镜像


    图5


    5.进入下面,我们就可以下载了

    图6

    6.我们下载到本地,解压。这个就不必说了。可以下载window,也可以下载到Linux。
    我们下载完毕,那么该如何寻找API:
    我们解压之后会有hadoop2.4.0文件夹,我们进入如下路径:
    hadoop2.4.0->share->doc->hadoop->API,然后找到Index.html。我们会看到图8所示。这样我们就找到了相关API。



    图7



    图8

    转于:http://www.aboutyun.com/thread-7648-1-1.html

    展开全文
  • hadoop API之:文件操作

    2017-08-08 14:04:50
    hadoop API之:文件操作@(HADOOP)[hadoop, hadoop2]hadoop API之文件操作 1读取文件 2文件复制 3获取文件属性 4列出某个目录下的文件 5读取sequencefile 6读取HDFS文件 Hadoop提供了大量的API对文件系统中的文件进行...

    hadoop API之:文件操作

    @(HADOOP)[hadoop, hadoop2]

    Hadoop提供了大量的API对文件系统中的文件进行操作,主要包括:

    (1)读取文件

    (2)写文件

    (3)读取文件属性

    (4)列出文件

    (5)删除文件

    完整代码见:https://github.com/lujinhong/lujinhong-commons/tree/master/lujinhong-commons-hadoop/src/main/java/com/lujinhong/commons/hadoop/fs

    1、读取文件

    以下示例中,将hdfs中的一个文件读取出来,并输出到标准输出流中。

    package org.jediael.hadoopdemo.fsdemo;
    
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FSDataInputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    
    public class FileSystemDoubleCat {
    
        public static void main(String[] args) throws IOException {
    
            String fileName = args[0];
            Configuration conf = new Configuration();
    
            FileSystem fs = FileSystem.get(URI.create(fileName), conf);
            FSDataInputStream in = null;
            try {
                in = fs.open(new Path(fileName));
                IOUtils.copyBytes(in, System.out, 4096, false);
                in.seek(0);
                IOUtils.copyBytes(in, System.out, 4096, false);
            } finally {
                in.close();
            }
    
        }
    
    }
    

    (1)其中FSDataInputStream实现了Seekable接口,可以对文件进行随机定位,但注意,seek()的代价较高,如无必要,尽量少使用。

    2、文件复制

    package org.jediael.hadoopdemo.fsdemo;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    
    public class FileCopy {
    
        public static void main(String[] args) throws IOException {
            String sourceFile = args[0];
            String destFile = args[1];
    
            InputStream in = null;
            OutputStream out = null;
            try {
                //1、准备输入流
                in = new BufferedInputStream(new FileInputStream(sourceFile));
                //2、准备输出流
                Configuration conf = new Configuration();
                FileSystem fs = FileSystem.get(URI.create(destFile), conf);
                out = fs.create(new Path(destFile));
                //3、复制
                IOUtils.copyBytes(in, out, 4096, false);
            } finally {
                in.close();
                out.close();
            }
    
        }
    
    }
    

    3、获取文件属性

    文件属性以FileStatus对象进行封装,使用FileSystem对象的getFileStatus()方法,可以获取到文件的FileStatus对象。

    package org.jediael.hadoopdemo.fsdemo;
    
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    
    public class FileStatusDemo {
    
        public static void main(String[] args) throws IOException {
    
            String fileName = args[0];
    
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(fileName), conf);
            //获取FileSystem对象。
            FileStatus status = fs.getFileStatus(new Path(fileName));
            System.out.println(status.getOwner()+" "+status.getModificationTime());
    
    
        }
    
    }
    

    4、列出某个目录下的文件

    使用FileSystem的ListStatus方法,可以获取到某个目录下所有文件的FileStatus对象。

    package org.jediael.hadoopdemo.fsdemo;
    
    import java.io.IOException;
    import java.net.URI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileStatus;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.FileUtil;
    import org.apache.hadoop.fs.Path;
    
    public class ListStatusDemo {
    
        public static void main(String[] args) throws IOException {
    
            String dir = args[0];
    
            Configuration conf = new Configuration();
            FileSystem fs = FileSystem.get(URI.create(dir), conf);
            FileStatus[] stats =  fs.listStatus(new Path(dir));
    
            Path[] paths = FileUtil.stat2Paths(stats);
            for(Path path : paths){
                System.out.println(path);
            }
        }
    
    }
    

    递归列出目录下的所有文件(2.0版本以后适用):

    //递归列出目录中的所有文件。
    public static List<String> getAllHdfsFile(String dir) throws IOException {
        List<String> fileList = new ArrayList<>();
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(dir), conf);
    
        RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(
                new Path(dir), true);
    
        while (iterator.hasNext()) {
            LocatedFileStatus fileStatus = iterator.next();
            fileList.add(fileStatus.getPath().toString());
        }
    

    // for(String file : fileList){
    // LOG.debug(file);
    // }
    return fileList;

    }
    

    5、读取sequencefile

    package com.lujinhong.commons.hadoop.fs;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.SequenceFile;
    import org.apache.hadoop.io.Writable;
    import org.apache.hadoop.util.ReflectionUtils;
    
    import java.io.IOException;
    import java.net.URI;
    
    /**
     * AUTHOR: LUJINHONG
     * CREATED ON: 17/1/11 11:32
     * PROJECT NAME: lujinhong-commons
     * DESCRIPTION:示范如何读取以snappy格式压缩的。虽然没指定压缩格式,但成功解压了。
     */
    public class SequenceSnappyFileReader {
        public static void main(String[] args) throws IOException {
            String uri = args[0];
            Configuration conf = new Configuration();
            Path path = new Path(uri);
            SequenceFile.Reader reader = null;
            try {
                SequenceFile.Reader.Option filePath = SequenceFile.Reader.file(path);
                reader = new SequenceFile.Reader(conf, filePath);
                Writable key = (Writable) ReflectionUtils.newInstance(reader.getKeyClass(), conf);
                Writable value = (Writable) ReflectionUtils.newInstance(reader.getValueClass(), conf);
                //long position = reader.getPosition();
                while (reader.next(key, value)) {
                    //同步记录的边界
                    //String syncSeen = reader.syncSeen() ? "*" : "";
                    //System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key, value);
                    System.out.println( value);
                    //position = reader.getPosition(); // beginning of next record
                }
            } finally {
                IOUtils.closeStream(reader);
            }
        }
    }
    

    6、读取HDFS文件

    public static void main(String[] args) throws IOException {
        String fileName = args[0];
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(fileName), conf);
        FSDataInputStream hdfsInStream = fs.open(new Path(fileName));
    
        String line;
        BufferedReader in =new BufferedReader(new InputStreamReader(hdfsInStream, "UTF-8"));
        while ((line = in.readLine()) != null) {
        }
    }
    
    展开全文
  • http://hadoop.apache.org/docs/ http://hadoop.apache.org/docs/current1/api/ http://hadoop.apache.org/docs/current2/api/  
  • hadoop API

    2018-03-25 11:51:09
    hadoop API hadoop 用户指南
  • 我在用eclipse使用hadoopapi时发现我创建目录时,并没有实质性的报错,但是hdfs就是没创建文件目录 控制台出现提醒 Namenode for mycluster remains unresolved for ID nn2. Check your hdfs-site.xml file to ...
  • hadoop api.doc

    2020-05-22 23:30:48
    hadoop api hadoop apihadoop api hadoop api hadoop api
  • Hadoop API文档地址

    2016-12-10 21:22:34
    经常需要查阅,做一下笔记 http://hadoop.apache.org/docs/ http://hadoop.apache.org/docs/current1/api/ http://hadoop.apache.org/docs/current2/api/
  • Hadoop API

    2017-09-11 14:28:41
    HDFS JAVA APIversion 273HBASE JAVA APIversion 124MAPREDUCE JAVA APIversion 273 HDFS JAVA API(version 2.7.3) HDFS 分布式文件系统JAVA API。与local的java 文件系统的API类似。 Name ...
  • Hadoop API帮助文档

    2020-07-02 23:30:32
    Hadoop API帮助文档,学习Nutch和Hadoop必备
  • Java调用Hadoop API

    2015-07-15 12:20:15
    hadoop提供的Java API主要用来对文件操作。最常见的也就是读、写、遍历。 总的来说,调用API的第一步获取FileSystem,可以用FileSystem fs = FileSystem.get()来获取。接下来如果是写(上传)文件,则用fs.create()...
  • (1)添加必要的hadoop jar包。 A、首先将Hadoop1.1.2.tar.gz解压到某一个磁盘下。 B、右键选择工程,选择build path...., build configure path; C、将hadoop1.1.2文件夹下的jar包添加进去; ...
  • 使用kerberos下安全Hadoop时,通常是在linux系统下使用kinit命令进行身份认证,下面提供一种在java api中认证的方式
  • Hadoop2.7.4 API帮助文档

    2020-07-09 23:31:05
    Hadoop 2.7.4 API 帮助文档 ,这份帮助文档很全,包括了源码等等,你值得拥有。
  • hadoop api

    2018-09-06 14:20:41
    http://hadoop.apache.org/docs/r1.0.4/cn/index.html 集群搭建 http://hadoop.apache.org/docs/r1.0.4/cn/cluster_setup.html map Reduce http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html...
  • 源数据 代码 package com.lgd.hadoop.hdfs; ...import org.apache.hadoop.conf.Configuration;...import org.apache.hadoop.fs.FSDataInputStream;...import org.apache.hadoop.fs....import org.apache.hadoop....
1 2 3 4 5 ... 20
收藏数 84,970
精华内容 33,988