一. 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);

一些常用数据库操作在mysql及sql server中实现方式的差异的更多相关文章

  1. 对于Oracle、mysql和sql server中的部分不同理解

    1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit:(提到commit不要忘了rollback哦,回滚)2.但是在oracle中必须自己commit: ...

  2. mysql,oracle,sql server中的默认事务隔离级别查看,更改

    未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据) 已提交读(数据库引擎的默认级别) 可重复读 可序列化(隔离事务的最高级别,事务之间完全隔离) 可串行化比较严谨,级别高; MySQL m ...

  3. 数据库中聚合索引(MySQL和SQL Server区别)

    一.聚集索引和非聚集索引 聚集索引:类似字典的拼音目录.表中的数据按照聚集索引的规则来存储的.就像新华字典.整本字典是按照A-Z的顺序来排列.这也是一个表只能有一个聚集索引的原因.因为这个特点,具体索 ...

  4. EF ( Entity Framework) 操作ArcCataLog 生成的(Sql Server)空间数据库

    因为项目需求,现在需要利用EF 操作由Arccatalog生成的sql server空间数据库..在此之前,一直没有接触过空间数据库,在操作空间数据库时 绕了许多弯... 因此写一篇随笔做一个总结. ...

  5. SQL Server 中截取字符串常用的函数

    SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...

  6. 理解SQL Server中的权限体系(上)----主体

    原文:http://www.cnblogs.com/CareySon/archive/2012/04/10/mssql-security-principal.html 简介 权限两个字,一个权力,一个 ...

  7. sql server中的日期详解使用(convert)

    转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...

  8. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  9. 到T-SQL DML 三级的阶梯:在SQL server中实现关系模型

    作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻译:谢雪妮,许雅莉,赖慧芳,刘琼滨 译文: 系列 该文章是阶梯系列的一部分:T-SQL DML的 ...

随机推荐

  1. matlab,xls转换为mat文件

    b=xlsread('iris_data.xls');save iris_data.mat b

  2. 10、 iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile

    Apple官方的文档为生成一个UIImage对象提供了两种方法: 1. imageNamed,其参数为图片的名字: 2. imageWithContentsOfFile,其参数是图片文件的路径. 两种 ...

  3. 一个IT人士的个人经历,给迷失方向的朋友(转)

    作者: 果子狸  来源: WP开发者社区  发布时间: 2013-11-08 10:43  阅读: 50078 次  推荐: 494   原文链接   [收藏] 这些日子我一直在写一个实时操作系统内核 ...

  4. JavaScript Date对象更进一步

    总结分享这个近期开发解决的一个Bug. Javascript的Date对象具有容错性,会自动根据当年的日期根据设置的属性值转换,也就是说Date对象的setDate会影响setMonth,month会 ...

  5. 如何修改tomcat后台console标题(转)

    一个机器启动多个tomcat之后,分不清楚项目之间的区别,通过console口设置一下标题 tomcat控制台改名,修改方法:   1.找到tomcat\bin\catalina.bat   2.找到 ...

  6. sybase 修改用户密码

    命令行输入 isql -Usa -P123456 将sa口令设置为NULL(当前口令为"123456"):  sp_password '123456',NULL,sa

  7. Hibernate5--课程笔记1

    Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...

  8. javascript DOM对象(2)

    访问兄弟节点 1. nextSibling 属性可返回某个节点之后紧跟的节点(处于同一树层级中). 语法: nodeObject.nextSibling 说明:如果无此节点,则该属性返回 null. ...

  9. Git回退到服务器某个版本正确姿势

    背景: Git协作中,成员不可避免地会提交一些错误的版本,由于Git相比SVN引入了本地仓库,操作会相对复杂,以下为姿势分解 找一个源文件RspUtils.java,加上一行注释 //测试回退git服 ...

  10. 第八十一节,CSS3变形效果

    CSS3变形效果 学习要点: 1.transform 2.transform-origin 3.浏览器版本 本章主要探讨HTML5中CSS3的变形效果,通过变形效果,可以平移.缩放和旋转元素的功能.  ...