Hadoop入坑之路(二)

上节回顾

  在第一篇博文(Hadoop入坑之路(一))中,讲述了HDFS如何在服务器上搭建以及命令行客户端的一些基本命令的用法。这一节中主要讲在Java客户端上,实现Windows与HDFS服务器的数据的交互。

客户端与HDFS的数据交互

  在运行Java客户端时,需要从官网上下载hadoop的源码包进行编译为windows版本的安装包,并且需要将Hadoop添加到系统环境变量中。

  启动Eclipse,新建一个Java项目,添加lib文件。将目录/share/hadoop/common、/share/common/lib、/share/hadoop/hdfs/lib以及/share/hadoop/hdfs下的jar包添加到Java项目的lib文件夹中,并添加到调试环境中。

上传文件到HDFS:

public class HdfsClient {
    public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
        /**
         * configuration参数对象的机制:
         *      构造时,会先加载jar包中的默认配置 xx-default.xml
         *      再加载用户配置xx-default.xml,覆盖掉默认参数
         *
         *      构造完成后,还可以conf.set("p", "n"),会再次覆盖用户配置文件中的参数值
         */
        //new Configuration()会从项目的classpath中自动加载core-defult.xml hdfs-defult.xml hdfs-site.xml等文件
        Configuration conf = new Configuration();
        //指定本客户端上传文件到hdfs时需要保存的副本为:2
        conf.set("dfs.replication", "2");
        //指定本客户端上传文件到hdfs时切块的规格大小:64M
        conf.set("dfs.blocksize", "64m");

        //构造一个访问指定HDFS系统的客户端对象:参数1:HDFS系统的URI,参数2:客户端指定的参数,参数3:客户身份(用户名)
        FileSystem fs = FileSystem.get(new URI("hdfs://222.18.157.50:9000/"), conf, "root");

        //上传一个文件到hdfs中
        fs.copyFromLocalFile(new Path("C:\\xxx\\xx\\xx\\xxxx.txt"), new Path("/"));

        fs.close();
    }
 }

从HDFS下载文件:

public class HdfsClient {
    FileSystem fs = null;

    @Before
    public void init() throws IOException, InterruptedException, URISyntaxException {

        //new Configuration()会从项目的classpath中自动加载core-defult.xml hdfs-defult.xml hdfs-site.xml等文件
        Configuration conf = new Configuration();

        //指定本客户端上传文件到hdfs时需要保存的副本为:2
        conf.set("dfs.replication", "2");

        //指定本客户端上传文件到hdfs时切块的规格大小:64M
        conf.set("dfs.blocksize", "64m");

        //构造一个访问指定HDFS系统的客户端对象:参数1:HDFS系统的URI,参数2:客户端指定的参数,参数3:客户身份(用户名)
        fs = FileSystem.get(new URI("hdfs://222.18.157.50:9000/"), conf, "root");
    }

    /**
     * 从HDFS中下载文件到本地磁盘
     * @throws Exception
     * @throws IllegalArgumentException
     */
    @Test
    public void testGet() throws IllegalArgumentException, Exception {

        fs.copyToLocalFile(new Path("/xxx.txt"), new Path("F:\\"));
        fs.close();
    }
}

在HDFS内部移动(修改)文件名称 

/**
 * 在HDFS内部移动(修改)文件名称
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testRename() throws Exception {

    fs.rename(new Path("/office激活.txt"), new Path("/install.log"));

    fs.close();
}

在HDFS中创建文件夹

/**
 * 在HDFS中创建文件夹
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testMkdir() throws IllegalArgumentException, IOException {
    fs.mkdirs(new Path("/client/java"));
    fs.mkdirs(new Path("/client/command"));
    fs.close();
}

在HDFS中删除文件或文件夹

/**
 * 在HDFS中删除文件或文件夹
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testRm() throws IllegalArgumentException, IOException {
    fs.delete(new Path("/install.log"), false);
    fs.close();
}

查询HDFS中制定目录下的文件信息

/**
 * 查询HDFS指定目录下的文件信息
 * @throws IOException
 * @throws IllegalArgumentException
 * @throws FileNotFoundException
 */
