Hadoop运维记录系列(二十四)

从这篇开始记录一下集群迁移的事情

早先因为机房没地方,就已经开始规划集群搬机房的事情,最近终于开始动手了,我会把这次不停机迁移的过程遇到的主要问题和矛盾以及各种解决方法记录下来。

集群规模说大不大,几百台,总容量30PB左右。Hadoop使用CDH 5.5.1加一些自定义patch的rpm打包编译版本。

总的方案是集群不停机,在两个机房之间架设专线,旧机房decommission,拉到新机房recommission。每天不能下线太多机器,要保证计算。

  1. 新机房提前架设90台机器,测试带宽。带宽的测试方式是比较简单粗暴的,就是在新机房拿几十台新机器搭一个集群,然后旧机房集群和新机房集群之间做distcp,带宽能打满即可。
  2. 新机房拆除小集群,合并到大集群里,机架感知按照 "/机房/机架" 这种方式划分,然后提前做一段时间balancer。

当然在这里面会发现一些问题,我记录在上一篇博客里了,这里再重复记录一下。

  1. 万兆网卡的mtu问题,新机房的新机器datanode报slow block receiver问题,调整网卡mtu从1500到9000,解决。
  2. df 命令卡死,升级systemd并重启解决
  3. 跑作业慢,打Centos 7 CPU补丁 重启
  4. 广播风暴问题,流量比较大,查看网口每机器每秒几百条ARP通告,目前无解,后续运维VLAN解决。

详情看 运维记录系列二十三 http://blog.51cto.com/slaytanic/2141665

期间还遇到了decommission速度慢的问题,调整了一下dn参数dfs.datanode.max.transfer.threads到16384,然后调整NN参数 dfs.namenode.replication.max-streams-hard-limit参数到8感觉也没快多少,然后翻看源码,在 src/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/UnderReplicatedBlocks.java 这个文件里面

public synchronized List<List<Block>> chooseUnderReplicatedBlocks(
int blocksToProcess) {
  // initialize data structure for the return value
  List<List<Block>> blocksToReplicate = new ArrayList<List<Block>>(LEVEL);
  for (int i = 0; i < LEVEL; i++) {
    blocksToReplicate.add(new ArrayList<Block>());
  }

  if (size() == 0) { // There are no blocks to collect.
    return blocksToReplicate;
  }
  int blockCount = 0;
  for (int priority = 0; priority < LEVEL; priority++) {
    // Go through all blocks that need replications with current priority.
    BlockIterator neededReplicationsIterator = iterator(priority);
    Integer replIndex = priorityToReplIdx.get(priority);
    // skip to the first unprocessed block, which is at replIndex
    for (int i = 0; i < replIndex && neededReplicationsIterator.hasNext(); i++) {
      neededReplicationsIterator.next();
    }

    blocksToProcess = Math.min(blocksToProcess, size());
    if (blockCount == blocksToProcess) {
      break;  // break if already expected blocks are obtained
    }
    // Loop through all remaining blocks in the list.
    while (blockCount < blocksToProcess
      && neededReplicationsIterator.hasNext()) {
      Block block = neededReplicationsIterator.next();
      blocksToReplicate.get(priority).add(block);
      replIndex++;
      blockCount++;
    }
    if (!neededReplicationsIterator.hasNext()
      && neededReplicationsIterator.getPriority() == LEVEL - 1) {
      // reset all priorities replication index to 0 because there is no
      // recently added blocks in any list.
      for (int i = 0; i < LEVEL; i++) {
        priorityToReplIdx.put(i, 0);
      }
      break;
    }
    priorityToReplIdx.put(priority, replIndex);
  }
  return blocksToReplicate;
}

从这里获取需要被复制的数据块的索引,我们只需要将 Integer replIndex = proorityToReplIdx.get(priority);改为 Integer replIndex = 0;即可。

但是为了改一行代码我还得重新编译,就不划算了。于是同事找了个工具叫byteman,jboss公司出品的内存修改器,可以理解成针对Java进行内存修改的金山游侠。

具体修改参考同事的github,我就不重复了。不过万一内存改崩溃了,本人不负任何责任。

https://github.com/whitelilis/whitelilis.github.io/issues/17

原文地址:http://blog.51cto.com/slaytanic/2152671

时间: 2024-12-14 08:52:30

Hadoop运维记录系列(二十四)的相关文章

Hadoop运维记录系列(二十三)

