熟练掌握HDFS的Shell访问和JavaAPI访问

HDFS设计的主要目的是对海量数据进行处理,也就是说在其上能够储存很大量文件(可以储存TB级的文件)。HDFS将这些文件分割之后,储存在不同的DataNode上,HDFS提供了两种数据访问接口:Shell接口和javaAPI接口,对HDFS里面的文件进行操作。

Shell接口

    HDFS处理文件的命令和linux命令基本相同,这里区分大小写。下面介绍HDFS操作分布式文件系统的命令。

HDFS基本命令

hadoop fs -cmd  其中cmd:具体的操作,基本上与unix的命令相同

   args:参数

   HDFS资源URI格式

scheme://authority/path  其中scheme:协议名,file或hdfs

authority:namenode主机名

    path:路径   示例:hdfs://qq58053439:9000/middle/test.txt

     假设已经在core-site.xml里配置了fs.default.name=hdfs://xuweiwei:9000,则仅使用/middle/test.txt即可。

    shell操作单个HDFS集群

   1、创建文件夹

    HDFS上的文件目录结构类似Linux,根目录使用"/"表示。下面的命令将在/middle目录下建立目录weibo

    [[email protected] hadoop]$hadoop fs -mkdir /middle/weibo

     2、上传到weibo.txt到weibo目录下

[[email protected] hadoop]$hadoop fs -put weibo.txt /middle/weibo

    还可以使用-copyFromLocal参数

    [[email protected] hadoop]$hadoop fs -copyFromLocal weibo.txt /middle/weibo

    3、查看weibo.txt文件内容

