hdfs shell命令及java客户端编写
一. 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客户端编写的更多相关文章
- 一次失败的尝试hdfs的java客户端编写(在linux下使用eclipse)
一次失败的尝试hdfs的java客户端编写(在linux下使用eclipse) 给centOS安装图形界面 GNOME桌面环境 https://blog.csdn.net/wh211212/artic ...
- 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结
HDFS的JAVA客户端编写 现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...
- HDFS的Java客户端编写
总结: 之前在教材上看hdfs的Java客户端编写,只有关键代码,呵呵…….闲话不说,上正文. 1. Hadoop 的Java客户端编写建议在linux系统上开发 2. 可以使用eclipse,ide ...
- HDFS - Shell命令
HDFS - Shell命令 最近学习比较忙,本来想做一个搭建集群笔记,今天先记录HDFS-shell命令,明天,最迟明天下午我一定会做一个搭建集群的笔记.. 介绍一个我的集群搭建:一主三从 3个虚拟 ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...
- hadoop系列二:HDFS文件系统的命令及JAVA客户端API
转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...
- HDFS Shell命令操作与java代码操作
(一)编程实现以下功能,并利用 Hadoop 提供的 Shell 命令完成相同任务: (1) 向 HDFS 中上传任意文本文件,如果指定的文件在 HDFS 中已经存在,则由用户来指定是追加到原 ...
- Hadoop学习记录(2)|HDFS shell命令|体系结构
HDFS的shell 调用文件系统(FS)shell命令使用hadoop fs的形式 所有的FS shell命令使用URI路径作为参数. URI格式是scheme://authority/path.H ...
- memcached学习——常用命令+基于java客户端的3种简单实现(二)
常用命令: memcached设计的原则就是简单,所以支持的命令也不是特别多~ 1.查看memcached的状态,主要用于分析内存的使用状况.优化内存分配等 stats 查看memcached的运行状 ...
随机推荐
- JavaPersistenceWithHibernate第二版笔记-第七章-002Mapping an identifier bag(@CollectionId、@ElementCollection、@CollectionTable、@Type)
一.结构 A bag is an unordered collection that allows duplicate elements, like the java.util.Collection ...
- 第二周个人作业:WordCount
github地址 https://github.com/lzwk/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 40 · ...
- C++11新标准:decltype关键字
一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型 ...
- DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版
关于 DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- 动态合并或定制GridView控件Header头某些列
开发时,有时会对GridView控件头做一些字段合并.多行表头,多列合并,明白了其中的原理,实现起来,均能运用自如.下面Insus.NET分享自己的做法. 创建站点,创建aspx网页,拉GridVie ...
- IDEA使用maven创建SSM及其依赖的导入
$.说明: 1.IDEA创建maven SSM web项目 2.导入依赖 一.IDEA创建maven SSM项目 对于初入IDEA的人来说此篇博客适用于不会创建maven 项目的人 首先下载IDEA ...
- duddo在xml里面出现红叉的解决方法
原因是没有加入dubbo.xsd window-Preferences-输入xml-xmltacalog....... 配置离线约束:http://code.alibabatech.com/schem ...
- JavaScript(3)——Object-Oriented Design
自己定义函数 var Winston = function(nickname, age, x, y) { this.nickname = nickname; this.age = age + &quo ...
- AI进阶之路
一.方法论 二.发展趋势 三.入门查看 1. https://hongyuxie.github.io/MyResume_CN/ 上班后大家还刷算法题吗 编程面试的 10 大算法概念汇总 技术面试宝典: ...
- python的发音
我一直读的是:拍方(可能是受有道词典发音的影响了~),可是别人都听不懂,他们大多是读的拍森. 来看看下面这个小伙伴的解释,感觉他说的挺好: “θ”这个字符的发音,有 80% 的中国人(学英文的人)都读 ...