一. 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. linux kernel module

    #include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h> static i ...

  2. [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp

    题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...

  3. BAPI_GOODSMVT_CREATE 移动类型201 CODE = '03' 代码

    DATA: MAT_DOC LIKE BAPI2017_GM_HEAD_RET-MAT_DOC.      "物料凭证编号   DATA: GMHEAD LIKE BAPI2017_GM_H ...

  4. Linux 文件服务---------- nfs Server

    Linux 文件服务nfs (Network file system)#网络文件系统 ---> 远程文件调用samba #文件共享(unix /linux /windows ) ,只能适用于局域 ...

  5. linux基础概念

    linux的哲学思想 一切皆文件:把几乎所有资源,包括硬件设备都组织为文件格式 由众多单一目的小程序组成:一个程序只实现一个功能,通过组合小程序完成复杂任务 尽量避免跟用户交互:实现脚本编程,以自动完 ...

  6. Webstrom 连接svn报错怎么解决

    Subversion: (Accessing URL:  https://192.168.1.249:8443/svn/H5/seif ) Received fatal alert: handshak ...

  7. yield 学习笔记

    第三部分(先看) 先讲 iterator 和 iterable 可迭代对象 (Iterable) 是实现了__iter__()方法的对象, 通过调用iter()方法可以获得一个迭代器 (Iterato ...

  8. 《JavaScript高级程序设计》读书笔记 ---Object 类型

    引用类型的值(对象)是引用类型的一个实例.在ECMAScript 中,引用类型是一种数据结构,用于将数据和功能组织在一起.它也常被称为类,但这种称呼并不妥当.尽管ECMAScript从技术上讲是一门面 ...

  9. DHCP底层参考

    [原创翻译,水平有限] ISC DHCP支持802.1的以太网帧,令牌环和FDDI等网络.为了桥接物理层和DHCP层,它还必须实现IP和UDP协议帧. 这源于UNIX BSD socket 对未配置接 ...

  10. Android Paint Xfermode 学习小结

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的"过渡 ...