HDFS实战 北京信息职业技术学院 | 朱立
目录 Hadoop 运行模式 HDFS命令行工具 HDFS安全模式 启动、停止HDFS服务 如何查看HDFS日志 如何查看HDFS Web控制台 HDFS参数配置
Hadoop运行模式 单机 伪分布式 集群环境 在一个Java进程内模拟Hadoop的各个角色
HDFS 开发基本步骤 实例化Configuration 实例化FileSystem 文件或目录操作 根据配置文件选择使用本地或分布式文件系统 文件或目录操作 Stream
打开文件 FSDataInputStream open(Path f) FSDataInputStream open(Path f, int bufferSize) 返回输入流 如果文件不存在会抛出异常 不指定bufferSize时,会从Configuration中读取io.file.buffer.size,默认为4096字节
文件追加 FSDataOutputStream append(Path f) FSDataOutputStream append(Path f, int bufferSize) 块不足64M时,会补足到64M 块达到64M之前,该块不可见,ls看不到该块新增的大小,也无法读取 不能同时多个writer追加同一个文件
从本地拷贝文件到HDFS void copyFromLocalFile (Path src, Path dst) 目标文件存在,直接覆盖 void copyFromLocalFile (boolean delsrc, Path src, Path dst) 根据参数delsrc,如果是true,拷贝完成之后直接删除源文件 void copyFromLocalFile (boolean delsrc, boolean overwrite, Path src, Path dst) Path[] srcs, Path dst) 参数srcs指定多个本地文件或文件夹 参数dst指定HDFS文件夹 void moveFromLocalFile (Path src, Path dst) void moveFromLocalFile (Path[] srcs, Path dst)
从HDFS拷贝文件到本地 void copyToLocalFile (Path src, Path dst) void copyToLocalFile (boolean delsrc, Path src, Path dst) void moveToLocalFile (Path src, Path dst) 没有多文件拷贝函数 会覆盖已存在的本地文件dst
创建目录 目录权限的含义 boolean mkdirs (Path f) boolean mkdirs (Path f, FsPermission permission) static boolean mkdirs (FileSystem fs, Path dir, FsPermission permission) 支持多级目录同时创建 (类似mkdir -p) 默认权限是755 成功返回true 目录权限的含义 r + x : 获取文件列表 w : 创建(删除)文件/子目录
删除及重命名 boolean delete (Path f, boolean recursive) 删除文件或目录 如果f是目录,则参数recursive指定是否要递归删除 recursive是false, 并且f不为空,会抛出异常 删除成功返回true f不存在时,会返回false boolean deleteOnExit (f) 当关闭FileSystem时,才会删除 如f是目录,则递归删除子目录和文件
获取文件或目录信息 FileStatus[ ] listStatus (Path f) FileStatus[ ] listStatus (Path[ ] dirs) FileStatus[ ] listStatus (Path f, PathFilter filter) FileStatus[ ] listStatus (Path[ ] dir, PathFilter filter) 列出文件或目录的信息 参数dir指定要查询的多个目录 参数filter指定需要过滤规则 PathFilter是一个接口,需要实现boolean accept(Path path)方法,返回false,在返回结果中会过滤掉 只返回列出指定目录下的文件或目录信息
获取文件或目录信息 FileStatus信息包括: 绝对路径 文件大小(单位:字节) 文件访问时间 块大小、复制份数 文件所属用户、组、访问权限
设置文件或目录属性 void setOwner (Path p, String username, String groupname) 设置文件或目录所属用户及组 参数p指定文件或目录 参数username,设置此文件或目录的所属用户 只返回列出指定目录下的文件或目录信息 void setPermission (Path p, FsPermission permission) 设置文件或目录权限 参数permission,指定权限,权限同linux权限雷同
设置文件或目录属性 void setReplication (Path f, short replication) 设置文件复制份数 参数f指定文件 参数replication指定复制份数 void setTimes (Path f, long mtime, long atime) 设置文件的修改及访问时间 参数mtime,修改时间 参数atime,访问时间
HDFS输入流 包 继承 java.io.DataInputStream 构造方法 org.apache.hadoop.fs public FSDataInputStream(InputStream in) 输入流对象实例化 in参数,输入流的来源 一般输入流对象,通过FileSystem.open方法获得
HDFS输出流 java.io.DataOutputStream 包 继承 构造方法 org.apache.hadoop.fs public FSDataOutputStream(OutputStream out,FileSystem.Statistics stats) public FSDataOutputStream(OutputStream out,FileSystem.Statistics stats, long startPosition) 输出流对象实例化 out参数,输出流 stats参数是对输出流的相关的计数,如bytes read, bytes written stats是FileSystem.Statistics对象
IOUtils 构造方法 包 构造方法 I/O帮助类,提供的都是静态方法,不需要实例化 org.apache.hadoop.fs public IOUtils() I/O帮助类,提供的都是静态方法,不需要实例化
IOUtils 拷贝流方法 public static void copyBytes (InputStream in , outputStream out, Configuration conf) public static void copyBytes (InputStream in , outputStream out, Configuration conf, boolean close) 从输入流拷贝到输出流 参数in输入流实例 参数out输出流实例 参数conf,通过io.file.buffer.size获取缓存大小 没有设置io.file.buffer.size,缓存默认为4096bytes 参数close指定是否需要拷贝完成后,由此方法关闭输入输出流
IOUtils 拷贝流方法 public static void copyBytes (InputStream in , outputStream out, int buffSize) public static void copyBytes (InputStream in , outputStream out, int buffSize, boolean close) public static void copyBytes (InputStream in , outputStream out, int length, int buffSize, boolean close) 从输入流拷贝制定字节大小到输出流 参数in输入流实例 参数out输出流实例 参数length指定要拷贝的字节大小 参数buffSize指定输入输出缓冲 参数close指定是否需要拷贝完成后,由此方法关闭输入输出流
WebHDFS RESTful API 简介 使用标准的HTTP协议来完成逻辑操作 无状态,即在服务器端不保留任何操作和事务的状态 客户端与服务器端的数据交换,一般采用JSON, XML HDFS的RESTful API支持完整的文件系统接口 配置RESTful 在hdfs-site.xml中置dfs.webhdfs.enabled为true
WebHDFS RESTful API 示例 $ curl -i "http://localhost:50070/webhdfs/v1/user/hadoop/conf?op=LISTSTATUS" HTTP/1.1 200 OK Content-Type: application/json Content-Length: 3538 Server: Jetty(6.1.26) { "FileStatuses":{ "FileStatus":[ {"accessTime":1338272558964, "blockSize":67108864, "group":"supergroup", "length":7457, "modificationTime":1338272558964, "owner":"training", "pathSuffix":"capacity-scheduler.xml", "permission":"644", "replication":3, "type":"FILE”}] } 例:查看目录下的文件
致谢 东方瑞通(北京)咨询服务有限公司 http://www.easthome.com