一、增加节点
- 操作系统配置:① 主机名、网络、防火墙、ssh配置
ssh-keygen -t rsa
同时可以把集群中任意一台节点的ssh的auth*-keys文件分发到最新的这个节点 - 在所有节点的/etc/hosts 文件中添加该节点的域名映射
- 把namenode的相关配置文件复制到该节点
通过 tar cf 将jdk打包并跟hadoop目录一起通过scp传输过去
将环境变量文件也scp过来,比如JAVA_HOME、HADOOP_HOME的路径 - 修改所有master节点的slaves文件,增加该节点。不需要刷新slaves文件
- 单独启动该节点上的datanode和nodemanager
hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager
启动完后通过hdfs dfsadmin -repor
检查集群的状态yarm rmadmin
- 进行数据负载均衡(避免都往这个节点写数据导致数据热点)
① 这个操作尽量在datanode节点执行
② 执行前最好限制balance的带宽且指定几台服务器
运行start-balancer.sh -threshold 5
(单个节点的使用率跟平均节点使用率的差值) - 调整节点的副本数(可选)
调整hdfs-site.xml文件里面的dfs.replication的值进行调整
通过hdfs fsck /
来扫描确认文件是否正常
进行调整后的副本数仅对后来添加的文件产生作用
也可通过hdfs dfs -setrep -w 3 -R /lin
(副本数可大于节点数,不要对根目录进行该操作)
二、节点下线
节点硬件故障或者任务运行在该节点比较吃力
下线前要先确保没有任务在运行,否则会下线得特别慢
- 修改Master节点的hdfs-site.xml配置,增加dfs.hosts.exclude参数
- 修改Master节点的yarn-site.xml配置,增加
yarn.resourcemanager.nodes.exclude-path参数 - 修改Master节点的mapred-site.xml配置,增加
mapreduce.jobtracker.hosts.exclude.filename参数 - 新建excludes文件,添加需要删除的主机名(前面三个参数都指向这个地址)
- 执行refreshNodes让配置生效
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
三、Federation
背景:存在单个Namenode负载过大的问题
分配
避免相互干扰
- 单独分配一个Namenode去管理HBase的目录
- 单独分配一个Namenode去管理数据仓库Hive的目录
- 其他的按照业务或者部门进行分配管理多个Namenode
配置步骤
-
core-site.xml
- 使用viewfs协议配置Federation集群堆外提供服务的NS逻辑名称
-
修改core-site.xml配置
添加配置指向cmt.xml <configuration xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="cmt.xml"/> <property> <name>fs.defaultFS</name> <value>viewfs://nsX</value> </property> <property> <name>hadoop.tmp.dir</name> <value>$HADOOP_HOME/tmp</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>$HADOOP_HOME/journalnode/data</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>slave1:2181,slave2:2181,hadoop04:2181</value> </property> </configuration>
-
cmt.xml
配置虚拟路径和物理路径的映射关系//将集群中的/view_ns1目录挂载到namenode1中的根目录 //也就是说之后/view_ns1下文件的操作都仅跟namenode1有关 <property> <name>fs.viewfs.mounttable.nsX.link./view_ns1</name> <value>hdfs://ns1/</value> // 按照规划master就是namenode1 </property> <property> <name>fs.viewfs.mounttable.nsX.link./view_ns2</name> <value>hdfs://ns2/</value> // 按照规划master就是namenode2 </property>
-
hdfs-site.xml
配置两个命名服务以及rpc、http服务地址<property> <name>dfs.nameservices</name> <value>ns1,ns2</value> </property> ## 配置nameservice1的ha <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> ## 配置nameservice2的ha <property> <name>dfs.ha.namenodes.ns2</name> <value>nn3,nn4</value> </property> ## 配置这四个namenode的RPC通信端口 <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>master:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ns2.nn3</name> <value>slave1:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop04:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ns2.nn4</name> <value>slave2:9000</value> </property> ## 配置这四个namenode的HTTP通信端口 <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>master:50070</value> </property> <property> <name>dfs.namenode.http-address.ns2.nn3</name> <value>slave1:50070</value> </property> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop04:50070</value> </property> <property> <name>dfs.namenode.http-address.ns2.nn4</name> <value>slave2:50070</value> </property> ## 配置四个namenode的编辑日志存放地址 <property> <name>dfs.namenode.shared.edits.dir</name> ## ns1的nn1和nn2用这个值 <value>qjournal://hadoop04:8485;slave1:8485;slave2:8485/ns1</value> ## ns2的nn3和nn4用这个值 <value>qjournal://hadoop04:8485;slave1:8485;slave2:8485/ns2</value> </property> ## 配置错误恢复 <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfigureFailoverProxyProvider</value> </property> <property> <name>dfs.client.failover.proxy.provider.ns2</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfigureFailoverProxyProvider</value> </property> ## 配置ha的fence <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
- 创建相应的物理路径
-
启动服务
- 同步 etc/hadoop下所有的配置文件到所有的Namenode上
- 每个Namenode都需要单独格式化并且格式化的时候需要指定同一个集群id
hdfs namenode -format -clusterid hd260 - 格式化zookeeper
在所有namenode的节点执行这个指令
hdfs zkfc -formatZK - 格式化journalnode节点
hdfs namenode -initializeSharedEdits - 指定从服务器
现在多个master主服务器单独启动namenode,然后在所有从服务器执行指令
hdfs namenode -bootstrapStandby
-
访问hdfs
- 直接通过 hfds dfs -ls /
- 指定namenode访问: hdfs dfs -ls hdfs://slave1:9000/
四、特点
- which java/which hadoop 查看这些安装目录
- du -ms * du -h0 free
- yarn rmadmin -refreshNodes 来刷新节点???
- hdfs dfs -ls -R /lin 可以递归列举出该目录下所有文件
-
通过 hdfs dfsadmin -repor 检查集群节点状态
hdfs fsck / 检查文件是否都正常
- 指定停止哪几台hdfs服务
顺序执行
hadoop-daemons.sh --hostnames 'slave1 slave2' stop datanode
hadoop-daemons.sh --hostnames 'master hdoop04' stop namenode
hadoop-daemons.sh --hostnames 'slave1 slave2 hdoop04' stop journalnode
hadoop-daemon.sh stop zkfc启动
hadoop-daemons.sh --hostnames 'slave1 slave2' start namenode
hadoop-daemons.sh start datanode //默认是启动所有的hadoop-daemons.sh --hostnames 'slave1 slave2 slave*' start zkfc
五、小结
将hadoop常用的运维操作记录下来,方便今后的维护工作
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。