HDFS HA 搭建
目录
一、搭建高可用集群
NameNode-1 | NameNode-2 | DataNode | Zookeeper | ZKFC | JouralNode | |
---|---|---|---|---|---|---|
Node01 | * | * | * | * | * | |
Node02 | * | * | * | * | * | |
Node03 | * | * | * |
PS:HDFS HA基于MySQL和 Zookeeper使用 。
如果未安装:
链接: MySQL安装 :. https://blog.csdn.net/weixin_43660536/article/details/118033294
链接: ZooKeeper安装:. https://blog.csdn.net/weixin_43660536/article/details/118369963
1、准备安装环境
-
[root@node01 ~]# tar -zxvf hadoop-3.1.2.tar.gz [root@node01 ~]# mv hadoop-3.1.2 /opt/yjx/ [root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/
2、修改集群环境
-
[root@node01 hadoop]# vim hadoop-env.sh
-
##直接在文件的最后添加 export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_ZKFC_USER=root export HDFS_JOURNALNODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
-
3、修改配置文件
-
[root@node01 hadoop]# vim core-site.xml
-
<property> <name>fs.defaultFS</name> <value>hdfs://hdfs-yjx</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/yjx/hadoop/ha</value> </property> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node01:2181,node02:2181,node03:2181</value> </property>
-
-
[root@node01 hadoop]# vim hdfs-site.xml
-
<property> <name>dfs.nameservices</name> <value>hdfs-yjx</value> </property> <property> <name>dfs.ha.namenodes.hdfs-yjx</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.hdfs-yjx.nn1</name> <value>node01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.hdfs-yjx.nn2</name> <value>node02:8020</value> </property> <property> <name>dfs.namenode.http-address.hdfs-yjx.nn1</name> <value>node01:9870</value> </property> <property> <name>dfs.namenode.http-address.hdfs-yjx.nn2</name> <value>node02:9870</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03:8485/hdfs-yjx</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/yjx/hadoop/ha/qjm</value> </property> <property> <name>dfs.client.failover.proxy.provider.hdfs-yjx</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <value>shell(true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property>
-
-
[root@node01 hadoop]# vim workers
-
node01 node02 node03
-
4、拷贝分发软件
-
将配置好的软件分发到其他主机
-
[root@node02 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/ [root@node03 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/
-
5、修改环境变量
-
[root@node01 hadoop]# vim /etc/profile
-
export HADOOP_HOME=/opt/yjx/hadoop-3.1.2 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
-
-
将环境变量拷贝到其他主机
-
[root@node01 yjx]# scp /etc/profile root@node02:/etc/profile [root@node01 yjx]# scp /etc/profile root@node03:/etc/profile
-
-
重新加载三台服务器的环境变量
-
【123】# source /etc/profile
-
6、首先启动Zookeeper
- 【123】zkServer.sh start
- 【123】zkServer.sh status
7、启动JournalNode
- 【123】 hdfs --daemon start journalnode
8、格式化NameNode
- [root@node01 yjx]# hdfs namenode -format
- [root@node01 yjx]# hdfs --daemon start namenode
- [root@node02 yjx]# hdfs namenode -bootstrapStandby
- [root@node01 yjx]# hdfs zkfc -formatZK
- [root@node01 yjx]# start-dfs.sh
9、关闭集群
-
[root@node01 ~]# stop-dfs.sh
-
Stopping namenodes on [node01] Last login: Fri Oct 30 22:06:20 CST 2020 on pts/0 node01: Warning: Permanently added 'node01,192.168.88.101' (ECDSA) to the list of known hosts. Stopping datanodes Last login: Fri Oct 30 22:16:34 CST 2020 on pts/0 node03: Warning: Permanently added 'node03,192.168.88.103' (ECDSA) to the list of known hosts. node02: Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts. node01: Warning: Permanently added 'node01,192.168.88.101' (ECDSA) to the list of known hosts. Stopping secondary namenodes [node02] Last login: Fri Oct 30 22:16:35 CST 2020 on pts/0 node02: Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.
-
-
关机拍摄快照
- [123]# shutdown -h now
10、重启测试集群
启动:
- 【123】zkServer.sh start
- [root@node01 yjx]# start-dfs.sh
测试
- http://node01:9870
- http://node02:9870
- [root@node01 ~]# hdfs dfs -mkdir -p /yjx
- [root@node01 ~]# hdfs dfs -put zookeeper-3.4.5.tar.gz /yjx/
- [root@node01 ~]# hdfs dfs -D dfs.blocksize=1048576 -put zookeeper-3.4.5.tar.gz /yjx/
二、访问Hadoop集群
1、Java访问
-
window系统的环境变量配置
-
解压hadoop-3.1.2.tar.gz,将解压后的文件夹存放到自己软件目录
- 例如:D:\software\hadoop-3.1.2
-
解压winutils-master.zip,找到3.1.2版本
- 将所有的文件覆盖到D:\software\hadoop-3.1.2\bin目录
-
将winutils.exe和hadoop.dll文件拷贝到 C:\Windows\System32目录下
-
-
环境变量
-
将Hadoop添加到环境变量
- HADOOP_HOME–>D:\software\hadoop-3.1.2
- HADOOP_USER_NAME–>root
- Path --> %HADOOP_HOME%\bin;%HADOOP_HOME%\sbin;
-
JDK的版本也设置的和服务器版本一致
-
修改当前Window的hosts文件
- C:\Windows\System32\drivers\etc\hosts
- 192.168.88.101 node01
192.168.88.102 node02
192.168.88.103 node03
-
拷贝Hadoop的配置文件
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
-
打开Idead,创建一个普通的Maven项目
-
添加pom.xml
-
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- Hadoop版本控制 --> <hadoop.version>3.1.2</hadoop.version> <!-- commons-io版本控制 --> <commons-io.version>2.4</commons-io.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-common --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-jobclient--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> </dependencies>
-
package com.yjx; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; import java.util.Arrays; public class Hello01HDfs { /** * 文件信息 * * @throws IOException */ private static void pathInfo() throws IOException { //加载配置文件 Configuration configuration = new Configuration(true); //获取文件系统 FileSystem fileSystem = FileSystem.get(configuration); //创建路径的Path对象 Path path = new Path("/yjx/hadoop-3.1.2.tar.gz"); boolean flag = fileSystem.exists(path); System.out.println(fileSystem.getDefaultBlockSize(path) / 1024 / 1024); System.out.println(fileSystem.getDefaultReplication(path)); BlockLocation[] bls = fileSystem.getFileBlockLocations(path, 0, 10); for (BlockLocation blockLocation : bls) { System.out.println("HelloHdfs.hello(============================1)"); System.out.println(blockLocation.getLength()); System.out.println(blockLocation.getOffset()); System.out.println(Arrays.toString(blockLocation.getHosts())); System.out.println(Arrays.toString(blockLocation.getNames())); System.out.println(blockLocation.toString()); System.out.println("HelloHdfs.hello(============================2)"); } } /** * 文件上傳和下載 * * @throws IOException */ private static void upload_download() throws IOException { //加载配置文件 Configuration configuration = new Configuration(true); //获取文件系统 FileSystem fileSystem = FileSystem.get(configuration); //文件上傳 // Path srcPath = new Path("D:\\apache-tomcat-8.5.47-windows-x64.zip"); // Path destPath = new Path("/yjx/"); // fileSystem.copyFromLocalFile(srcPath, destPath); //文件下載 Path localPath = new Path("D:\\"); Path hdfsPath = new Path("/yjx/apache-tomcat-8.5.47-windows-x64.zip"); fileSystem.copyToLocalFile(hdfsPath, localPath); } }
-
-
2、Idea访问
-
将HadoopIntellijPlugin-1.0.zip文件放到Idea的插件目录
- D:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\plugins
-
打开Idea添加插件,然后重启Idea
-
配置HDFS
附录:配置文件详解
1、core-site.xml
core-site.xml配置文件的作用:
用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置。
fs.defaultFS 参数的作用:
#声明namenode的地址,相当于声明hdfs文件系统。我们可以指定某个ip地址,在ha模式中我们通常指定hdfs集群的逻辑名称
hadoop.tmp.dir 参数的作用:
#声明hadoop工作目录的地址。
hadoop.http.staticuser.user 参数的作用:
#在网页界面访问数据使用的用户名。默认值是一个不真实存在的用户,此用户权限很小,不能访问不同用户的数据。这保证了数据安全。也可以设置为hdfs和hadoop等具有较高权限的用户,但会导致能够登陆网页界面的人能看到其它用户数据。实际设置请综合考虑。如无特殊需求。使用默认值就好.
ha.zookeeper.quorum 参数的作用:
#指定zookeeper集群的地址,让zookeeper帮我们管理hdfs集群。
2、hdfs-site.xml
hdfs-site.xml 配置文件的作用:
#HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置.
dfs.replication 参数的作用:
#为了数据可用性及冗余的目的,HDFS会在多个节点上保存同一个数据块的多个副本,其默认为3个。而只有一个节点的伪分布式环境中其仅用
保存一个副本即可,这可以通过dfs.replication属性进行定义。它是一个软件级备份。
dfs.nameservices 参数的作用:
#指定一个逻辑名称,该名称会自动去帮我们找打真实NameNode节点,这和咱们的keepalive的VIP有点类似!这个名称咱们可以自定义!但是我们正在引用时千万别引用错了!
dfs.ha.namenodes.yinzhengjie-hdfs 参数的作用:
#看到没,上面我们定义了dfs.nameservices的名称,现在我们就用到了,我们把定义的逻辑名称指向了各个namenode的别名
dfs.namenode.rpc-address.yinzhengjie-hdfs.namenode1 参数的作用:
#定义远程主机调用的服务器地址。
dfs.namenode.http-address.yinzhengjie-hdfs.namenode1 参数的作用:
#上面我们定义了集群的逻辑名称,也定义节点的逻辑名称,但是真正的ip地址我们始终没有指定,因此我们这一步骤就是指定dfs.namenode.rpc-address.yinzhengjie-hdfs.namenode1对应的IP地址。当然你写主机名称也是可以的,只不过嘛你得在/etc/hosts文件做映射或者配置DNS中有对应的A记录哟!
dfs.namenode.shared.edits.dir 参数的作用:
#配置JournalNode集群的地址。
dfs.client.failover.proxy.provider.yinzhengjie-hdfs 参数的作用:
#配置故障转移的代理类,这是HDFS客户端找到active NameNode类名的一个代理类,如果你不配置这个项的话,那么客户端连接active namenode地址时会报错!实际上故障转移就是通过这个代理类来实现的,我们只需要默认官网的配置即可!不需要手动修改!
dfs.ha.fencing.methods 参数的作用:
#指定ha出现故障时的隔离方法!
dfs.ha.fencing.ssh.private-key-files 参数的作用:
#指定隔离主机的私钥PATH。
dfs.journalnode.edits.dir 参数的作用:
#指定JN节点存放编辑日志的目录。
dfs.ha.automatic-failover.enabled 参数的作用:
#开启自动故障转移功能.
– dfs.name.dir
– NameNode 元数据存放位置
– 默认值:使用core-site.xml中的hadoop.tmp.dir/dfs/name
– dfs.block.size
– 对于新文件切分的大小,单位byte。默认是64M,建议是128M。每一个节点都要指定,包括客户端。
– 默认值:67108864
– dfs.data.dir
– DataNode在本地磁盘存放block的位置,可以是以逗号分隔的目录列表,DataNode循环向磁盘中写入数据,每个DataNode可单独指定与其它DataNode不一样
– 默认值:${hadoop.tmp.dir}/dfs/data
– dfs.namenode.handler.count
– NameNode用来处理来自DataNode的RPC请求的线程数量
– 建议设置为DataNode数量的10%,一般在10~200个之间
– 如设置太小,DataNode在传输数据的时候日志中会报告“connecton refused"信息
– 在NameNode上设定
– 默认值:10
– dfs.datanode.handler.count
– DataNode用来连接NameNode的RPC请求的线程数量
– 取决于系统的繁忙程度
– 设置太小会导致性能下降甚至报错
– 在DataNode上设定
– 默认值:3
– dfs.datanode.max.xcievers
– DataNode可以同时处理的数据传输连接数
– 默认值:256
– 建议值:4096
– dfs.permissions
– 如果是true则检查权限,否则不检查(每一个人都可以存取文件)
– 于NameNode上设定
– 默认值:true
– dfs.datanode.du.reserved
– 在每个卷上面HDFS不能使用的空间大小
– 在每个DataNode上面设定
– 默认值:0
– 建议为10737418240,即10G。需要结合MapReduce场景设置。
– dfs.datanode.failed.volumes.tolerated
– DataNode可以容忍损块的磁盘数量,超过这个数量DataNode将会离线,所有在这个节点上面的block将会被重新复制
– 默认是0,但是在有多块磁盘的时候一般会增大这个值
– dfs.replication
– 在文件被写入的时候,每一块将要被复制多少份
– 默认是3份。建议3份
– 在客户端上设定
通常也需要在DataNode上设定
2、HDFS core-site.xml 参数配置
– fs.default.name
– 文件系统的名字。通常是NameNode的hostname与port
– 需要在每一个需要访问集群的机器上指定,包括集群中的节点
– 例如:hdfs://<your_namenode>:9000/
– fs.checkpoint.dir
– 以逗号分隔的文件夹列表,SecondNameNode用来存储checkpoint image文件
– 如果多于一个文件夹,那么都会被写入数据
– 需要在SecondNameNode上设定
– 默认值:${hadoop.tmp.dir}/dfs/namesecondary
– hadoop.tmp.dir
– HDFS与本地磁盘的临时文件
默认是/tmp/hadoop-${user.name}.需要在所有的节点中设定
– fs.trash.interval
– 当一个文件被删掉后,它会被放到用户目录的.Trash目录下,而不是立即删掉
– 经过此参数设置的分钟数之后,再删掉数据
– 默认是0,禁用此功能,建议1440(一天)
– io.file.buffer.size
– 设定在读写数据时的缓存大小,应该为硬件分页大小的2倍
– 默认是4096,建议为65536 ( 64K)