zoukankan      html  css  js  c++  java
  • 大数据基础之hdfs1

    1、免密码登录的原理和配置

    ssh不对称加密算法(加密和解密是两个文件)(对称加密: 加密和解密文件是同一个)
    (1)公钥–锁:给出去 给其他机器
    (2)私钥–钥匙:自己留着,解密
    step1:ssh-keygen -t rsa(3次回车)
    step2:ssh-copy-id -i ~/.ssh/id_rsa.pub root@hsiehchou121(自己也要拷贝给自己)

    2、Hadoop安装—全分布模式 (重点)

    (1)规划:
    192.168.116.121 hsiehchou121 :主节点
    192.168.116.122 hsiehchou122 :从节点
    192.168.116.123 hsiehchou123 :从节点
    192.168.116.124 hsiehchou124 :从节点
    (2)准备工作:
    step 1: jdk、防火墙、ssh免密码登录(3次拷贝)、在etc/hosts 添加主机名
    对于同时操作多台机器可通过 工具-》发送键输入到所有会话 在选项卡排列 实现 水平排列
    step 2:时间同步(如果能够上网) 使用网络时间(GUI设置)默认的都是一致的
    不能上网: date -s 2019-01-10(同时操作多台机器) 集群紊乱
    ntp:在机器里面指定一个服务器 作为时钟服务器
    step 3: 修改配置文件()

    主要在hsiehchou 121操作,其他机器通过scp拷贝

    3、slaves(和自己的从节点机器名字一致)

    hsiehchou122
    hsiehchou123
    hsiehchou124

    4、通过HDFS namenode 格式化

    hdfs namenode -format
    成功的标志: Storage directory /opt/module/hadoop-2.7.3/tmp/dfs/name has been successfully formatted

    5、通过scp拷贝

    scp -r /opt/module/hadoop-2.7.3/ root@hsiehchou122:/opt/module/
    scp -r /opt/module/hadoop-2.7.3/ root@hsiehchou123:/opt/module/
    scp -r /opt/module/hadoop-2.7.3/ root@hsiehchou124:/opt/module/

    学会看 vi /opt/module/hadoop-2.7.3/logs/hadoop-root-datanode-hsiehchou123.log
    Shift+G 看启动日志
    HDFS体系架构(Yarn资源放在后面)

    6、HDFS-NameNode:名称节点

    (1)职责:对HDFS的节点进行管理,管理员
    接收客户端(命令行、java)的请求:创建目录、上传数据、下载数据和删除数据
    管理和维护HDFS的日志和元信息
    (2)dfs/name:
    a、current:主要存放日志和元信息 存贮路径:/opt/module/hadoop-2.7.3/tmp/dfs/name/current
    edits文件:二进制文件,体现了HDFS的最新状态

    hdfs oev -i edits_inprogress_0000000000000000003 -o ~/a.xml

    o:表示 offline
    inprogress:表示最新的

    <?xml version="1.0" encoding="UTF-8"?>
    <EDITS>
    <EDITS_VERSION>-63</EDITS_VERSION>
    <RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>
    <DATA>
    <TXID>4</TXID>
    </DATA>
    </RECORD>
    <RECORD>
    <OPCODE>OP_MKDIR</OPCODE>
    <DATA>
    <TXID>5</TXID>
    <LENGTH>0</LENGTH>
    <INODEID>16386</INODEID>
    <PATH>/input</PATH>
    <TIMESTAMP>1550209288319</TIMESTAMP>
    <PERMISSION_STATUS>
    <USERNAME>root</USERNAME>
    <GROUPNAME>supergroup</GROUPNAME>
    <MODE>493</MODE>
    </PERMISSION_STATUS>
    </DATA>
    </RECORD>
    </EDITS>

    b、元信息文件 fsimage:记录的数据块的位置信息和数据块冗余信息,没有体现HDFS的最新状态,二进制文件

    hdfs oiv -i fsimage_0000000000000000002 -o ~/b.xml -p XML

    (2)in_use.lock 避免同一文件被多使用,只能启动一个namenode

    7、HDFS-DataNode:数据节点

    (1)主要用来进行数据的存储。
    1.x 64M
    2.x 128M( hdfs-site.xml 可以修改 blocksize)
    (2)数据块的表现形式就是一个个的blk文件
    位置:/opt/module/hadoop-2.7.3/tmp/dfs/data/current/BP-298124919-192.168.116.121-1550208140930 ###/current/finalized/subdir0/subdir0
    尝试上传一个 大于128M的文件(128*1024*1024)
    Hadoop 3.x 有 纠删码技术,节约存储空间

    8、上传文件

    首先创建文件夹
    hdfs dfs -mkdir /software/input
    上传我本地文件到hdfs上
    hdfs dfs -put hdfs dfs -put /opt/software/hadoop-2.7.3.tar.gz /software/input
    就OK了
    之后可以使用上面的命令查看

    9、HDFS-SecondaryNameNode:第二名称节点

    (1)进行日志信息的合并,根据checkpoint或者时间间隔(3600s)或者edits文件达到64M
    (2)edits文件合并到fsimage里面 edits文件可以清空

    看日志
    /opt/moudle/hadoop-2.7.3/logs vi shift+G

    10、HDFS-Web Console

    hdfs dfsadmin -report
    http://192.168.116.125:50070/dfshealth.html#tab-overview
    (1) Overview–展示HDFS的基本信息
    Safemode is off.—高级特性
    (2)DataNodes-数据节点信息
    增加和删除数据节点(Decomissioning–>Dead)
    (3)Datanode Volume Failures–数据节点 硬件错误
    (4)Snapshot(快照)—高级特性
    快照实现数据的备份,防止数据的误操作和丢失。默认是关闭的。
    (5)Startup Progress–启动过程
    (6)Uitlities:
    Browse 文件 —hdfs -dfs -ls /
    logs—查看日志

    11、HDFS 普通操作命令–hdfs dfs(hadoop fs)

    (1)创建目录–mkdir
    hdfs dfs -mkdir /
    (2)查看–ls
    查看目录和子目录 hdfs dfs -ls -R /
    hdfs dfs -lsr /
    (3)上传数据
    hdfs dfs -put hadoop-root-namenode-hsiehchou125.log /test1
    -put :
    -copyFromLocal: 本地路径 hdfs路径
    hdfs dfs -copyFromLocal ~/temp/a.txt /test0113/
    -moveFromLocal: 会删除本地文件 剪切
    (4)下载数据
    -get:
    -copyToLocal:从HDFS下载到本地
    (5)删除数据
    -rm
    -rmr: 删除HDFS的目录和子目录
    删除日志: Deleted /test1
    回收站—高级特性 默认是关闭。
    (6)合并数据–(为hive表数据操作做准备。)
    -getmerge :hdfs 把某个HDFS的目录下的文件进行先合并后下载
    *:通配符 ?
    hdfs dfs -getmerge /students /root/students.txt
    (7)计数和文件大小
    -count 显示 文件夹、文件个数 文件总的大小
    -du 显示每个文件夹和文件的大小
    [root@hsiehchou125 ~]# hdfs dfs -count /students
    1 4 38/students
    hdfs[root@hsiehchou125 ~]# hdfs dfs -du /students
    25 /students/students01.txt
    13 /students/students02.txt
    (8)负载均衡 balancer
    实现datanode 数据存储均衡
    ## hdfs balancer ##

    12、HDFS 管理员命令

    (1)hdfs dfsadmin -report 打印报告
    (2) -safemode <enter | leave | get | wait>
    enter:手动进入安全模式
    leave:手动离开安全模式
    get:获得当前安全模式的状态
    hdfs dfsadmin -safemode get
    [root@hsiehchou125 ~]# hdfs dfsadmin -safemode enter
    Safe mode is ON
    (3)快照命令

    [-allowSnapshot <snapshotDir>]
    [-disallowSnapshot <snapshotDir>]

    (4)Quota 配额
    a、名称配额–数量

    [-setQuota <quota> <dirname>...<dirname>]
    [-clrQuota <dirname>...<dirname>]

    b、空间配额–空间大小

    [-setSpaceQuota <quota> [-storageType <storagetype>] <dirname>...<dirname>]
    [-clrSpaceQuota [-storageType <storagetype>] <dirname>...<dirname>]

    13、IDEA Maven工程简介

    (1)IDEA 下载地址:
    https://www.jetbrains.com/idea/download/
    破解方法自行查找
    (2)File-new Project->Maven
    GroupID: 公司名字
    artifactId:工程名字。
    java程序在:src-》main->java 右键 新建 java class文件
    target: 是运行程序生成的class文件
    (3)管理包
    /opt/moudle/hadoop-2.7.3/share/hadoop/common/*.jar
    /opt/moudle/hadoop-2.7.3/share/hadoop/common/lib/*.jar
    /opt/moudle/hadoop-2.7.3/share/hadoop/hdfs/*.jar
    /opt/moudle/hadoop-2.7.3/share/hadoop/hdfs/lib/*.jar
    通过maven只需要配置POM文件
    a、 下载一个maven版本
    http://maven.apache.org/index.html
    b、通过 File-settings-Maven
    修改: E:apache-maven-3.6.0confsettings.xml
    55行:

    <localRepository>E:Mavenm2Repository</localRepository>
    MaveHome:E:apache-maven-3.6.0
    User settings:E:apache-maven-3.6.0confsettings.xml

    c、POM中写入包的依赖
    参考:https://mvnrepository.com/search?q=hadoop

    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.7.3</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.7.3</version>
    </dependency>
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.3</version>
    </dependency>
    </dependencies>

    14、文件夹的创建

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import java.io.IOException;
    public class HDFSMkDir {
    public static void main(String[] args) throws IOException {
    System.setProperty("HADOOP_USER_NAME","root");
    //step1 配置参数,指定namenode地址
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://192.168.116.125:9000");
    //step2 创建客户端
    FileSystem client = FileSystem.get(conf);
    //step3 创建目录
    client.mkdirs(new Path("/test2"));
    client.close();
    System.out.println("Successful");
    }
    }

    15、HDFS权限问题

    针对用户操作没有权限 permission denied:

    (1)修改 hdfs-site.xml 去掉权限检查(关闭HDFS服务 stop-all.sh;修改后 重新 Start-all.sh)

    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>

    (2)通过设定用户名字 rootSystem.setProperty(“HADOOP_USER_NAME”,”root”);

    (3)通过java的-D参数传递。 HADOOP_USER_NAME=root (命令行的方式)
    public static void main(String[] args)

    Java -D命令对应的代码中获取-D后面的参数 和 多个参数时-D命令的使用

    1. Java代码:

    public class DP {
    public static void main(String[] args) {
    String fg = System.getProperty("P");
    System.err.println(fg);
    }
    }
    1. cmd命令:

    java -DP=hdfshdfs DP

    执行命令后输出:hdfshdfs
    注意:-D和Para之间不能有空格

    1. 使用多个参数,如P、P1

    public class DP {
    public static void main(String[] args) {
    String fg = System.getProperty("P");
    System.out.println(fg);
    String fg1 = System.getProperty("P1");
    System.out.println(fg1);
    }
    }

    java -DP=hdfshdfs -DP1=1212 DP
    执行命令后输出:
    hdfshdfs
    1212

    (4)hdfs dfs -chmod 777 /input 让所有用户访问

    (5)针对HDFS权限问题,有kerberos认证
    Kerberos: The Network Authentication Protocol
    https://www.cnblogs.com/wukenaihe/p/3732141.html

    16、IDEA Maven工程实现HDFS的文件上传与下载

    Maven环境中 只有当 POM文件中所有的依赖包全部变成白色。
    pom.xml

    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.7.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.7.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core -->
    <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>1.2.1</version>
    </dependency>
    </dependencies>

    (1)HDFS文件上传
    查看源码:crtl+鼠标左键
    ## Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries. ##
    step1:
    下载:hadoop2.7.3 winutils binary
    https://github.com/rucyang/hadoop.dll-and-winutils.exe-for-hadoop2.7.3-on-windows_X64
    step2: 配置环境变量 拷贝进入 D:hadoop-2.7.3in文件下。
    hadoop.home.dir —bin/winutils.exe
    HADOOP_HOME:D:hadoop-2.7.3,然后再path里面增加 %HADOOP_HOME%in
    或者:System.setProperty(“hadoop.home.dir”, “D:hadoop-2.7.3”);

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import java.io.*;
    public class HDFSUpload {
    public static void main(String[] args) throws IOException {
    System.setProperty("HADOOP_USER_NAME","root");
    //System.setProperty("hadoop.home.dir","E:\hadoop-2.7.3");
    //step1 建立客户端
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://192.168.116.125:9000");
    //使用IP地址 因为没有指定hsiehchou125对应的IP
    FileSystem client = FileSystem.get(conf);
    //step2 创建本地数据 hdfs dfs -put copyFromLocal
    File file1 = new File("C:\Users\hsiehchou\Desktop\hadooplibs\test.txt");
    InputStream input = new FileInputStream(file1);//多态
    //step3 创建本地输出流 指向HDFS
    OutputStream output = client.create(new Path("/test8/a.txt"),true);
    //step4 开始写入HDFS
    /**方法1**/
    // byte[] buffer = new byte[1024];
    // int len = 0;
    // //因为read 当读到文件末尾的时候 会返回-1
    // while((len=input.read(buffer)) != -1){
    // output.write(buffer, 0, len);
    // }//循环写入数据
    // output.flush();
    // input.close();
    // output.close();
    /**方法2 IOUtils**/
    IOUtils.copyBytes(input,output,1024);
    }
    }

    (2)HDFS文件下载
    ### 使用IOUtils 输入路径 输出路径###
    IOUtils.copyBytes(input,output,1024);

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import java.io.*;
    public class HDFSDownload {
    public static void main(String[] args) throws IOException {
    System.setProperty("HADOOP_USER_NAME","root");
    //step1 建立客户端
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://192.168.116.125:9000");
    //使用IP地址 因为没有指定hsiehchou125对应的IP
    FileSystem client = FileSystem.get(conf);
    //step2 创建数据输入 指向HDFS 从hdfs读取数据 hdfs dfs -get copyToLocal
    InputStream input = client.open(new Path("/test8/a.txt"));
    //step3 创建本地输出流 指向HDFS
    OutputStream output = new FileOutputStream("E:\test\b.txt");
    //step4 开始写入HDFS
    /**IOUtils**/
    IOUtils.copyBytes(input,output,1024);
    }
    }

    文件元信息
    {
    文件名: *.txt
    路径: /text
    大小: 100KB
    冗余度: 3
    数据块1: DNS1,DNS2,DNS3
    (如果文件大切分)
    }

    17、HDFS上传文件原理

    1、请求上传数据
    2、创建客户端
    3、建立RPC通信
    4、NameNode对象
    代理对象NameNodeProxies
    5、请求创建文件元信息
    6、创建文件元信息
    7、缓存文件元信息(1000M)
    8、返回元信息
    9、根据元信息创建输出流
    10、上传第一个数据块
    11、数据块自动复制
    12、循环上传

  • 相关阅读:
    68
    56
    Django manager 命令笔记
    Django 执行 manage 命令方式
    Django 连接 Mysql (8.0.16) 失败
    Python django 安装 mysqlclient 失败
    H.264 SODB RBSP EBSP的区别
    FFmpeg—— Bitstream Filters 作用
    MySQL 远程连接问题 (Windows Server)
    MySQL 笔记
  • 原文地址:https://www.cnblogs.com/hsiehchou/p/10403432.html
Copyright © 2011-2022 走看看