大数据(3)---HDFS客户端命令及java连接

一、参数设置

  之前有说到HDFS的备份数量和切块大小都是可以配置的,默认是备份3,切块大小默认128M

  文件的切块大小和存储的副本数量,都是由客户端决定!

  所谓的由客户端决定,是通过客户端机器上面的配置参数来定

  hdfs的客户端会读以下两个参数,来决定切块大小、副本数量:

  切块大小的参数: dfs.blocksize

  副本数量的参数: dfs.replication

  更多参数详见:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml

  因此我们只需要在客户端的机器上面hdfs-site.xml中进行配置:

<property>

<name>dfs.blocksize</name>

<value>64m</value>

</property>

 

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

 

  我们在两个客户端进行上传,一个客户端修改为上述配置,查看上传文件信息

  可以看见一个文件是3128m,另外一个是264m

 

 

 

二、客户端命令行操作

 

 

1、上传文件到hdfs

hadoop fs -put /本地文件  /aaa

 

2、下载文件到客户端本地磁盘

hadoop fs -get /hdfs中的路径   /本地磁盘目录

 

3、hdfs中创建文件夹

hadoop fs -mkdir  -p /aaa/xxx

 

4、移动hdfs中的文件(更名)

hadoop fs -mv /hdfs的路径1  /hdfs的另一个路径2

 

复制hdfs中的文件到hdfs的另一个目录

hadoop fs -cp /hdfs路径_1  /hdfs路径_2

 

5、删除hdfs中的文件或文件夹

hadoop fs -rm -r /aaa

 

6、查看hdfs中的文本文件内容

hadoop fs -cat /demo.txt

hadoop fs -tail -f /demo.txt

 

更多命令:https://www.cnblogs.com/houkai/p/3848089.html

 

  三、java连接

 

1.首先需要搭建本地开发环境,因为本地启动应用的时候会从hadoop里面回去调用c的函数操作本地文件系统,因此我们需要在本地配置hadoop的环境信息。

hadoop压缩包解压出来,留下脚本所在的目录就可以了,其他的一些目录可以丢掉,留下下图圈上的即可

 

 配置hadoop环境变量,将bin目录的里面的文件替换问windows的脚本文件。

 

 

 

windows的脚本文件去哪儿弄呢,可以自己去编译,也可以找别人编译好的:

https://github.com/steveloughran/winutils

 

 

 这是别人已经编译好的windows脚本,换到自己的bin目录里面去就行了。

配置好之后检查下能否识别hadoop指令

 

 

 

 

 

2. 准备完毕就可以导包撸代码了

导包:版本最好和自己安装hadoop版本一致

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

 

上代码:

package com.nijunyang.hadoop.hdfs;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;
import java.util.Arrays;

/**
 * Description:
 * Created by nijunyang on 2019/12/25 20:26
 */
public class HDFSDemo {

    FileSystem fs;
    
    @Before
    public void init() throws Exception{

        URI uri = new URI("hdfs://nijunyang68:9000/");
        /**
         * Configuration 构造会从 classpath中加载core-default.xml hdfs-default.xml core-site.xml hdfs-site.xml等文件
         * 也可使用set方法进行自己设置值
         * https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
         */
        Configuration conf = new Configuration();
        conf.set("dfs.replication", "2");
        // 切块的规格大小:32M
        conf.set("dfs.blocksize", "32m");
        fs = FileSystem.get(uri, conf, "root");
    }

    @Test
    public void test1() throws Exception {
        // 上传一个文件到HDFS中
        fs.copyFromLocalFile(new Path("E:/安装包/linux/jdk-8u191-linux-x64.tar.gz"), new Path("/soft/"));
        //下载到本地
        fs.copyToLocalFile(new Path("/soft/jdk-8u191-linux-x64.tar.gz"), new Path("f:/"));
        //在hdfs内部移动文件/修改名称
        fs.rename(new Path("/redis-5.0.5.tar.gz"), new Path("/redis5.0.5.tar.gz"));
        //在hdfs中创建文件夹
        fs.mkdirs(new Path("/xx/yy/zz"));
        //在hdfs中删除文件或文件夹
        fs.delete(new Path("/xx/yy/zz"), true);
        //查询hdfs指定目录下的文件信息
        RemoteIterator<LocatedFileStatus> iter = fs.listFiles(new Path("/"), 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("--------------------------------");
        }
        //查询hdfs指定目录下的文件和文件夹信息
        FileStatus[] listStatus = fs.listStatus(new Path("/"));
        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();
    }
}

简单来说java代码也就是一个客户端访问,所以说配置信息都可以塞到Configuration里面去。

posted @ 2019-12-25 22:02  白露非霜  阅读(918)  评论(0编辑  收藏  举报
访问量