@Test
public void testLs() throws FileNotFoundException, IllegalArgumentException, IOException {
    // 只查询文件信息,不返回文件夹信息
    RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/client/java"), true);

    while(iter.hasNext()) {
        LocatedFileStatus status = iter.next();
        System.out.println("文件全路径:" + status.getPath());
        System.out.println("块大小:" +  status.getBlockSize());
        System.out.println("文件长度:" + status.getLen());
        System.out.println("副本数量:" + status.getReplication());
        System.out.println("快信息:" + Arrays.toString(status.getBlockLocations()));
        System.out.println("所属用户:" + status.getOwner());
        System.out.println("========华==丽==的==分==割==线========");
    }
    fs.close();
}

查询HDFS中指定目录下的文件和文件夹信息

/**
 * 查询HDFS指定目录下的文件和文件夹信息
 * @throws IOException
 * @throws IllegalArgumentException
 * @throws FileNotFoundException
 */
@Test
public void testLs2() throws FileNotFoundException, IllegalArgumentException, IOException {
    FileStatus[] liststatus = fs.listStatus(new Path("/client/"));

    for(FileStatus status : liststatus) {
        System.out.println("文件全路径:" + status.getPath());
        System.out.println(status.isDirectory() ? "这是文件夹" : "这是文件");
        System.out.println("块大小:" + status.getBlockSize());
        System.out.println("文件长度:" + status.getLen());
        System.out.println("副本数量:" + status.getReplication());
        System.out.println("========华==丽==的==分==割==线========");

    }
    fs.close();
}

读取HDFS中文件内容

/**
 * 读取HDFS中的文件内容
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testReadData() throws IllegalArgumentException, IOException {
    FSDataInputStream in =fs.open(new Path("/doc/HadoopReadMe.txt"));

    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line = null;
    while((line = br.readLine()) != null) {
        System.out.println(line);
    }
    br.close();
    in.close();
    fs.close();
}

读取HDFS中指定偏移量范围的内容

/**
 * 读取HDFS中文件指定偏移量范围的内容
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testRandomReadData() throws IllegalArgumentException, IOException {
    FSDataInputStream in = fs.open(new Path("/doc/HadoopReadMe.txt"));

    // 指定读取的起始位置
    in.seek(32);

    // 指定读取长度:读取64个字节
    byte[] buf =new byte[64];
    in.read(buf);

    System.out.println(new String(buf));

    in.close();
    fs.close();
}

往HDFS中写文件内容

/**
 * 往HDFS中的文件写数据
 * @throws IOException
 * @throws IllegalArgumentException
 */
@Test
public void testWriteData() throws IllegalArgumentException, IOException {
    FSDataOutputStream out = fs.create(new Path("/client/java/testPic.jpg"));

    FileInputStream in =new FileInputStream("C:\\xxx\\xx\\Desktop\\xxxx\\xxxx\\xxxx.png");

    byte[] buf = new byte[1024];
    int read = 0;
    while((read = in.read(buf)) != -1) {
        out.write(buf, 0, read);
    }
    in.close();
    out.close();
    fs.close();

}

原文地址:https://www.cnblogs.com/zhangchao162/p/9628937.html

时间: 2024-08-01 13:38:50

Hadoop入坑之路(二)的相关文章

VPS 入坑之路

一.入坑动机: 以前一直的FQ服务也被请喝茶了,仅限企业客户使用.于是想到租用一个VPS,搭个梯子. 二.入坑之路: 1.购买 想起在G+看见有人推荐搬瓦工性价比很高,去了解了一下,最低配置19.99刀一年,折合人民币也就十块一个月的样子,果断入之. 2.SS 以前在虚拟机稍微接触过linux,比如ubuntu和fedora,然而都是在图形界面瞎搞.这次终于有机会在终端操作了.各种命令上手确实不容易,只会cd,ls...突然发现控制面板有一键搭建SS,后来又放弃了敲命令...有一天心血来潮,决定

