当前位置: 首页 > 编程日记 > 正文

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  -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

相关文章:

C#中的问号用法

在看一些国外牛人写的C#代码时&#xff0c;总是看到会有Boolean?、DateTime?这样的类型&#xff0c;以为是一些新的类型&#xff08;该类型变量有一些新的属性和方法&#xff09;&#xff0c;后来经过查找相关的资料&#xff0c;发现原来另有微妙。以下是MSDN中对这个问号的解…

L1-006 连续因子

题目&#xff1a; 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输…

Python Data Structures

1. list 2. stack 3. queue 4. tuple 5. sequence 6. set 7. dict #-*- coding: utf-8 -*-# 添加中文注释Created on 2011-4-29test for python data structureauthor: xuqiang###################list##################print("test for list");a [66.25, 333, 333…

【转】 ubuntu12.04更新源

原文网址&#xff1a;http://blog.chinaunix.net/uid-26404477-id-3382633.html 摘 要&#xff1a;本文列出ubuntu 12.04 LTS更新源列表&#xff0c;内容为网友整理&#xff0c;此处为转载。因为我还在重庆读书&#xff0c;所以在设置自己的源列表的时候选择了电子科技大学的更…

Ubuntu 上创建常用磁盘阵列

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

L1-009 N个数求和

题目 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤100&#xff09;。随后一行按格式a1/b1 a2/…

我的理解:box-sizing

下面是我在博客园找到的&#xff0c;和我遇见的情况很相似&#xff0c;所以摘抄下来&#xff0c;原文见:http://www.cnblogs.com/charling/p/3635031.html box-sizing语法&#xff1a; box-sizing &#xff1a; content-box || border-box || inherit 参数取值&#xff1a; con…

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

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

idea打开web项目之后一直闪烁

解决办法&#xff1a; 点击&#xff0c; 选择第一个&#xff08;清除缓存并重启&#xff09; 这时Idea会自动重新启动&#xff0c;之后就没有闪烁的状态了。 一开始我选择是第二个&#xff0c;清除无效的缓存&#xff0c;但是并没有起作用。

第十章:控制文件

控制文件管理[大纲] 控制文件的结构  控制文件的复用  控制文件的重建  控制文件的管理一、数据库控制文件控制文件中记载了数据库的物理结构等重要的数据库信息&#xff0c;如数据文件和日志文件信息。控制文件是用 于维护数据库完整性的重要文件。Oracle 正是使用…

UIImage图片拉伸方法

纵观移动市场&#xff0c;一款移动app&#xff0c;要想长期在移动市场立足&#xff0c;最起码要包含以下几个要素&#xff1a;实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后&#xff0c;少不了美工的辛苦设计&#xff0c;但如果开发人员不懂得怎么合理展示这些设…

【摘录】GestureDector使用

boolean onDoubleTap(MotionEvent e)解释&#xff1a;双击的第二下Touch down时触发boolean onDoubleTapEvent(MotionEvent e)解释&#xff1a;双击的第二下Touch down和up都会触发&#xff0c;可用e.getAction()区分。boolean onDown(MotionEvent e)解释&#xff1a;Touch …

IDEA新建springboot项目发生错误

idea新建spring boot项目 选择这个默认的Default 之后弹出提示框如下 这个时候首先试一下更换一下网络&#xff0c;我用的是wifi就换成热点&#xff0c;就可以了&#xff0c;是因为网络的问题

windows form窗体应用程序,建一个记事本参考代码,重点是打开,保存,另存为...

//当点击打开的时候private string files; //建一个成员变量&#xff0c;用来存储打开的路径private void 打开OToolStripMenuItem_Click(object sender, EventArgs e){//openFileDialog1.Filter "文本文件|*txt|视频文件|*avi;*jpg"; //filter建立一个筛选器//ope…

『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!

前言&#xff1a; 在前三篇的文章中&#xff0c;和大家一起创建了一个用于TCP连接检测的小组件&#xff0c;如果你记不得了&#xff0c;可以通过以下链接去回顾一下&#xff1a; 『参考』.net CF组件编程&#xff08;1&#xff09;——基础之后 『参考』.net CF组件编程…

vs2010设置boost开发环境

1. 编译boost类库 2. 设置vs2010的环境 <1>. 编译boost类库 前面一篇文章介绍了如何在linux下建立boost的开发环境&#xff0c;并且编写了一个测试程序&#xff0c;这里将试着在windows下编译boost&#xff0c;同时设置vs2010的开发环境&#xff0c;使用vs来作为开发的…

怎样把字符1变成数字1

直接使用字符bai1减去字符0即可&#xff0c;如&#xff1a;‘1’-0’ 解释&#xff1a; 这样做可行是因为字符0到字符9在ascii编码时是连续的&#xff0c;字符0的ascii值是48&#xff0c;字符1的ascii值是49&#xff0c;其他数字字符依次往后排&#xff0c;而ascii值实际上就…

