HDFS的shell和API操作

news/2024/7/7 19:49:51

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  -copyFromLocal src dest  //从本地复制文件到HDFS
hadoop   fs  -copyToLocal   dest src  //从hdfs复制文件到本地
hadoop   fs  -count path    //对目录内容做计数
hadoop   fs  -find  path     //查看某个hdfs目录中是否相应的文件
hadoop   fs  -getmerge   src dest  //合并下载
hadoop   fs  -ls   path     //列表
hadoop   fs  -put  file(本地)  dest(hdfs)   //将本地文件上传到hdfs
hadoop   fs  -setrep  num  file   //设置hdfs系统中的某个文件的副本数(只能是hdfs中已上传的文件)
hadoop   fs  -setrep -R num file //设置hdfs系统中的目录下的所有文件的副本数
hadoop   fs  -text 压缩文件   //查看hdfs中的压缩文件
hadoop   fs  -truncate   dir  //清空hdfs目录
hdfs  getconf  -confkey  [key](配置文件的name)  //查看相应的配置的value

2. HDFS的API操作

1)eclipse中的hdfs的开发环境搭建:

  • 下载一个新版的eclipse,将自己集成的hadoop-eclipse-plugin-2.7.4.jar放入eclipse的安装目录中的…\eclipse-hadoop\plugins中。
    插件下载地址:http://down.51cto.com/data/2457877
    然后打开eclipse:
    HDFS的shell和API操作
    HDFS的shell和API操作
    能查看到以上的两个组件,表示eclipse环境配置成功。
  • 配置eclipse插件连接集群
    HDFS的shell和API操作
    配置成功之后,在DFS Locations中就会出现hdfs的文件目录
    HDFS的shell和API操作
  • window平台使用hadoop:
    • 在windows下配置hadoop的环境变量,将hadoop的解压包放置一个位置,然后加入:HADOOP_HOME:../hadoop2.7.4/,在path中%HADOOP_HOME:%/bin、
      hadoop.dll,winutils.exe下载地址:http://down.51cto.com/data/2457878
    • 将hadoop.dll 放入c:\windows\system32中
    • 将winutils.exe,放入hadoop 的bin目录下
    • 将eclipse集成hadoop
      HDFS的shell和API操作

2)添加hadoop依赖包的三种方式:

  • 在项目中创建一个文件夹,然后将所有需要依赖的jar拷贝到这个目录,右击add build path 将jar导入项目
  • 创建一个用户的library,在本地将相应的jar包导入到项目中:
    HDFS的shell和API操作HDFS的shell和API操作
    注意这里的两个lib中所有jar包都要添加
  • 使用maven导入jar包(推荐)

    3)hdfs编程中的重要的 两个对象:

      Configuration类的介绍
      Configuration类是加载hadoop中的相应的配置文件

    Configuration conf=new Configuration(true);
    如果在这里没有在source folder中放入相应的配置文件:
    core-site.xml、hdfs-site.xml、yarn-site.xml、mapreduce-site.xml…
    那么Configuration类会自动的加载jar包中的配置文件:
    hadoop-hdfs-2.7.6.jar/hdfs-default.xml
    只有在sourcefolder中放入相应的配置时,才能够加载相应的配置,但是配置文件的名称必须是site 或者default的文件,才能够正确加载

      使用相应的方法加载配置文件:

    Configuration conf=new Configuration();
    conf.addResource(""); //这例实参的内容为配置文件的权限定名称

      FileSystem类的介绍
    获取FileSystem对象:

    //以这种方式获取的fs对象是本地的文件系统的对象,如果在windows下就是windows的对象
    Configuration conf=new Configuration();
    FileSystem fs=FileSystem.get(conf);
    //能加载自己集群的文件系统对象
    conf.set("fs.defaultFS", "hdfs://hadoop01:9000");

    解决编程时的权限问题:
     由于hdfs文件系统是基于用户的,在Windows下eclipse中操作hdfs默认的用户是Windows的用户,在操作hdfs文件系统时没有权限的,所以在做读写操作时,可能会报出:
    HDFS的shell和API操作
    解决方案
    (1)在运行时使用run configuration,配置相应的参数:-DHADOOP_USER_NAME=hadoop(指定运行用户)
    (2)在代码中指定用户:FileSystem.get(newURI("hdfs://hadoop01:9000"),conf,"hadoop");
    (3)在代码中指定jvm运行时使用的用户System.setProperty("HADOOP_USER_NAME", "hadoop"); 这里需要使用run configuration运行
    (4)在Windows中添加一个hadoop用户,不建议使用
    如果以上方式仍然出现问题,那么就需要在window的path中配置一个环境变量:
    DHADOOP_USER_NAME = hadoop 即可。

