大数据日记 ——> 6_28

指令:
在HDFS上创建文件夹:

hdfs dfs -mkdir /bigdata

上传本地文件到HDFS:

hdfs dfs -put /root/data/xxx.txt /bigdata

使用java -jar 实现文件上传/下载:

java -jar /root/data/xxx.jar /opt/xxxxxx.txt

使用hdfs -jar 实现文件上传/下载:

hdfs -jar /root/data/xxx.jar /opt/xxxxxx.txt

使用yarn -jar 实现文件上传/下载:

yarn -jar /root/data/xxx.jar /opt/xxxxxx.txt

操作
将Hadoop环境配置到Windows。

创建Maven项目,使用Java编写HDFS的API

package com.cssl.bigdata6;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class HdfsJavaAPI {

    public static void main(String[] args) {
        try {
            //new HdfsJavaAPI().getFileFromHDFS();
            //java -jar HdfsJavaAPI /addr/xxx.txt
            new HdfsJavaAPI().getFileFromHDFS(args[0]);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //上传到hdfs
    public void putFileFromLocal() throws IOException {
        Configuration hdfs_conf = new Configuration();
        hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
        hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");

        FileSystem fs = null;
        FileInputStream fis = null;
        FSDataOutputStream fos = null;
        try {
            // 1、获取文件操作类
            fs = FileSystem.get(hdfs_conf);
            //2、读入本地数据进内存
            fis = new FileInputStream("D:\\song.txt");
            //3、写出内存数据至hdfs
            fos = fs.create(new Path("/abc.txt"));
            //4、输入流对接输出流
            IOUtils.copyBytes(fis,fos,1024 * 8);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            fos.close();
            fis.close();
            fs.close();
        }
    }

    //从hdfs下载到本地
    public void getFileFromHDFS(String target_local) throws IOException {
        Configuration hdfs_conf = new Configuration();
        hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
        hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");

        FileSystem fs = null;
        FileOutputStream fos = null;
        FSDataInputStream fis = null;
        try {
            // 1、获取文件操作类
            fs = FileSystem.get(hdfs_conf);
            //2、读入HDFS数据进内存
            fis = fs.open(new Path("/abc.txt"));
            //3、写出内存数据至本地
            fos = new FileOutputStream(target_local);
            //4、输入流对接输出流
            IOUtils.copyBytes(fis,fos,1024 * 8);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            fos.close();
            fis.close();
            fs.close();
        }
    }
}

Java API运用工具类

package com.cssl.bigdata6;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;

public class HdfsJavaHighApi {
    public static void main(String[] args) {
        try {
            HdfsJavaHighApi.putFileFromLocal(args[0],args[1]);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void putFileFromLocal(String source_path,String target_path) throws IOException {
        Configuration hdfs_conf = new Configuration();
        hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
        hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");

        FileSystem fs = null;
        try {
            // 1、获取文件操作类
            fs = FileSystem.get(hdfs_conf);
            //从本地上传到hdfs
            fs.copyFromLocalFile(new Path(source_path),new Path(target_path));
            //fs.copyFromLocalFile(new Path("D:\\M\\music\\English music\\Chris Medina - What Are Words.flac"),new Path("/English.flac"));
            //从hdfs下载到本地
            //fs.copyToLocalFile(new Path("/English.flac"),new Path("D:/a.flac"));
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            fs.close();
        }
    }
}

HDFS角色
NameNode(NN):元数据节点。管理文件系统的Namespace/元数据。一个HDFS集群只能有一个Active的NN。
DataNode(DN):数据节点。数据存储节点,保存和检索Block。一个集群可以有多个数据节点。
Secondary NameNode(SNN):从元数据节点。合并NameNode的edit logs到fsimage文件中。辅助NN将内存中元数据信息持久化。
HDFS副本机制:
Block数据块:HDFS最基本的存储单元。默认块大小:128M(2.x)。
副本机制:作用(避免数据丢失),副本数默认为3,存放机制(一个在本地机架节点,一个在同一机架不同节点,一个在不同机架的节点)。
HDFS高可用
HDFS读文件过程
读是并发读,client同时读取所有需要的DataNode上的数据块,然后再自己合并。
HDFS写文件过程
写不是并发写,而是client先找最近的DataNode(不一定是要写入进的那个DataNode),这个DataNode再找离它最近的,依次传递直至找到要写入的节点,完成这一个数据块的写入后,client再写入下一个数据块(寻找第二个要写入的DataNode),直至写入整个文件。

大数据
Hadoop
HDFS
  • 作者:年轻的空指针(联系作者)
  • 发表时间:2022-07-05 14:44
  • 版权声明:严禁商用,转载请注明出处
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论