大数据基础之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

(3)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的文件(12810241024)
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 dfs)

(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.0\conf\settings.xml
55行:
<localRepository>E:\Maven\m2\Repository</localRepository>
MaveHome:E:\apache-maven-3.6.0
User settings:E:\apache-maven-3.6.0\conf\settings.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命令的使用

Java代码:

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

cmd命令:
java -DP=hdfshdfs DP

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

使用多个参数,如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 null\bin\winutils.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.3\bin文件下
hadoop.home.dir —bin/winutils.exe
HADOOP_HOME:D:\hadoop-2.7.3,然后再path里面增加 %HADOOP_HOME%\bin
或者: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、循环上传


文章作者: 谢舟
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 谢舟 !
 上一篇
大数据基础之HDFS2 大数据基础之HDFS2
1、HDFS下载文件原理1、请求2、创建clientDFS –>DFSClient3、建立RPC通信4、得到代理对象proxy,通过代理对象请求得到文件元信息5、查找元信息6、返回元信息7、创建输入流8、下载数据块FSDataInpu
2019-02-09
下一篇 
大数据基础2 大数据基础2
1、什么是大数据?2002 大数据提出 美国引入。—麦肯锡报告维克托·迈尔-舍恩伯格—大数据之父4V特征:即Volume(数据量大):PB级Variety(数据多样性):文本、图像、视频、音频等Velocity(输入和处理速度快):流式数据
2019-02-05
  目录