4)hdfs的实战编程:

public class HDFSApp {//文件系统FileSystem fileSystem = null;//配置类Configuration configuration = null;@Beforepublic void setup() {configuration = new Configuration();configuration.set("fs.defautlFS", "hdfs://zzy:9000");configuration.addResource("core-site.xml");configuration.addResource("hdfs-site.xml");try {fileSystem = FileSystem.get(configuration);} catch (IOException e) {e.printStackTrace();}}//创建目录@Testpublic void mkdir() {try {System.setProperty("HADOOP_USER_NAME", "hadoop");boolean isMkdirs = fileSystem.mkdirs(new Path("/user/hadoop/test"));if (isMkdirs) {System.out.println("创建成功!!");} else {System.out.println("创建失败!!");}} catch (IOException e) {e.printStackTrace();}}//删除目录@Testpublic void deletedir() {System.setProperty("HADOOP_USER_NAME", "hadoop");try {fileSystem.delete(new Path("/每日任务.txt"), true);} catch (IOException e) {e.printStackTrace();}}//将本地文件copy到hdfs中@Testpublic void CopyFromeLocal() {System.setProperty("HADOOP_USER_NAME", "hadoop");Path  src=new Path("C:\\Users\\aura-bd\\Desktop\\每日任务.txt");Path dest=new Path("/");try {fileSystem.copyFromLocalFile(src,dest);} catch (IOException e) {e.printStackTrace();}}//将hdfs文件copy到本地@Test public void CopyToLocal(){System.setProperty("HADOOP_USER_NAME", "hadoop");Path  src=new Path("C:\\Users\\aura-bd\\Desktop\\");Path dest=new Path("/user/hive/warehouse/test.db/pokes/data.txt");try {fileSystem.copyToLocalFile(dest,src);} catch (IOException e) {e.printStackTrace();}}//显示目录下的文件夹信息@Testpublic void FSListFile(){try {RemoteIterator<LocatedFileStatus> filelist = fileSystem.listFiles(new Path("/user/hive/warehouse/test.db"), true);while(filelist.hasNext()){LocatedFileStatus fileStatus = filelist.next();System.out.println(fileStatus.getPath());System.out.println(fileStatus.getGroup());System.out.println(fileStatus.getPath().getName());System.out.println(fileStatus.getReplication());BlockLocation[] blockLocations = fileStatus.getBlockLocations();for(BlockLocation block :blockLocations){System.out.println(block.getHosts().toString());System.out.println(block.getNames());System.out.println(block.getOffset());}}} catch (IOException e) {e.printStackTrace();}}//显示文件夹以及文件信息@Testpublic void ListFiles(){try {FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));for(FileStatus file:fileStatuses){if(file.isDirectory()){System.out.println("directory:"+file.getPath().getName());}else{System.out.println("file:"+file.getPath().getName());}}} catch (IOException e) {e.printStackTrace();}}//下载文件@Testpublic void DownLoadFileToLocal(){System.setProperty("HADOOP_USER_NAME", "hadoop");try {FSDataInputStream open = fileSystem.open(newPath("/user/hive/warehouse/test.db/pokes/data.txt"));OutputStream out=new FileOutputStream(new File("D:\\data.txt"));IOUtils.copyBytes(open,out,1024);} catch (IOException e) {e.printStackTrace();}}//上传文件@Testpublic void upLoadFileToLocal(){System.setProperty("HADOOP_USER_NAME", "hadoop");try {FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/a.txt"));InputStream in=new FileInputStream("D:\\data.txt");IOUtils.copyBytes(in,fsDataOutputStream,4096);} catch (IOException e) {e.printStackTrace();}}
}

3. HDFS的经典案例:

  在hadoop中MR编程计算框架中,都是计算向数据移动,那么如何获取一个文件的所有block信息,指定block块进行数据读取的呢?
