一. hdfs shell命令

可以通过hadoop fs 查看所有的shell命令及其用法。

传文件到hdfs:

hadoop fs -put /home/koushengrui/Downloads/hadoop-2.7.4.tar.gz hdfs://centos1:9000/

注意,代表hdfs文件系统的hdfs://centos1:9000/最后面的斜杠不要漏掉,/代表根目录。

从hdfs下载文件:

hadoop fs -get hdfs://centos1:9000/ /home/koushengrui/Downloads

二. java客户端程序编写
编写hdfs客户端需要引入hadoop-client依赖:

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.4</version>
</dependency>

引入以上依赖后,项目就引入了hadoop-common-2.7.4.jar、hadoop-hdfs-2.7.4.jar。

hdfs客户端代码编写最主要的类是FileSystem抽象类(org.apache.hadoop.fs.FileSystem,在hadoop-common-2.7.4.jar中)及其实现类DistributedFileSystem(org.apache.hadoop.hdfs.DistributedFileSystem,在hadoop-hdfs-2.7.4.jar中)。FileSystem实例就是客户端实例了。具体代码如下:

import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.log4j.Logger;
import org.junit.Test; import java.net.URI;
import java.util.Properties; public class HdfsTest {
private static Logger LOGGER = Logger.getLogger(HdfsTest.class);
private static FileSystem fileSystem; static {
Configuration conf = new Configuration();
conf.addResource("hdfs-site.xml");
if (StringUtils.isBlank(System.getProperty("hadoop.home.dir"))) {
System.setProperty("hadoop.home.dir", "D:/Program Files (x86)/hadoop-common-2.2.0-bin-master/hadoop-common-2.2.0-bin-master");
}
Properties properties = System.getProperties();
LOGGER.info("properties: " + properties);
try {
//指定用户root,否则会报用户权不足异常。如果不指定用户为root的话,则需在hadoop服务端的hdfs-site.xml配置文件中添加dfs.permissions.enabled配置项,值为false
fileSystem = FileSystem.get(new URI("hdfs://192.168.100.100:9000"), conf, "root");
} catch (Exception e) {
LOGGER.error("", e);
} } @Test
public void upload() {
Path src = new Path("d:/success.jpg");
Path dst = new Path("/upload/img/1.jpg");
try {
fileSystem.copyFromLocalFile(src, dst);
} catch (Exception e) {
LOGGER.error("", e);
}
} @Test
public void download() {
Path src = new Path("/upload/img/1.jpg");
Path dst = new Path("d:/downloadFromHDFS/success.jpg");
try {
fileSystem.copyToLocalFile(src, dst);
} catch (Exception e) {
LOGGER.error("", e);
}
} @Test
//创建文件夹,可递归创建
public void mkdirs() {
Path path = new Path("/upload/music/");
try {
fileSystem.mkdirs(path);
} catch (Exception e) {
LOGGER.error("", e);
}
} @Test
//删除文件或者文件夹
public void remove() {
Path path = new Path("/hadoop-2.7.4.tar.gz");
try {
fileSystem.delete(path, true);
} catch (Exception e) {
LOGGER.error("", e);
}
} @Test
//获取某路径下的所有文件信息(不包括文件夹,可指定是否包含子文件夹内的文件)
public void listFiles() {
Path path = new Path("/upload/");
try {
RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(path, true);
while (iterator.hasNext()) {
LocatedFileStatus locatedFileStatus = iterator.next();
LOGGER.info(locatedFileStatus);
}
} catch (Exception e) {
LOGGER.error("", e);
}
} @Test
//获取某路径下的所有文件及文件夹信息(不包含子文件夹)
public void listStatus() {
Path path = new Path("/upload/");
try {
FileStatus[] FileStatusArr = fileSystem.listStatus(path);
for (FileStatus status : FileStatusArr) {
LOGGER.info(status);
}
} catch (Exception e) {
LOGGER.error("", e);
}
}
}

需要说明的几点:

1. 通过FileSystem的静态方法get()来获取FileSystem实例,get()方法有3个重载:

① public static FileSystem get(final URI uri, final Configuration conf, final String user) throws Exception

有时候必须用这个方法创建FileSystem实例,因为假如hadoop服务端 dfs.permissions.enabled 配置项保持默认值true不变的话,对hadoop的操作(上传/下载/删除文件、文件夹等等)都必须用与hadoop服务端相同的用户(假如使用koushr身份下载、解压、修改配置文件、运行的hadoop服务端,那么这个用户就是koushr),否则会报错误。这显然是不可能的。从程序开发角度来说,团队开发的情况下,不可能要求所有人都把自己的主机名改成一个相同的名字;从程序运行角度来讲,也不可能把所有运行此应用的服务器的主机名都改为同一个相同的名字。解决办法有3个,第一种方法就是在每台hadoop服务器上,在hdfs-site.xml文件中修改dfs.permissions.enabled配置项的值为false,第二种方法就是在代码中显示指定user的值是koushr,第三种方法就是把要操作的hdfs目录设置为所有用户都有权限操作,具体就是对要操作的目录执行hadoop fs -chown 777,例如hadoop fs -chown 777 /upload/。

还有一点,此时不用在配置文件中添加fs.defaultFS配置项(如果配置文件就只需要这一个配置项,那么连这个配置文件都不需要了)。

② public static FileSystem get(URI uri, Configuration conf) throws Exception

这个方法仅适用于不用考虑用户权限的情况下(hadoop服务端 dfs.permissions.enabled 值为false),而且也不需要在配置文件中添加fs.defaultFS配置项

③ public static FileSystem get(Configuration conf) throws Exception

