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、循环上传

  • 相关阅读:
    Android 音频播放——AudioTrack直接播PCM、MediaPlayer播媒体文件可以是audio
    Android 音频采集——MediaRecord(编码后录影文件) 、AudioRecord(PCM原始数据)
    .Net 下利用ICSharpCode.SharpZipLib.dll实现文件压缩、解压缩
    调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:Program Files (x86)HeliconISAP
    SQL1117N 因为处于 ROLL-FORWARD PENDING
    asp.net配置IIS过程错误解决
    IIS发布一些问题
    为具有端口 "50000" 的服务名称 "db2c_DB2" 而更新系统上的服务文件时出错
    IIS Server Application Unavailable
    db2堆中没有足够的存储器可用来处理语句的解决
  • 原文地址:https://www.cnblogs.com/hsiehchou/p/10403432.html
Copyright © 2011-2022 走看看