C#基础篇--文件(流)

1&#xff1a;Path类是专门用来操作文件路径的&#xff08;Path类是静态类&#xff09;&#xff1a;当然用字符串的处理办法也能实现。 string str "C:\Users\成才\Desktop\Hashtable.txt";//返回文件名Console.WriteLine(Path.GetFileName(str));//返回文件名&…

adoquery查询结果如何赋给一个变量(delphi和c++ builder)

我用的是adoquery进行数据库查询&#xff0c;但是我不想把查询的结果显示出来&#xff0c;只是想赋给一个变量&#xff0c;请问我这个变量该怎样去设置呢 &#xff1f; 回复人&#xff1a;sunriver 回复时间&#xff1a;2005-6-3 9:11:00procedure TForm1.Button1Click(Sender:…

pdf格式转换成jpg的简单教程

如何将pdf文件在线免费转换成jpg图片&#xff1f;因为文件保存为图片的形式比较容易查看&#xff0c;因此小伙伴们在编辑完pdf文件之后都会将其保存为jpg图片。那究竟应如何将pdf文件在线转换成图片呢&#xff1f;我们在网上也可以找到很多工具&#xff0c;但是转换效果却是不尽…

npm should be run outside of the Node.js REPL, in your normal shell

错误&#xff1a; npm should be run outside of the Node.js REPL, in your normal shell 在搭建vue环境时报错&#xff0c; 设置缓存文件夹 npm config set cache "D:\vueProject\nodejs\node_cache"和 设置全局模块存放路径 npm config set prefix “D:\vueProjec…

php错误封装类

1、创建MyErrorHandler.php文件 代码如下&#xff1a; <?php class MyErrorHandler {public $message;public $filename;public $line;public $vars array();protected $_noticeLog F:\root\noticeLog.log;public function __construct ($message,$filename,$line,$vars)…

sqlserver 与 mysql 联合更新两个表 区别

sqlserver:UPDATE a SET a.gradeb.id FROM userinfo a,levelinfo b WHERE a.exp>b.minvalue AND a.exp<b.maxvaluemysql:UPDATE userinfo a,levelinfo b SET a.gradeb.id WHERE a.exp>b.minvalue AND a.exp<b.maxvalue转载于:https://www.cnblogs.com/andy_tigger/…

Django web框架

Web框架 web 框架本质 - Web应用本质上就是一个socket服务端&#xff0c;而用户的浏览器就是一个socket客户端。 HTTP协议 HTTP协议介绍HTTP协议对收发消息的格式要求每个HTTP请求和响应都遵循相同的格式&#xff0c;一个HTTP包含Header和Body两部分&#xff0c;其中Body是可…

输入vue ui没反应

在cmd中输入 vue ui没有反应 输入 vue -h查看&#xff0c;发现是版本太低&#xff0c;根本没有ui 这是因为vue的版本太低导致的&#xff0c; 输入cnpm i -g vue/cli 升级脚手架即可 升级完成后&#xff0c;输入vue -h 最后输入vue ui即可

Windows 10 开发日记(五)-- 当Binding遇到异步 -- 解决方案

前文再续&#xff0c;上一章提出了问题&#xff0c;本章提出了三种解决方案&#xff1a; 解决方案一&#xff1a;手动进行异步转换,核心思想:将binding做的事情放入CodeBehind FilterItemControl.XAML: <Grid><Image x:Name"FilterImage" Stretch"Unif…

java实现局域网内单对单和多对多通信的设计思路

这个看起来是很简单的&#xff0c;不就是socket吗&#xff0c;但是&#xff0c;要想有一个好的用户体验&#xff0c;还是很难的&#xff0c;主要问题有&#xff1a; 既然是局域网&#xff0c;那么就必然没有一个固定的IP地址作为主机&#xff0c;这个问题怎么解决&#xff1f; …

GIT - 拉取其他仓库的某个分支的代码

场景 在A仓库拉取B仓库develop分支的代码到A的本地分支 步骤 查看本地已有的远程仓库git remote // 查看远程仓库的名字 发现只有A-v 更加详细的远程仓库说明 复制代码添加远程仓库git remote add BName Bgiturl // 添加远程仓库 BNname别名 Bgiturl远程的git地址 复制代码添…

fetchMetadata: sill install loadAllDepsIntoIdealTree

在搭建vue项目的时候出现报错如下 fetchMetadata: sill install loadAllDepsIntoIdealTree 先输入 npm install -g cnpm --registryhttps://registry.npm.taobao.org 在输入cnpm install

redmine忘记username和password

环境&#xff1a; Ubuntu 13.10 bitnami-redmine-2.5.1-1-linux-x64-installer.run 用bitnami安装完redmine以后&#xff0c;有是否忘记了username和password。可是又没有配置邮件server&#xff0c;无法找回password。 仅仅能去server更改了。更改过程例如以下&#xff1a; 1…