代码实现

public class RamdomRead {private static Configuration conf;private static FileSystem fs;static {conf=new Configuration(true);conf.set("fs.defalutFS","hdfs://zzy:9000");conf.addResource("core-site.xml");conf.addResource("hdfs-site.xml");try {fs=FileSystem.get(conf);} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {System.setProperty("HADOOP_USER_NAME","hadoop");Path file=new Path("/data/2018-8-8/access.log");FSDataInputStream open = fs.open(file);//拿到文件信息try {FileStatus[] fileStatuses = fs.listStatus(file);// 获取这个文件的所有 block 的信息BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatuses[0], 0L, fileStatuses[0].getLen());// 第一个 block 的长度BlockLocation fileBlockLocation = fileBlockLocations[0];//第一个块的长度long length = fileBlockLocation.getLength();//第一个 block 的起始偏移量long offset = fileBlockLocation.getOffset();//读取数据byte flush[]=new byte[4096];FileOutputStream os = new FileOutputStream(new File("d:/block0"));while(open.read(offset,flush,0,4096)!=-1){os.write(flush);offset+=4096;if(offset>length){return ;}}os.flush();os.close();fs.close();} catch (IOException e) {e.printStackTrace();}}
}

转载于:https://blog.51cto.com/14048416/2341623


http://lihuaxi.xjx100.cn/news/235556.html

相关文章

【mysql错误】用as别名 做where条件,报未知的列 1054 - Unknown column 'name111' in 'field list'...

需求&#xff1a;SELECT a AS b WHRER b1; //这样使用会报错&#xff0c;说b不存在。 因为mysql底层跑SQL语句时&#xff1a;where 后的筛选条件在先&#xff0c; as B的别名在后。所以机器看到where 后的别名是不认的&#xff0c;所以会报说B不存在。 这个b只是字段a查询结…

【Swift】 GETPOST请求 网络缓存的简单处理

GET & POST 的对比 源码&#xff1a; https://github.com/SpongeBob-GitHub/Get-Post.git 1. URL - GET 所有的参数都包含在 URL 中 1. 如果需要添加参数&#xff0c;脚本后面使用 ? 2. 参数格式&#xff1a;值对 参数名值 3. 如果有多个参数&#xff0c;使用 & 连接 …

CF1148F - Foo Fighters

CF1148F - Foo Fighters 题意&#xff1a;你有n个物品&#xff0c;每个都有val和mask。 你要选择一个数s&#xff0c;如果一个物品的mask & s含有奇数个1&#xff0c;就把val变成-val。 求一个s使得val总和变号。 解&#xff1a;分步来做。发现那个奇数个1可以变成&#x…

iOS中几种定时器

一、NSTimer 1. 创建方法 NSTimer *timer [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:selector(action:) userInfo:nil repeats:NO];TimerInterval : 执行之前等待的时间。比如设置成1.0&#xff0c;就代表1秒后执行方法target : 需要执行方法的对象…

Ubuntu 上创建常用磁盘阵列

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

活体检测-用照片来做人脸识别可行吗?

随着科技的迅速发展&#xff0c;智能化也越来越发达&#xff0c;并慢慢进入到我们日常生活中来了。如考勤 早期是人工记录&#xff0c;签到&#xff0c;然后是打卡&#xff0c;刷卡&#xff0c;再到指纹。现在已经发展到更加先进的人脸识别考勤了。 卡可以代打&#xff0c;代刷…

ios关于用xib创建的cell 自动返回cell的高度问题!

1 设置tableView的属性 self.tableView.rowHeight UITableViewAutomaticDimension; self.tableView.estimatedRowHeight 44.0; // 设置为一个接近“平均”行高的值 2 cell要约束好&#xff0c;要能够让cell知道自己的高度根据哪个控件计算就可以&#xff08;不明白看下图&…

世界最大规模3D打印混凝土步行桥在上海 落成启用

1月12日&#xff0c;世界最大规模3D打印混凝土步行桥在沪落成启用&#xff0c;人们站在桥体上欢庆该新兴建筑体的诞生。 中新网上海1月13日电 (记者 于俊)一座体态优雅、形似飘带的水泥桥12日横跨于上海宝山智慧湾的小河之上&#xff0c;宣告全球最大规模混凝土3D打印步行桥落成…