hbase执行mapreduce任务报dns异常

在最近的一个项目中有这样一个需求,我们的业务数据是存放在hbase中,一天大概新增五到六百万的,然后我这边需要做一件事是按小时把新增数据加载到impala中,并且数据需要按年月日三个字段分区。

起初想到的是直接在hive中建立一个表,然后在表上建立一个mapping映射到hbase中的表。但是考虑到分区,业务表中无法提供这些字段,所以另想它法。

后来想到的是用hbase中提供的TableMapper按时间截扫描(这里不用rowkey原因可以自己思考,时间截会出现的问题,业务那边已经处理),mapreduce任务定时每隔一小时执行一次,每次记录下扫描到的数据的最大和最小时间截。下次依据这个扫描最新数据,然后通过reduce把数据写到hdfs上,最后load到impala上。

按照上面的思路敲完代码测试的时候,在log中发现一个error,如下图

通过源码找到报错的地方

InetAddress regionAddress = isa.getAddress();
String regionLocation;
try {
	regionLocation = reverseDNS(regionAddress);
} catch (NamingException e) {
	LOG.warn("Cannot resolve the host name for " + regionAddress + " because of " + e);
	regionLocation = location.getHostname();
}

抛出异常的方法reverseDNS

private String reverseDNS(InetAddress ipAddress) throws NamingException {
	String hostName = this.reverseDNSCacheMap.get(ipAddress);
	if (hostName == null) {
		hostName = Strings.domainNamePointerToHostName(DNS.reverseDns(ipAddress, this.nameServer));
		this.reverseDNSCacheMap.put(ipAddress, hostName);
	}
	return hostName;
}

可见hostName的获取是与nameServer有关

this.nameServer = context.getConfiguration().get("hbase.nameserver.address", null);

而nameServer是从配置(hbase-site.xml)中读取的,hbase.nameserver.address从字面上看是名字服务器的地址,也就是域名服务器。

try {
	regionLocation = reverseDNS(regionAddress);
} catch (NamingException e) {
	LOG.warn("Cannot resolve the host name for " + regionAddress + " because of " + e);
	regionLocation = location.getHostname();
}

在分析这里,首先根据region所在的regionserver的ip地址去域名服务器中找这个regionserver的主机名,而我们搭建本地集群一般不会去弄个域名服务器什么的,这里当然会找不到,然后才会去hosts文件获取regionserver的主机名。总之这里还是获取到了regionserver的主机名,没有获取到想要的主机域名,不影响mapreduce的执行。

只有在线上集群,我们可能会申请一个域名,然后为每个节点 的ip映射一个二级域名,然后在hbase-site.xml中配置上hbase.nameserver.address的值为一个域名服务器的ip(比如114.114.114.114)。

所以不想看到这个error:1、可以自己在一个节点上搭建一个域名服务器,然后再域名服务器的数据库中按hosts的配置添加映射;2、修改源码注释这行代码,覆盖到集群中

时间: 2024-10-19 21:43:05

hbase执行mapreduce任务报dns异常的相关文章

HBase概念学习(七)HBase与Mapreduce集成

这篇文章是看了HBase权威指南之后,根据上面的讲解搬下来的例子,但是稍微有些不一样. HBase与mapreduce的集成无非就是mapreduce作业以HBase表作为输入,或者作为输出,也或者作为mapreduce作业之间共享数据的介质. 这篇文章将讲解两个例子: 1.读取存储在hdfs上的txt文本数据,简单地以json字符串的形式存储到HBase表中. 2.将第一步存储的HBase表中的json字符串读取出来,解析存储到新的HBase表中,可以进行查询. 本文详细给出了源码以及如何运行

HBase和Mapreduce

HBase和Mapreduce整合的代码网上有很多可以参考,在部署jar程序时遇到一个工程问题,值得注意,联系到之前在做spark时遇到过的一个类似的问题,这里详细介绍一下问题和解决方式 任务本身是读取hdfs上的数据,提取所需要的字段然后写入到hbase中,是一个常见的HBase和MapReduce结合的应用程序,在完成代码编写打包提交之后,运行代码时任务正常提交到了集群,并且Map任务顺利执行,没有出现异常,但是当任务运行到reduce阶段的时候出现了HBase的jar包中的一个类class

Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbase调用MapReduce函数使用理解 第三部分:Hbase调用Java API使用理解 第四部分:Hbase Shell操作 第五部分:Hbase建表.读写操作方式性能优化总结 第一部分:Hbase框架原理理解 概述 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google

使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及解决方案

import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.transfer.TransferManager; import com.amazonaws.services.s3.transfer.Upload; public class U

HBase结合MapReduce批量导入

2016年5月14日13:17:05 作者:数据分析玩家 Hbase是Hadoop生态体系配置的数据库,我们可以通过HTable api中的put方法向Hbase数据库中插入数据,但是由于put效率太低,不能批量插入大量的数据,文本将详细介绍如何通过MapReduce运算框架向Hbase数据库中导入数据. 开篇先介绍业务场景:将电信手机上网日志中的数据导入到Hbase数据库中,将部分数据以及相应字段描述列出: 图片格式描述: 先介绍一个日期格式的转换: public class TestDate

Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误

1:Hbase启动hbase shell运行命令报Class path contains multiple SLF4J bindings.错误,是因为jar包冲突了,所以对于和hadoop的jar包冲突的,可以将其他jar包删除,如果你不确定是否删除正确,可以将其他的jar包复制备份或者修改名称,确保操作以后失败了,还可以找回. SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:fil

阿里云服务器报 Liunx异常文件下载处理办法

阿里云服务器报 Liunx异常文件下载.挖矿进程.SSH远程非交互式一句话异常指令执行 1.删除crontab里面的自启动脚本 2.删除authorized_keys 里面密匙 3.删除#/var/spool/cron下的自启动脚本,root和crontabs 4.删除/etc/crontab 里面的自启动脚本 5.进如/tmp目录下,删除wnTKYg.ddg.2020文件并停掉进程,删除Aegis- 开头的文件夹 6.删除#rm -rf /usr/local/aegis/Aegis-\<Gui

客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. 最后经过多次测试,现把解决方案分享给大家. 第一步:打开mysql中的配置文件,my.ini,看一看配置文件中 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 看是不是这样配置的.因为utf8 是国际通用的,

HBase结合MapReduce批量导入(HDFS中的数据导入到HBase)

HBase结合MapReduce批量导入 1 package hbase; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.hbase.client.Put; 8 import org.apache.hadoop.hbase.mapreduce.TableOutput