最近做集群机房迁移,在旧机房和新机房之间接了根专线,做集群不停机搬迁,也就是跨机房,同时要新加百多台服务器,遇到几个问题,记录一下. 旧集群的机器是centos 6, 新机房加的机器是centos 7. 一.丢包问题 在跨机房的时候,datanode显示很多Slow BlockReceiver的日志 WARN  org.apache.hadoop.hdfs.server.datanode.DataNode: Slow BlockReceiver write packet to mirror to

Hadoop运维记录系列(二十一)

Zeppelin启用https过程和Hack内核以满足客户需求的记录. 原因是这客户很有意思,该客户中国分公司的人为了验证内网安全性,从国外找了一个渗透测试小组对Zeppelin和其他产品进行黑客测试,结果发现Zeppelin主要俩问题,一个是在内网没用https,一个是zeppelin里面可以执行shell命令和python语句.其实这不算大问题,zeppelin本来就是干这个用的.但是渗透小组不了解zeppelin是做什么的,认为即使在内网里,执行shell命令能查看操作系统的一些文件是大问

Hadoop运维记录系列(十四)

周末去了趟外地,受托给某省移动公司做了一下Hadoop集群故障分析和性能调优,把一些问题点记录下来. 该系统用于运营商的信令数据,大约每天1T多数据量,20台Hadoop服务器,赞叹一下运营商乃真土豪,256G内存,32核CPU,却挂了6块2T硬盘.还有10台左右的服务器是64G内存,32核CPU,4~6块硬盘,据用户反馈,跑数据很慢,而且会有失败,重跑一下就好了. 软件环境是RedHat 6.2,CDH Hadoop 4.2.1. 总容量260多TB,已使用200多T. 首先,这硬件配置属于倒

Hadoop运维记录系列(十六)

应了一个国内某电信运营商集群恢复的事,集群故障很严重,做了HA的集群Namenode挂掉了.具体过程不详,但是从受害者的只言片语中大概回顾一下历史的片段. Active的namenode元数据硬盘满了,满了,满了...上来第一句话就如雷贯耳. 运维人员发现硬盘满了以后执行了对active namenode的元数据日志执行了 echo "" > edit_xxxx-xxxx...第二句话如五雷轰顶. 然后发现standby没法切换,切换也没用,因为standby的元数据和日志是5月

Hadoop运维记录系列(十五)

早期搭建Hadoop集群的时候,在做主机和IP解析的时候,通常的做法是写hosts文件,但是Hadoop集群大了以后做hosts文件很麻烦,每次加新的服务器都需要整个集群重新同步一次hosts文件,另外,如果在同一个域下面做两个集群,做distcp,也需要把两个集群的hosts文件全写完整并完全同步,很麻烦.那么,一劳永逸的办法就是做DNS.DNS我这边已经用了很长时间了,几年前为了学这个还专门买了一本巨厚的BIND手册. 做DNS服务器最常用的就是BIND,ISC开发并维护的开源系统. 以ce

openstack运维实战系列(二十)之neutron创建网络并指定vlan号码

1. 背景说明   neutron在openstack中负责instance的网络,如虚拟机内部网络,虚拟机外部网络等,和实体网络相类似,openstack中的网络也存在路由器router,交换机switch,网络network,子网subnet,端口port等概念,这些功能都有neutron来完成,neutron由有个不同的插件plugins组成,如二层插件neutron-openvswitch-agent,三层插件neutron-l3-agent,动态地址分配neutron-dhcp-age

Java学习系列(二十四)Java正则表达式详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45501777 前言 正则表达式可以说是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换.在实例演示之前先了解一下Pattern.Matcher这两个工具类,Pattern:编译好的带匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2个小写字母):Matcher:匹配目标字符串后产生的结果(如:pattern.m

Linux运维学习历程-第十四天-磁盘管理(一)

1.分区(mbr,gpt)区别和结构 1.作业:分区(mbr,gpt),创建文件系统(ext系列,xfs等),mount挂载各种选项 未完待续

SSE图像算法优化系列二十四: 基于形态学的图像后期抗锯齿算法--MLAA优化研究。

偶尔看到这样的一个算法,觉得还是蛮有意思的,花了将近10天多的时间研究了下相关代码. 以下为百度的结果:MLAA全称Morphological Antialiasing,意为形态抗锯齿是AMD推出的完全基于CPU处理的抗锯齿解决方案.对于游戏厂商使用的MSAA抗锯齿技术不同,Intel最新推出的MLAA将跨越边缘像素的前景和背景色进行混合,用第2种颜色来填充该像素,从而更有效地改进图像边缘的变现效果,这就是MLAA技术. 其实就是这个是由Intel的工程师先于2009年提出的技术,但是由AMD将