一. 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. 洛谷-均分纸牌-NOIP2002提高组复赛

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...

  2. web端和手机端测试有什么不同

    面试中经常被问到web端测试和手机端测试有什么相同点和区别呢?现在总结一下这个问题,如有不对敬请指正 web端和手机端测试有什么区别 1.相同点 不管是web测试还是手机App测试,都离不开测试的相关 ...

  3. Spring Boot--war发布

    启动main类继承SpringBootServletInitializer,并重写"protected SpringApplicationBuilder configure(SpringAp ...

  4. linux系统被入侵后处理经历【转】

    背景 操作系统:Ubuntu12.04_x64 运行业务:公司业务系统,爬虫程序,数据队列. 服务器托管在外地机房. 突然,频繁收到一组服务器ping监控不可达邮件,赶紧登陆zabbix监控系统查看流 ...

  5. jQuery(5)——动画

    jQuery中的动画 [show()方法和hide()方法] 在HTML文档中,为一个元素调用hide()方法,会将该元素的display样式改为“none”,show()方法将元素的display样 ...

  6. java之String类型

    一:定义 String是复杂类型,是特殊的复杂类型. 二:创建 两种创建形式: String s = "abc"; String s = new String("abc& ...

  7. .net webapi项目中支持session

    webapi中默认是不支持session的开启的 需要在Global.asax文件中,添加如下代码 public override void Init() { this.PostAuthenticat ...

  8. mac搭建cordova的android环境

    搭建步骤: 1,下载cordova-android解压到自己目录 2,安装node.js:下载地址:http://nodejs.org/,解压按步骤安装即可,检测在终端输入:#npm 3,安装dos2 ...

  9. CentOS6.2编译gcc失败,kernel-headers错误

    准备转移到阿里云服务器,用的CentOS6.2 x64,虚拟机上用的 6.3版本,测试重装了好几次都没问题了,结果在云服务器上刚开始就出问题了... yum 安装的时候居然出错了,靠...网上 goo ...

  10. ACdream 1069 无耻的出题人

    题目翻译完了是每一位之和是多少. #pragma comment(lnker, "/STACK:1024000000,1024000000") #include<cstdio ...