这个方法也是仅适用于不用考虑用户权限的情况下,而且必须显式的在配置文件中配置fs.defaultFS的值为hdfs://centos1:9000或者调用Configuration对象的set(String name, String value)方法设置fs.defaultFS。

fs.defaultFS配置项一般放在core-site.xml文件中,在classpath下添加此文件即可。

往hdfs上传文件时可能需要用dfs.replication配置项显式的指定副本数(默认为3个副本),这个配置项一般放在hdfs-site.xml文件中,如果需要显式指定副本数的话,在classpath下添加此文件即可。

如果配置文件命名不是core-site.xml、hdfs-site.xml的话,需要调用Configuration对象的addResource(String path)方法添加配置文件。

2.在windows环境下运行上面代码的话,需要从https://github.com/srccodes/hadoop-common-2.2.0-bin下载hadoop-common-2.2.0-bin-master.zip文件,解压缩,配置HADOOP_HOME环境变量,值是该文件夹的路径,比如说D:\Program Files (x86)\hadoop-common-2.2.0-bin-master,实际起作用的是其bin子目录中的winutils.exe文件(把bin文件夹中的其他文件删除亦可),然后在path值中添加HADOOP_HOME\bin。

如果不想配置环境变量的话,也可以在代码中设置系统变量 System.setProperty("hadoop.home.dir", "D:/Program Files (x86)/hadoop-common-2.2.0-bin-master");

3.FileSystem常用的方法

上传文件 copyFromLocalFile(Path src, Path dst);

下载文件 copyToLocalFile(Path src, Path dst);

删除文件/文件夹 delete(Path f, boolean recursive);

递归创建文件夹 mkdirs(Path f);

hdfs shell命令及java客户端编写的更多相关文章

  1. 一次失败的尝试hdfs的java客户端编写(在linux下使用eclipse)

    一次失败的尝试hdfs的java客户端编写(在linux下使用eclipse) 给centOS安装图形界面 GNOME桌面环境 https://blog.csdn.net/wh211212/artic ...

  2. 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结

    HDFS的JAVA客户端编写  现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...

  3. HDFS的Java客户端编写

    总结: 之前在教材上看hdfs的Java客户端编写,只有关键代码,呵呵…….闲话不说,上正文. 1. Hadoop 的Java客户端编写建议在linux系统上开发 2. 可以使用eclipse,ide ...

  4. HDFS - Shell命令

    HDFS - Shell命令 最近学习比较忙,本来想做一个搭建集群笔记,今天先记录HDFS-shell命令,明天,最迟明天下午我一定会做一个搭建集群的笔记.. 介绍一个我的集群搭建:一主三从 3个虚拟 ...

  5. HDFS shell命令行常见操作

    hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...

  6. hadoop系列二:HDFS文件系统的命令及JAVA客户端API

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  7. HDFS Shell命令操作与java代码操作

    (一)编程实现以下功能,并利用 Hadoop 提供的 Shell 命令完成相同任务: (1)     向 HDFS 中上传任意文本文件,如果指定的文件在 HDFS 中已经存在,则由用户来指定是追加到原 ...

  8. Hadoop学习记录(2)|HDFS shell命令|体系结构

    HDFS的shell 调用文件系统(FS)shell命令使用hadoop fs的形式 所有的FS shell命令使用URI路径作为参数. URI格式是scheme://authority/path.H ...

  9. memcached学习——常用命令+基于java客户端的3种简单实现(二)

    常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...

随机推荐

  1. conda 添加bioconda源,创建/删除/重命名环境

    1.conda安装 在https://repo.continuum.io/miniconda/选择conda版本 wget "https://repo.continuum.io/archiv ...

  2. GCD 学习(二)dispatch_queue_create创建Dispatch Queue

    摘录于: http://zhuyanfeng.com/archives/3042 dispatch_queue_create 用于创建用户线程队列.可以创建Serial/Concurrent Disp ...

  3. C++笔记--抽象机制

    类 一个类就是一个用户定义类型 一个结构体也是一种类.(成员函数),因为不同的结构体中可能会有相同的名字的成员函数,所以我们在定义成员函数的时候就必须给出有关结构体的名字 void Data::ini ...

  4. autoconf手册(一)

    Autoconf Creating Automatic Configuration Scripts Edition 2.13, for Autoconf version 2.13 December 1 ...

  5. ElasticSearch安装拼音插件(pinyin)

    环境介绍 集群环境如下: Ubuntu14.04 ElasticSearch 2.3.1(3节点) JDK1.8.0_60 开发环境: Windows10 JDK 1.8.0_66 Maven 3.3 ...

  6. 【Java学习】Java迭代器

    迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator ...

  7. 探讨js闭包

    背景:爱就要大胆说出来,对于编程我只想说,喜欢就大胆写出来.喜欢却不行动那就意味着失败.所以,对于在研究编程的猿们,我对同伴们说,大胆的学,大胆的写.呵呵,说这些其实无非是给我自己点动力,写下去的勇气 ...

  8. MVC之htmlhelper总结

    自学习mvc以来,htmlhelper使用的也非常多,下面开始总结一下吧,由于本人比较懒,内容大部分摘自slark.net的笔记, 有人问为什么用这个htmlhelper,我就喜欢用原生的标签,这个按 ...

  9. Input is not proper UTF-8, indicate encoding !错误处理

    xml 中如果包含部分 ascii 控制字符(小数字)则 chrome会报告如下类型错我: This page contains the following errors: error on line ...

  10. c#线程-线程同步

    线程同步 上一篇介绍了如何开启线程,线程间相互传递参数,及线程中本地变量和全局共享变量区别. 本篇主要说明线程同步. 如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏.如果 ...