hadoop(集群,hdfs迁移,增加节点)
1.准备三台机器(jdk已安装 java version “1.8.0_191”)
192.168.94.10 hp1
192.168.94.11 hp2
192.168.94.12 hp3
#配置免密
三台机器都要执行
ssh-keygen #生成公钥,私钥
ssh-copy-id hp1
ssh-copy-id hp2
ssh-copy-id hp3
2.在hp1上传解压
tar -xvf hadoop-2.8.5.tar.gz -C /opt
mv hadoop-2.8.5 hadoop
3.配置环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
4.配置hadoop环境脚本的java_home
cd /opt/hadoop/etc/hadoop
vim hadoop-env.sh
export JAVA_HOME=/opt/jdk
vim mapred-env.sh
export JAVA_HOME=/opt/jdk
vim yarn-env.sh
export JAVA_HOME=/opt/jdk
5.创建hadoop存储目录
mkdir -p /hadoop_data/tmp
mkdir -p /hadoop_data/dfs/name
mkdir -p /hadoop_data/dfs/data
6.配置主从节点列表
cd /opt/hadoop/etc/hadoop
vim slaves
hp1
hp2
hp3
7.修改hadoop配置文件
7.1普通集群配置
cd /opt/hadoop/etc/hadoop
#修改core-site.xml----------------------------------------------------------------
vim core-site.xml
<configuration>
<!-- 指定namenode的hdfs协议的文件系统通信地址,默认是file:///本地文件系统 需要我们改成 hdfs://分布式文件存储系统 -->
<!-- 可以指定一个主机+端口,也可以指定为一个namenode服务(这个服务内部可以有多台namenode实现ha的namenode服务) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hp1:9000</value>
</property>
<!-- 临时数据存放的位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop_data/tmp</value>
</property>
<!-- 缓冲区大小,实际工作中根据服务器性能动态调整 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 10080 相当与7天 60*24*7-->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
#修改hdfs-site.xml----------------------------------------------------------------
vim hdfs-site.xml
<configuration>
<!-- NameNode 数据的存放地点。也就是namenode元数据存放的地方,记录了hdfs系统中文件的元数据-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop_data/dfs/name</value>
</property>
<!-- NameNode 的访问地址 -->
<property>
<name>dfs.namenode.http-address</name>
<value>hp1:50070</value>
</property>
<!-- DataNode 数据的存放地点。也就是block块存放的目录了-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hadoop_data/dfs/data</value>
</property>
<!-- HDFS 的副本数设置。也就是上传一个文件,其分割为block块后,每个block的冗余副本个数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- HDFS 的权限控制 -->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!-- 文件存储的block块大小 -->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<!-- 开启hdfs的web访问接口。默认端口是50070 , 一般不配 , 使用默认值-->
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
#修改yarn-site.xml----------------------------------------------------------------
vim yarn-site.xml
<configuration>
<!-- NodeManager的通信方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 日志的聚合功能,方便我们查看任务执行完成之后的日志记录 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 聚合日志的保存时长 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!--yarn总管理器的IPC通讯地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>hp1:8032</value>
</property>
<!--yarn总管理器调度程序的IPC通讯地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hp1:8030</value>
</property>
<!--yarn总管理器的IPC通讯地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hp1:8031</value>
</property>
<!--yarn总管理器的IPC管理地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hp1:8033</value>
</property>
<!--yarn总管理器的web http通讯地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hp1:8088</value>
</property>
</configuration>
#修改mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式,Hadoop二代MP也基于资源管理系统Yarn来运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 开启mapreduce的小任务模式,用于调优 -->
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<!-- 配置mapreduce的jobhistory内部通讯地址。可以查看我们所有运行完成的任务的一些情况 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hp1:10020</value>
</property>
<!-- 配置mapreduce 的jobhistory的访问地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hp1:19888</value>
</property>
</configuration>
7.2.高可用集群配置与启动方式
#core-site.xml-----------------------------------------------------------------
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/hadoop_data/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hp1:2181,hp2:2181,hp3:2181</value>
</property>
</configuration>
#hdfs-site.xml-------------------------------------------------------------------
<configuration>
<!-- 设置副本个数 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 设置namenode.name目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop_data/dfs/name</value>
</property>
<!-- 设置namenode.data目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hadoop_data/dfs/data</value>
</property>
<!-- 开启webHDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
</property>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>hp1,hp2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.hp1</name>
<value>hp1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.hp1</name>
<value>hp1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.hp2</name>
<value>hp2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.hp2</name>
<value>hp2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hp1:8485;hp2:8485;hp3:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider </value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/coffee/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
#mapred-site.xml---------------------------------------------------------------
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
#yarn-site.xml----------------------------------------------------------------
<configuration>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hp1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hp2</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hp1:2181,hp2:2181,hp3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
#集群配置启动
#1.分发包
scp /opt/hadoop hp2:/opt
scp /opt/hadoop hp3:/opt
#2.启动journalnode(三个节点都要启动)
cd /opt/hadoop
sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,JournalNode进程
jps
#3.格式化HDFS
#在hp1上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/hadoop_data/tmp,然后将/hadoop_data/tmp拷贝到hp2的/hadoop_data/tmp/下。
scp -r tmp hp2:/hadoop_data/
##也可以这样,建议 在害hp2 上执行
hdfs namenode -bootstrapStandby
#4.格式化ZKFC(hp1上执行)
hdfs zkfc -formatZK
#5.启动
sbin/start-all.sh
#到此,hadoop-2.8.5配置完毕,可以统计浏览器访问:
http://192.168.94.10:50070
NameNode 'hp1:9000' (active)
http://192.168.94.11:50070
NameNode 'hp2:9000' (standby)
8.分发安装包
scp /opt/hadoop hp2:/opt
scp /opt/hadoop hp3:/opt
9.格式化
#在hp1上格式化hdfs
hdfs namenode -format
10.启动hadoop
start-all.sh
#停止命令
stop-all.sh
11.hdfs跨集群迁移
11.1.查看hdfs端口
在Hadoop配置文件中查看core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.94.10:9000</value>
</property>
</configuration>
11.2.查看hdfs文件大小
#列出所有hdfs文件
hdfs dfs -ls /
#查看hdfs文件大小
hdfs dfs -du -h /
11.3.使用distcp迁移数据(如迁移服务器10上的jdk到服务器11)
hadoop distcp hdfs://192.168.94.10:9000/jdk hdfs://192.168.94.11:9000/
11.4.验证
#1.可以在10上的yarn上查看任务是否成功
http://192.168.94.10:8088/cluster/apps
#2.在服务器11上查看文件的大小进行对比
hdfs dfs -du -h /
12.集群增加节点
备份hdfs文件(如增加192.68.94.13 hp4)
hdfs dfs -get [-ignoreCrc] [-crc] < src> < localdst>
12.1.修改每个节点的hosts文件
vim /etc/hosts
#添加新增的节点映射
192.68.94.13 hp4
12.2.在每个节点上配置ssh免密登录,使得namenode登录新节点的时候不需要输入密码。
#原有节点桑执行
ssh-copy-id ip(新增的IP)
ssh-copy-id hp4
#新增节点执行
ssh-keygen
ssh-copy-id ip(原集群节点IP和自身IP)
12.3.修改各节点的slaves文件,加入新节点的名称。
vim /hadoop/etc/hadoop/slaves
hp1
hp2
hp3
hp4
12.4.单独启动该节点上的Datanode进程和NodeManager进程。
hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager
12.5.在web ui上验证(或者使用 hadoop dfsadmin -report)
12.6.问题,没有在web ui上体现
#刷新节点
hdfs dfsadmin -refreshNodes
#均衡节点数据
start-balancer.sh
#查看集群节点
hdfs dfsadmin -report