[[email protected] hadoop]$hadoop fs -text /middle/weibo/weibo.txt

    还可以用-cat、-tail参数查看文件的内容。但是对于压缩的结果文件只能用-text参数来查看,否则还是乱码。

     [[email protected] hadoop]$hadoop fs -cat /middle/weibo/weibo.txt

     [[email protected] hadoop]$hadoop fs -tail /middle/weibo/weibo.txt

    4、把weibo.txt文件复制到本地

     [[email protected] hadoop]$hadoop fs -get /middle/weibo/weibo.txt

    还可以用-copyToLocal参数

     [[email protected] hadoop]$hadoop fs -copyToLocal /middle/weibo/weibo.txt

    5、删除weibo.txt文件

    [[email protected] hadoop]$hadoop fs -rm /middle/weibo/weibo.txt

    删除/middle/weibo文件夹

    [[email protected] hadoop]$hadoop fs -rmr /middle/weibo

   6、显示/middle目录下的文件

    [[email protected] hadoop]$hadoop fs -ls /middle

    两个集群运行相同的版本的Hadoop

      两个HDFS集群之间传输数据,默认情况下distcp会跳过目标路径下已经存在的文件

    [[email protected] hadoop]$hadoop distcp hdfs://qq58053439:9000/weather   hdfs://qq:9000/middle

    这条指令把第一个集群/weather目录及内容复制到第二个集群的/middle目录下,所以第二个集群最后的目录结构为/middle/weather。如果/middle不存在,则新建一个。也可以指定多个源路径,并把所有路径复制到目标路径下。这里的源路径必须是绝对路径。

    两个HDFS集群之间传输数据,覆盖现有的文件使用overwrite。

    [[email protected] hadoop]$hadoop distcp -overwrite hdfs://qq58053439:9000 hdfs://xu:9000/middle

    两个HDFS集群之间传输数据,更新有改动过的文件使用update

    [[email protected] hadoop]$hadoop distcp update hdfs://qq58053439:9000/weather hdfs://xu:58053439/middle

    两个集群不同版本的Hadoop

    不同版本Hadoop集群的RPC是不兼容的,使用distcp复制数据并使用hdfs协议,会导致复制作业失败。要想弥补这种情况,可以使用基于只读HTTP协议的HFTP文件系统并从源文件系统中读取数据。这个作业必须运行在目标集群上,进而实现hdfs RPC版本的兼容。

    还以两个HDFS集群之间传输数据为例

    [[email protected] hadoop]$ hadoop distcp hftp://xu:9000/weather hdfs://xu2:9000/middle

      注意,这里需要在 URI 源中指定 namenode 的 Web 端口。这是由 dfs.http.address 属性决定的,其默认值为 50070。如果使用新出的 webhdfs 协议(替代 hftp)后,对源集群和目标集群均可以使用 HTTP 协议进行通信,且不会造成任何不兼容的问题。

    [[email protected] hadoop]$ hadoop distcp webhdfs://xu:9000/weather webhdfs://xu2:9000/middle

    Hadoop 管理员其他常见shell操作

    1、查看正在运行的 Job。[[email protected] ]$ hadoop job -list

    2、关闭正在运行的 Job。[[email protected] hadoop]$ hadoop job -kill job_1432108212572_0001

    3、检查HDFS块状态,查看是否损坏[[email protected] hadoop-2.2.0-x64]$ hadoop fsck /

    4、检查HDFS快状态,并删除损坏的块[[email protected] hadoop-2.2.0-x64]$ hadoop fsck / -delete

      5、检查HDFS状态,包括DataNode信息[[email protected] hadoop-2.2.0-x64]$ hadoop dfsadmin -report

    6、Hadoop进入安全模式。[[email protected] hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode enter

    7、Hadoop离开安全模式。[[email protected] hadoop-2.2.0-x64]$ hadoop dfsadmin -safemode leave

    8、平衡集群中的文件。[[email protected] hadoop-2.2.0-x64]$ sbin/start-balancer.sh

    Java API接口

    HDFS提供了JavaApI接口对HDFS进行操作。如果以下程序在Hadoop集群上运行,Path中可以写相对路径,比如"/middle/weibo";如果以下程序在本地Eclipse上面测试,Path中的路径需要写为绝对路径,比如"hdfs://xu:9000/middle/weibo"。

    1、获取 HDFS 文件系统

//获取文件系统
public static FileSystem getFileSystem() throws IOException {

//读取配置文件
Configuration conf = new Configuration();

//返回默认文件系统 如果在 Hadoop集群下运行,使用此种方法可直接获取默认文件系统
//FileSystem fs = FileSystem.get(conf);

//指定的文件系统地址
URI uri = new URI("hdfs://cloud004:9000");
//返回指定的文件系统 如果在本地测试,需要使用此种方法获取文件系统
FileSystem fs = FileSystem.get(uri,conf);

return fs;
}

    2、创建文件目录

//创建文件目录
public static void mkdir() throws Exception {

//获取文件系统
FileSystem fs = getFileSystem();

//创建文件目录
fs.mkdirs(new Path("hdfs://cloud004:9000/middle/weibo"));

//释放资源
fs.close();
}

      3、删除文件或文件目录

//删除文件或者文件目录
public static void rmdir() throws Exception {

//返回FileSystem对象
FileSystem fs = getFileSystem();

//删除文件或者文件目录 delete(Path f) 此方法已经弃用
fs.delete(new Path("hdfs://cloud004:9000/middle/weibo"),true);

//释放资源
fs.close();
}

    4、获取目录下的所有文件

//获取目录下的所有文件
public static void ListAllFile() throws IOException{

//返回FileSystem对象
FileSystem fs = getFileSystem();

//列出目录内容
FileStatus[] status = fs.listStatus(new Path("hdfs://cloud004:9000/middle/weibo/"));

//获取目录下的所有文件路径
Path[] listedPaths = FileUtil.stat2Paths(status);

//循环读取每个文件
for(Path p : listedPaths){

System.out.println(p);

}
//释放资源
fs.close();
}

    5、文件上传至 HDFS

//文件上传至 HDFS
public static void copyToHDFS() throws IOException{

//返回FileSystem对象
FileSystem fs = getFileSystem();

//源文件路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/weibo.txt
Path srcPath = new Path("/home/hadoop/djt/weibo.txt");

// 目的路径
Path dstPath = new Path("hdfs://cloud004:9000/middle/weibo");

//实现文件上传
fs.copyFromLocalFile(srcPath, dstPath);

//释放资源
fs.close();
}

6、从 HDFS 下载文件

//从 HDFS 下载文件
public static void getFile() throws IOException{

//返回FileSystem对象
FileSystem fs = getFileSystem();

//源文件路径
Path srcPath = new Path("hdfs://cloud004:9000/middle/weibo/weibo.txt");

//目的路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/
Path dstPath = new Path("/home/hadoop/djt/");

//下载hdfs上的文件
fs.copyToLocalFile(srcPath, dstPath);

//释放资源
fs.close();
}
    7、获取 HDFS 集群节点信息

//获取 HDFS 集群节点信息
public static void getHDFSNodes() throws IOException{

//返回FileSystem对象
FileSystem fs = getFileSystem();

//获取分布式文件系统
DistributedFileSystem hdfs = (DistributedFileSystem)fs;

//获取所有节点
DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
//循环打印所有节点
for(int i=0;i< dataNodeStats.length;i++){
System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName());
}

8、查找某个文件在 HDFS 集群的位置

/查找某个文件在 HDFS 集群的位置
public static void getFileLocal() throws IOException{

//返回FileSystem对象
FileSystem fs = getFileSystem();

//文件路径
Path path = new Path("hdfs://cloud004:9000/middle/weibo/weibo.txt");

//获取文件目录
FileStatus filestatus = fs.getFileStatus(path);
//获取文件块位置列表
BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
//循环输出块信息
for(int i=0;i< blkLocations.length;i++){
String[] hosts = blkLocations[i].getHosts();
System.out.println("block_"+i+"_location:"+hosts[0]);
}

运行程序
以上 Java API 操作 HDFS 的各种方法,在本地测试完成后,可以根据自己实际情况,稍加修改Path路径就可以直接放到 Hadoop 环境下运行。大致需要以下几步:

第一步:我们使用 Eclipse 将 Test.java 类打包为 test.jar。因为这里不涉及第三方 jar 包,而且 Hadoop 集群上面已经存在 hadoop 所需要的jar包,所以我们只需要打包 Test.java 即可。

test.jar
第二步:在root用户下,通过 xshell 客户端,将 test.jar 上传至 hadoop服务器本地目录/home/hadoop/djt/的下面。

[[email protected] djt]$ ls
test.jar
第三步:需要在 root 用户下,将我们上传的 test.jar 文件权限赋予 hadoop 用户组。

[[email protected] ~]# chown -R hadoop:hadoop /home/hadoop/djt/test.jar
第四步:我们需要切换到 hadoop 的安装目录(/usr/java/hadoop-2.2.0-x64)下来运行 test.jar 文件,否则无法找到需要的 jar包来执行程序。

[[email protected] hadoop-2.2.0-x64]$ hadoop jar /home/hadoop/djt/test.jar com.dajiangtai.hadoop.middle.Test

时间: 2024-10-10 06:06:29

熟练掌握HDFS的Shell访问和JavaAPI访问的相关文章

熟练掌握HDFS的Shell访问

HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件 (可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的. 下面将介绍通过Shell接口对HDFS进行操作,HDFS处理文件的命令和Linux命令基本相同,这里区分大小写 目录 1.shell操作单个HDFS集群 2.s

利用JavaAPI访问HDFS的文件

body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}

HDFS的Shell命令

一.HDFS的Shell命令 我们都知道HDFS 是存取数据的分布式文件系统,那么对HDFS 的操作,就是文件系统的基本操作,比如文件的创建.修改.删除.修改权限等,文件夹的创建.删除.重命名等.对HDFS 的操作命令类似于lLinux 的shell 对文件的操作,如ls.mkdir.rm 等.我们在执行HDFS的shell操作的时候,一定要确定hadoop 是正常运行的,我们可以使用使用jps 命令确保看到各个hadoop 进程.我们可以执行命令hadoop fs,来查看HDFS的shell操

HDFS简介及用C语言访问HDFS接口操作实践

一.概述 近年来,大数据技术如火如荼,如何存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有非常广泛的应用. Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是Hadoop项目的核心子项目,是一种具有高容错性.高可靠性.高可扩展性.高吞吐量等特征的分

大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和SecondaryNameNode(面试开发重点)

第1章 HDFS概述1.1 HDFS产出背景及定义1.2 HDFS优缺点1.3 HDFS组成架构1.4 HDFS文件块大小(面试重点)第2章 HDFS的Shell操作(开发重点)第3章 HDFS客户端操作(开发重点)3.1 HDFS客户端环境准备3.2 HDFS的API操作3.2.1 HDFS文件上传(测试参数优先级)3.2.2 HDFS文件下载3.2.3 HDFS文件夹删除3.2.4 HDFS文件名更改3.2.5 HDFS文件详情查看3.2.6 HDFS文件和文件夹判断3.3 HDFS的I/O

HDFS的shell操作

既然HDFS 是存取数据的分布式文件系统,那么对HDFS的操作,就是对文件系统的基本操作,比如文件的创建.修改.删除.修改权限等,文件夹的创建.删除.重命名等.对 HDFS 的操作命令类似于Linux 的shell 对文件的操作,只是在HDFS中,hadoop fs是主命令,其他像ls,mv,cp都是被作为该命令的选项. 以下表格列出一些常用的HDFS shell命令选项. 选项名称 使用格式 含义 -ls -ls <路径> 查看指定路径的当前目录结构 -lsr -lsr <路径>

HDFS的shell和API操作

1. HDFS的shell操作 hadoop version //查看版本 hadoop fs -appendToFile src(Linux中的文件) dest(hdfs目录下的文件) //追加 hadoop fs -cat file(hdfs目录下的文件) //查看文件内容 Hadoop fs -tail file(hdfs目录下的文件) //查看文件末尾1kb的数据 hadoop fs -checksum file(hdfs目录下的文件) //校验当前文件是否正确 hadoop fs -c

1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用

1.27 Java基础总结 ①访问修饰符访问权限②类和方法的基本声明和使用 成员变量(属性)①类中添加成员变量 访问修饰符 类型 变量名 private String name ②实例化对象调用类的构造方法类构造对象,Teacher one = new Teacher(): 有static的可以直接调用,因为static是类级别的 ③JavaBean里边一般规则应该有公共的无参构造应该有符合命名规范的get/set方法 ④对象的回收:没有任何引用指向该对象时,GC会回收 主动回收:对象 = nu

无法中止进程无法访问操作拒绝访问

无法中止进程无法访问操作拒绝访问 解决方案:使用360解除占用 任务管理器显示进程路径 找到该进程的路径 右键使用360解除占用 注:此方法有可能会无效,如果谁有更好的方法,请说明,谢谢. 其他方法(在控制台(CMD)窗口通过命令终止),不一定有效 上边的方法显示出进程PID列 打开控制台尝试一下命令(假设908是要结束的PID): Taskkill /PID 908 /F 或者 ntsd –c q –p 908 注:此方法来源于网上,本人尝试无效 GoodLuck