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