分享

到底是哪超时了

leletuo2012 发表于 2016-7-6 16:59:57 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 13 11348
我使用Hive 有个自定义udf函数 里面需要解析一个文件有6M 本地测试需要8秒左右 在创建好函数后使用该udf  执行SQL过程中就出现一直卡在文件解析那 最终导致整个任务失败
报错:attempt_1467777206731_0002_1_00_000000_0 Timed out after 300 secs
ps 修改过  mapreduce.task.timeout 这个参数没有起作用

已有(13)人评论

跳转到指定楼层
easthome001 发表于 2016-7-6 17:27:08
如果一直卡,设置超时可能也是不管用的。楼主可以先测试udf是否可以正常使用。
先写一个最简单的udf,然后逐步丰富。找到问题原因。
比如你要读取一个文件,先不去读取,去写一个空壳udf。正常后再去读取文件。这样就可以定位了
回复

使用道具 举报

leletuo2012 发表于 2016-7-6 17:30:52
easthome001 发表于 2016-7-6 17:27
如果一直卡,设置超时可能也是不管用的。楼主可以先测试udf是否可以正常使用。
先写一个最简单的udf,然后 ...

日志显示udf已经读取文件了 并且一直卡在那个处理文件的方法那里 后面就没有其他日志了
回复

使用道具 举报

leletuo2012 发表于 2016-7-6 17:31:49
easthome001 发表于 2016-7-6 17:27
如果一直卡,设置超时可能也是不管用的。楼主可以先测试udf是否可以正常使用。
先写一个最简单的udf,然后 ...

udf在本地用Junit测试是没有任何问题的 而且执行很快
回复

使用道具 举报

easthome001 发表于 2016-7-6 17:32:58
leletuo2012 发表于 2016-7-6 17:30
日志显示udf已经读取文件了 并且一直卡在那个处理文件的方法那里 后面就没有其他日志了

那就处理文件的地方测试下,把处理的地方先清空,然后逐步加入,找到问题代码或则贴出来,大家看下

回复

使用道具 举报

easthome001 发表于 2016-7-6 17:34:14
leletuo2012 发表于 2016-7-6 17:31
udf在本地用Junit测试是没有任何问题的 而且执行很快

是不是数据的问题
回复

使用道具 举报

leletuo2012 发表于 2016-7-6 17:35:28
logger.info("==load cache path:" + cachePath.toString());
                                ipAreaAnalyser.analyzeFile(dfs.open(cachePath));
                                logger.info("==complete analyzeFile:" + cachePath.toString());
一直卡在这个 analyzeFile 方法了
analyzeFile 内容如下:
        public void analyzeFile(InputStream is) throws Exception {
                ipArea = new HashMap<String, String>();
                BufferedReader bufferedReader = null;
                try {
                        bufferedReader = new BufferedReader(new InputStreamReader(is));
                        String lineStr = bufferedReader.readLine();
                        System.out.println("lineStr:"+lineStr);
                        while (lineStr != null && lineStr.trim().length() != 0) {
                                // 解析数据
                                String[] tmpInfos = lineStr.split(defaultSpace);
                                System.out.println("tmpInfos length:"+tmpInfos.length);
                                if (tmpInfos.length == 5) {
                                        System.out.println(tmpInfos[4].substring(1,
                                                tmpInfos[4].length() - 5));
                                        String[] ipSlices = tmpInfos[4].substring(1,
                                                        tmpInfos[4].length() - 5).split(ipsSpace);
                                        for (String ips : ipSlices) {
                                                String[] tmpIps = ips.split(ipSpace);
                                                if (tmpIps.length == 2) {
                                                        List<String> ipKeys = getIpAreaKeys(tmpIps[0],
                                                                        tmpIps[1]);
                                                        if (ipKeys == null) {
                                                                continue;
                                                        }
                                                        for (String key : ipKeys) {
                                                                ipArea.put(key, tmpInfos[1]);
                                                        }
                                                        ipKeys = null;
                                                }
                                                tmpIps = null;
                                        }
                                        ipSlices = null;
                                }
                                tmpInfos = null;
                                lineStr = bufferedReader.readLine();
                        }
                } catch (Exception e) {
                        throw e;
                } finally {
                        try {
                                if (bufferedReader != null) {
                                        bufferedReader.close();
                                }
                        } catch (IOException e) {
                        }
                }
                if (ipArea.size() == 0) {
                        throw new Exception("No ip Area data.");
                }
        }

回复

使用道具 举报

leletuo2012 发表于 2016-7-6 17:38:17
easthome001 发表于 2016-7-6 17:34
是不是数据的问题

数据文件内容 :view walisihefuguona-_-_-_ { match-clients {27.125.192.0/22;};};、


view Niger-_-_-_ { match-clients {41.78.116.0/22;41.138.32.0/19;41.190.228.0/22;};};
类似这样的行有近2000多行


回复

使用道具 举报

leletuo2012 发表于 2016-7-6 17:47:31
easthome001 发表于 2016-7-6 17:34
是不是数据的问题

对了 还有个情况 我分析的这个文件 如果减少到 只有200多行(只是为了验证是解析文件引起的超时错误 就用200行测试) 不会出现问题 并且SQL能很快执行完成
回复

使用道具 举报

easthome001 发表于 2016-7-6 18:02:22
本帖最后由 easthome001 于 2016-7-6 18:05 编辑
leletuo2012 发表于 2016-7-6 17:47
对了 还有个情况 我分析的这个文件 如果减少到 只有200多行(只是为了验证是解析文件引起的超时错误 就用 ...

可以多增加并发,在多台机器上运行。
另外可能是不规则的数据造成的。   if (tmpInfos.length == 5) 这里表示tmpInfos.length为5,
tmpInfos[4].length()-5,这里会不会出现负数.
System.out.println(tmpInfos[4].substring(1,  tmpInfos[4].length() - 5));
String[] ipSlices = tmpInfos[4].substring(1, tmpInfos[4].length() - 5).split(ipsSpace);

另外楼主能否解释下这个语句的含义

回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条