vue2入坑随记(二) -- 自定义动态组件

学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.extend 思路就是拿到组件的构造函数,这样我们就可以new了.而Vue.extend可以做到:https://cn.vuejs.org/v2/api/#Vue-extend // 创建构造器 var Profile = Vue.extend({ template: '<p>{{firstName

React入坑之路(一)

1.funciton mapStateToProps(state){ console.log("Data page:",state) //每个界面都可以打印出所有的state或者部分 const{davices,locations,batterystate} = state;//从所有的state里提取部分所需数据 return { devices,locations,batterystate } } 从整个state里面获取全部state或者部分所需数据到页面 function ma

webpack入坑之旅(二)loader入门

这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不是开始的开始 webpack入坑之旅(二)loader入门 webpack入坑之旅(三)webpack.config入门 webpack入坑之旅(四)扬帆起航 webpack入坑之旅(五)加载vue单文件组件 webpack入坑之旅(六)配合vue-router实现SPA 引子 在上一篇博客中我们已

Android项目开发遇到的问题(64K的错误)的解决之路,从入坑到出坑

自己一个android项目,一直以来进展还算顺利,没有遇到什么严重性的问题,今天准备给同事手机上安装一下玩玩,谁知丢人丢大,无法build apk!报错!my god,我开发没问题啊,我手机连上usb,然后android studio里面运行,很顺利,能够正确安装. 但是换同事的手机却不行,编译报错,不行,再试下我的手机,依然正常,换同事手机就不行!! 我的第一反应是手机版本问题!果然,我手机6.0,同时手机依然是:4.4.4,好吧,去看看我的项目配置: 好吧,貌似是支持4.4.4的啊,为毛呢?

web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知,不问自晓,古今行事,未之有也 」 我们都知道如今流行的框架:Vue.Js.AngularJs.ReactJs.已经逐渐应用到各个项目和实际应用中,它们都是MVVM数据驱动框架系列的一种. 在了解MVVM之前,我们先回想一下前端发展的历史阶段,做到心中有数,才会更好理解. 这段回想历史.由于网上就可查不少资料,

web前端入坑第四篇:你还在用 jQuery?

web前端入坑第四篇:你还在用 jQuery? 大妈都这么努力,我们有几个人回家还看书的? 先来补齐[web前端入坑系列]前三篇的连接web前端入坑系列:点击标题进入第一篇: web 前端入坑第一篇:web前端到底是什么?有前途吗第二篇: web前端入坑第二篇:web前端到底怎么学?干货资料!第三篇:web前端入坑第三篇 | 一条"不归路" - 学习路线! 再说这个话题之前,我们先来扫盲普及一下 [jquery] 到底是什么以及它火爆将近十年的重要原因. [ 重新认识 - Jquery

【Xbox one S】开箱&amp;开机&amp;初入坑心得

再来一发水贴,先上产品标准照镇贴: 前言 身为一个资深单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是正确的游戏姿势.80后的机友大概都有小时候跟小伙伴坐地上双打小霸王的愉快记忆,儿时的记忆总是那么深刻,任凭岁月和社会如何磨灭,总有些感觉想要找回,所以很难说现在淘来一台游戏机有几分是为了当下的娱乐,几分是为了找到当年的感觉.当然了,今天的PC也完全可以让你坐沙发拿手柄看电视甚至玩着相同的游戏,但就凭它叫游戏机,

vue2.x入坑总结—回顾对比angularJS/React的一统

从感性的角度讲,我是不屑于用VUE,觉得react套件用起来更顺手,但是vue现在越来火,所以也不得入vue(杂烩汤)的坑.vue/anguarJS/React,三者对关系现在就是: https://www.zhoulujun.cn/uploadfile/images/2018/0626/20180626214906428779269.jpg 自己ps了下,觉得深有道理,骚年们自己体悟,然后再问军哥^_^ 不过回归真题,看vue还是先了解下https://cdn.zhoulujun.cn/vue