大数据基础之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
修改: D:\TZ\apache-maven-3.6.0-bin\apache-maven-3.6.0\conf\settings.xml
55行:

<localRepository>D: \TZ \m2 \Repository</localRepository>
MaveHome:D: \TZ \apache-maven-3.6.0-bin \apache-maven-3.6.0
User settings:D: \TZ \apache-maven-3.6.0-bin \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命令的使用

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

猜你喜欢

转载自www.cnblogs.com/hsiehchou/p/10391016.html