Java

Java

hadoop2.9运行自带wordcount时出错?

坏脾气先森 回复了问题 3 人关注 2 个回复 2146 次浏览 2018-08-22 10:59 来自相关话题

林老师,Leetcode138 java 我这个按着你的思路写了一次,后来修改了一些,怎么答案是错误的?

回复

互动 发起了问题 1 人关注 0 个回复 1814 次浏览 2018-04-21 09:11 来自相关话题

Java推荐书

张妍 回复了问题 2 人关注 1 个回复 1223 次浏览 2018-03-13 11:47 来自相关话题

请教下为什么我的centos找不到eth0?

回复

岗雍木措 发起了问题 1 人关注 0 个回复 1184 次浏览 2018-03-13 11:46 来自相关话题

java方法里面的对象分配在啥地方,堆里还是栈里

回复

比特币 发起了问题 1 人关注 0 个回复 1554 次浏览 2018-03-11 16:56 来自相关话题

with JDK 1.6请教一下这句话怎么理解

史晓江 回复了问题 2 人关注 1 个回复 1344 次浏览 2018-02-22 14:38 来自相关话题

我用的容器 是 jetty,@茂源 老师 有没有遇到过这个情况:HTTP ERROR 500

回复

伤心太平洋 发起了问题 1 人关注 0 个回复 1926 次浏览 2018-02-21 22:47 来自相关话题

java代码怎么遍历 select出来的每一行 输出出来

回复

张晓慧 发起了问题 1 人关注 0 个回复 1359 次浏览 2018-02-21 22:28 来自相关话题

java多线程

回复

张晓慧 发起了问题 1 人关注 0 个回复 1288 次浏览 2018-02-21 21:55 来自相关话题

一些面试高频算法的思路和java代码实现 有兴趣的可以看看

回复

贾婷婷 发起了问题 1 人关注 0 个回复 1481 次浏览 2018-02-21 21:50 来自相关话题

我有一个问题,

贾婷婷 回复了问题 2 人关注 1 个回复 1116 次浏览 2018-02-21 20:46 来自相关话题

打印gc日志

伤心太平洋 回复了问题 2 人关注 1 个回复 1532 次浏览 2018-02-21 20:15 来自相关话题

Java 多线程和并发

贾婷婷 回复了问题 2 人关注 1 个回复 1231 次浏览 2018-02-21 19:54 来自相关话题

请教一下,Hadoop这么多组成部分,比如mr,hdfs,hive,hbase,zookeeper,pig等等,学习哪些是不太需要java基础的?

macg 回复了问题 5 人关注 4 个回复 1489 次浏览 2018-02-10 11:59 来自相关话题

如果想深入学习hbase,是否必须懂java?

银河系管理员 回复了问题 2 人关注 1 个回复 1449 次浏览 2018-02-08 16:10 来自相关话题

java课程暂停播放

wangxiaolei 回复了问题 2 人关注 1 个回复 1348 次浏览 2017-09-14 12:39 来自相关话题

关于静态变量初始化顺序规则的一些问题

头太重 回复了问题 4 人关注 3 个回复 1794 次浏览 2017-08-30 17:06 来自相关话题

BCP文件的解析能不能用map reduce实现分布式解析?

@CrazyChao 回复了问题 2 人关注 2 个回复 2164 次浏览 2017-07-25 10:17 来自相关话题

kafka自带的zk与另外安装的zk,使用哪个比较好呢?有什么区别?

@CrazyChao 回复了问题 2 人关注 2 个回复 3230 次浏览 2017-06-15 19:06 来自相关话题

条新动态, 点击查看
fish

fish 回答了问题 • 2015-10-21 12:16 • 10 个回复 不感兴趣

jdb调试不能命中断点

断点位置应该是com.chinahadoop.bigdata.WordCount$TokenizerMapper:33 你这行是在内部类中的啊,不是在WordCount这个类中。
断点位置应该是com.chinahadoop.bigdata.WordCount$TokenizerMapper:33 你这行是在内部类中的啊,不是在WordCount这个类中。

hadoop2.9运行自带wordcount时出错?

回复

坏脾气先森 回复了问题 3 人关注 2 个回复 2146 次浏览 2018-08-22 10:59 来自相关话题

林老师,Leetcode138 java 我这个按着你的思路写了一次,后来修改了一些,怎么答案是错误的?

回复

互动 发起了问题 1 人关注 0 个回复 1814 次浏览 2018-04-21 09:11 来自相关话题

Java推荐书

回复

张妍 回复了问题 2 人关注 1 个回复 1223 次浏览 2018-03-13 11:47 来自相关话题

请教下为什么我的centos找不到eth0?

回复

岗雍木措 发起了问题 1 人关注 0 个回复 1184 次浏览 2018-03-13 11:46 来自相关话题

java方法里面的对象分配在啥地方,堆里还是栈里

回复

比特币 发起了问题 1 人关注 0 个回复 1554 次浏览 2018-03-11 16:56 来自相关话题

with JDK 1.6请教一下这句话怎么理解

回复

史晓江 回复了问题 2 人关注 1 个回复 1344 次浏览 2018-02-22 14:38 来自相关话题

我用的容器 是 jetty,@茂源 老师 有没有遇到过这个情况:HTTP ERROR 500

回复

伤心太平洋 发起了问题 1 人关注 0 个回复 1926 次浏览 2018-02-21 22:47 来自相关话题

java代码怎么遍历 select出来的每一行 输出出来

回复

张晓慧 发起了问题 1 人关注 0 个回复 1359 次浏览 2018-02-21 22:28 来自相关话题

java多线程

回复

张晓慧 发起了问题 1 人关注 0 个回复 1288 次浏览 2018-02-21 21:55 来自相关话题

一些面试高频算法的思路和java代码实现 有兴趣的可以看看

回复

贾婷婷 发起了问题 1 人关注 0 个回复 1481 次浏览 2018-02-21 21:50 来自相关话题

我有一个问题,

回复

贾婷婷 回复了问题 2 人关注 1 个回复 1116 次浏览 2018-02-21 20:46 来自相关话题

打印gc日志

回复

伤心太平洋 回复了问题 2 人关注 1 个回复 1532 次浏览 2018-02-21 20:15 来自相关话题

Java 多线程和并发

回复

贾婷婷 回复了问题 2 人关注 1 个回复 1231 次浏览 2018-02-21 19:54 来自相关话题

如果想深入学习hbase,是否必须懂java?

回复

银河系管理员 回复了问题 2 人关注 1 个回复 1449 次浏览 2018-02-08 16:10 来自相关话题

java课程暂停播放

回复

wangxiaolei 回复了问题 2 人关注 1 个回复 1348 次浏览 2017-09-14 12:39 来自相关话题

关于静态变量初始化顺序规则的一些问题

回复

头太重 回复了问题 4 人关注 3 个回复 1794 次浏览 2017-08-30 17:06 来自相关话题

BCP文件的解析能不能用map reduce实现分布式解析?

回复

@CrazyChao 回复了问题 2 人关注 2 个回复 2164 次浏览 2017-07-25 10:17 来自相关话题

kafka自带的zk与另外安装的zk,使用哪个比较好呢?有什么区别?

回复

@CrazyChao 回复了问题 2 人关注 2 个回复 3230 次浏览 2017-06-15 19:06 来自相关话题

跟我学系列之趣解NIO和IO的区别

colincheng 发表了文章 0 个评论 1492 次浏览 2015-11-18 15:03 来自相关话题

在上一次分享中,咱们谈到了阻塞与非阻塞,同步与异步的区别,http://www.jianshu.com ...查看全部
在上一次分享中,咱们谈到了阻塞与非阻塞,同步与异步的区别,http://www.jianshu.com/p/e9c6690c0737
那么在这一次分享中,咱们主要是以讲故事的方式讲述一下NIO和IO的区别。那么在下一次分享中,将进行Java NIO源码的分析。

故事的背景:
有一个动物园,动物园里面有狮子,老虎,猴子等动物,他们每天定期来吃不同的水果,而这些水果要由动物园管理员到货场领取分配。

一、IO
我们知道,在使用IO的时候往往可以在服务器端使用多线程或者线程池来处理并发请求,这也叫伪异步,那么故事开始了:
在货场里有五个动物园管理员等待水果货车的到来,他们一直在等待,如果货车不来他们也要死等,直到货车的到来,这时候货车来了,每个管理员都领了一份水果去寻找动物,管理员A来到狮子旁边,给狮子一份苹果,狮子开始吃,中途吃累了,休息了一会儿继续吃,这时候管理员A就一直等着狮子吃完,再回去拿水果去另一个动物那里。五个管理员都是这样做的。

二、NIO
Java NIO是在jdk1.4开始使用的,它既可以说成“新IO”,也可以说成非阻塞式I/O。下面是java NIO的工作原理:
由一个专门的线程来处理所有的IO事件,并负责分发。
事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
线程通讯:线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换。

那么故事开始了:动物园里,有一个管理员他先去了解动物们都喜欢吃什么样的水果并做了一个登记,然后去货场看一看货车有没有到来,如果没有来他就回去继续干别的事,就这样每隔一段时间就去货场看一下。这时候货车来了,他叫来另外五个管理员并告诉管理员哪些动物喜欢吃哪些水果,管理员们分类取不同的水果,然后各自去找动物们分发水果,还是管理员A,来到狮子旁边把它喜欢吃的苹果给它吃,狮子吃的比较慢,这时候管理员A说,你先吃着,我给其他动物送水果,我一会儿再来取水果盘子,这时候管理员A回去取来香蕉继续猴子送去,在猴子吃香蕉累了休息的时候,管理员A来找狮子拿回水果盘子,再去找猴子拿回水果盘子。
不知道大家在看完这二个小故事之后有没有理解NIO和IO,那么在下次分享的时候,咱们将正式进入NIO原理及源码的分享,谢谢大家。

java 大数据 采用的是什么技术

唐半张 发表了文章 0 个评论 1526 次浏览 2015-10-10 10:05 来自相关话题

众所周知,java 在处理大数据的时候,加载到内存必然会导致内 存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处 理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将数据库(不论是 ...查看全部
众所周知,java 在处理大数据的时候,加载到内存必然会导致内 存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处 理中,我们常见的手段是分解,压缩,并行,临时文件等方法;
例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件, 一般是 Excel 或文本格式的 CSV;对于 Excel 来讲,对于 POI 和 JXL 的接口, 你很多时候没有办法去控制内存什么时候向磁盘写入, 很恶心, 而且这些 API 在内存构造的对象大小将比数据原有的大小要大很多倍 数,所以你不得不去拆分 Excel,还好,POI 开始意识到这个问题,在 3.8.4 的版本后,开始提供 cache 的行数,提供了 SXSSFWorkbook 的 接口, 可以设置在内存中的行数, 不过可惜的是, 他当你超过这个行数, 每添加一行,它就将相对行数前面的一行写入磁盘(如你设置 2000 行 的话,当你写第 20001 行的时候,他会将第一行写入磁盘),其实这 个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁 盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围 一次性将数据刷如磁盘,比如一次刷 1M 之类的做法,可惜现在还没有 这种 API,很痛苦,我自己做过测试,通过写小的 Excel 比使用目前提 供刷磁盘的 API 来写大文件,效率要高一些,而且这样如果访问的人稍 微多一些磁盘 IO 可能会扛不住,因为 IO 资源是非常有限的,所以还是 拆文件才是上策;而当我们写 CSV,也就是文本类型的文件,我们很 多时候是可以自己控制的,不过你不要用 CSV 自己提供的 API,也是 不太可控的, CSV 本身就是文本文件, 你按照文本格式写入即可被 CSV 识别出来;如何写入呢?下面来说说。。。
在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了 方便,我们未必要 1M 怎么来处理,这个交给底层的驱动程序去拆分, 对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个 1000W 数据的数据库表,导出到文件;此时,你要么进行分页,oracle 当然用三层包装即可,mysql 用 limit,不过分页每次都会新的查询,而 且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动, 编译一部分数据(如 10000 行)将写文件一次(写文件细节不多说了, 这个是最基本的),需要注意的时候每次 buffer 的数据,在用 outputstream 写入的时候,最好 flush 一下,将缓冲区清空下;接下来, 执行一个没有 where 条件的 SQL,会不会将内存撑爆?是的,这个问 题我们值得去思考下,通过 API 发现可以对 SQL 进行一些操作,例如, 通过:PreparedStatement statement = connection.prepareStatement(sql),这是默认得到的预编译,还可以通 过设置:PreparedStatement statement = connection.prepareStatement(sql , ResultSet.TYPE_FORWARD_ONLY , ResultSet.CONCUR_READ_ONLY); 来设置游标的方式, 以至于游标不是将数据直接 cache 到本地内存, 然 后通过设置 statement.setFetchSize(200);设置游标每次遍历的大小; OK, 这个其实我用过, oracle 用了和没用没区别, 因为 oracle 的 jdbc API 默认就是不会将数据 cache 到 java 的内存中的,而 mysql 里头设置根 本无效,我上面说了一堆废话,呵呵,我只是想说,java 提供的标准 API 也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多 网上说有效的,但是这纯属抄袭;对于 oracle 上面说了不用关心,他本 身就不是 cache 到内存,所以 java 内存不会导致什么问题,如果是 mysql,首先必须使用 5 以上的版本,然后在连接参数上加上 useCursorFetch=true 这个参数,至于游标大小可以通过连接参数上加 上:defaultFetchSize=1000 来设置,例如:
jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeBehavior=conv ertToNull&useCursorFetch=true&defaultFetchSize=1000 上次被这个问题纠结了很久(mysql 的数据老导致程序内存膨胀,并行 2 个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最 后经过 mysql 文档的确认,然后进行测试,并行多个,而且数据量都是 500W 以上的,都不会导致内存膨胀,GC 一切正常,这个问题终于完 结了。
我们再聊聊其他的, 数据拆分和合并, 当数据文件多的时候我们想合并, 当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好, 这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那 么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行 数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你 需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时 read 文件不要使用一样的方式,平时大多对一个文件读取只是用一次 read 操作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因 该每次读取一个可控范围的数据,read 方法提供了重载的 offset 和 length 的范围,这个在循环过程中自己可以计算出来,写入大文件和上 面一样,不要读取到一定程序就要通过写入流 flush 到磁盘;其实对于 小数据量的处理在现代的 NIO 技术的中也有用到,例如多个终端同时 请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用 java 的容器来处理,一般会发生两种情况:
其一为内存溢出, 因为每个请求都要加载一个文件大小的内存甚至于更 多,因为 java 包装的时候会产生很多其他的内存开销,如果使用二进 制会产生得少一些, 而且在经过输入输出流的过程中还会经历几次内存 拷贝,当然如果有你类似 nginx 之类的中间件,那么你可以通过 send_file 模式发送出去, 但是如果你要用程序来处理的时候, 内存除非 你足够大,但是 java 内存再大也会有 GC 的时候,如果你内存真的很 大,GC 的时候死定了,当然这个地方也可以考虑自己通过直接内存的 调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够 大是多大呢?这个不好说,要看文件本身的大小和访问的频率;
其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的 IO 模型是线程是一个请求一个线程,这个线程从主线程从线程池中分 配后,就开始工作,经过你的 Context 包装、Filter、拦截器、业务代码 各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整 个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文 件操作是属于 IO 密集型的操作, 大量的 CPU 时间是空余的, 方法最直 接当然是增加线程数来控制, 当然内存足够大也有足够的空间来申请线 程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多 的,而在有限的系统资源下,要提高性能,我们开始有了 new IO 技术, 也就是 NIO 技术, 新版的里面又有了 AIO 技术, NIO 只能算是异步 IO, 但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不 会去关心中途的响应),还未做到真正的异步 IO,在监听 connect 的 时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统 的 socket 变成了 selector, 对于不需要进行数据处理的是无需分配线程 处理的; AIO 通过了一种所谓的回调注册来完成, 而 当然还需要 OS 的 支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和 NIO 吃平,不过随着技术发展,AIO 必然会超越 NIO,目前谷歌 V8 虚 拟机引擎所驱动的 node.js 就是类似的模式,有关这种技术不是本文的 说明重点; 将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将 文件每次请求的大小降低到一定程度,如 8K(这个大小是经过测试后 网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做 深入一些, 可以做一定程度的 cache, 将多个请求的一样的文件, cache 在内存或分布式缓存中, 你不用将整个文件 cache 在内存中, 将近期使 用的 cache 几秒左右即可, 或你可以采用一些热点的算法来配合; 类似 迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下 载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反 过来,谁正好需要这块的数据,就给它就可以;才用 NIO 后,可以支 持很大的连接和并发,本地通过 NIO 做 socket 连接测试,100 个终端 同时请求一个线程的服务器,正常的 WEB 应用是第一个文件没有发送 完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改 成 NIO 后此时 100 个请求都能连接上服务器端,服务端只需要 1 个线 程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取 一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总 体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就 是技术的魅力,也许不要太多的算法,不过你得懂他。
类似的数据处理还有很多, 有些时候还会将就效率问题, 比如在 HBase 的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问 题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大 同小异,明白思想和方法,明白内存和体系架构,明白你所面临的是沈 阳的场景,只是细节上改变可以带来惊人的效果

JAVA API操作JAVA

唐半张 发表了文章 0 个评论 1639 次浏览 2015-10-09 09:32 来自相关话题

1.Configuration在使用Java API时,Client端需要知道HBase的配置环境,如存储地址,zookeeper等信息。这些信息通过Configuration对象来封装,可通过如下代码构建该对象 ...查看全部
1.Configuration在使用Java API时,Client端需要知道HBase的配置环境,如存储地址,zookeeper等信息。这些信息通过Configuration对象来封装,可通过如下代码构建该对象
       Configuration config=HBaseConfiguration.create();
在调用HBaseConfiguration.create()方法时,HBase首先会在classpath下查找hbase-site.xml文件,将里面的信息解析出来封装到Configuration对象中,如果hbase-site.xml文件不存在,则使用默认的hbase-core.xml文件。
除了将hbase-site.xml放到classpath下,开发人员还可通过config.set(name, value)方法来手工构建Configuration对象。
Configuration.set(String name, String value) 2.HBaseAdminHBaseAdmin用于创建数据库表格,并管理表格的元数据信息,通过如下方法构建
       HBaseAdmin admin=new HBaseAdmin(config);
常用方法:

       addColumn(tableName,column):为表格添加栏位
       deleteColumn(tableName,column):删除指定栏位
        balanceSwitch(boolean):是否启用负载均衡
        createTable(HTableDescriptor desc):创建表格
        deleteTable(tableName):删除表格
        tableExists(tableName):判断表格是否存在 
[java] 
 
  • HBaseAdmin admin=new HBaseAdmin(config);  
  • If(!admin.tableExists(“test”)){  
  •     HTableDescriptor tableDesc=new HTableDescriptor(“test”);  
  •     HColumnDescriptor cf=new HColumnDescriptor(“cf”);  
  •     tableDesc.addFamily(cf);  
  •     admin.createTable(tableDesc);  
  • }  
HBaseAdmin admin=new HBaseAdmin(config);If(!admin.tableExists(“test”)){        HTableDescriptor tableDesc=new HTableDescriptor(“test”);        HColumnDescriptor cf=new HColumnDescriptor(“cf”);        tableDesc.addFamily(cf);        admin.createTable(tableDesc);}3.HTable在HBase中,HTable封装表格对象,对表格的增删改查操作主要通过它来完成,构造方法如下:       HTable table=new HTable(config,tableName);在构建多个HTable对象时,HBase推荐所有的HTable使用同一个Configuration。这样,HTable之间便可共享HConnection对象、zookeeper信息以及Region地址的缓存信息。示例1:Get操作[java] 
  • Get get=new Get(rowKey);  
  • Result res=table.get(get);  
Get get=new Get(rowKey);Result res=table.get(get);示例2:Put操作[java] 
  • Put put=new Put(rowKey);  
  • put.add(columnFamily,column,value);  
  • table.put(put);  
Put put=new Put(rowKey);put.add(columnFamily,column,value);table.put(put);注:在HBase中,实体的新增和更新都是通过Put操作来实现示例3:Delete操作[java] 
  • Delete delete=new Delete();  
  • table.delete(delete);  
Delete delete=new Delete();table.delete(delete);示例4:Scan操作[java]
  • Scan scan=new Scan( );  
  • scan.addColumn(columnFamily,column);//指定查询要返回的column  
  • SingleColumnValueFilter filter=new SingleColumnValueFilter(  
  •         columnFamily,column,//指定要过滤的column  
  •         CompareOp.EQUAL,value//指定过滤条件  
  • );  
  • //更多的过滤器信息请查看org.apache.hadoop.hbase.filter包  
  • scan.setFilter(filter);//为查询指定过滤器  
  • ResultScanner scanner=table.getScanner(scan);//执行扫描查找  
  • Iterator res=scanner.iterator( );//返回查询遍历器  

HDFS的JavaAPI操作

唐半张 发表了文章 0 个评论 1725 次浏览 2015-10-08 10:21 来自相关话题

package hdfs; import static org.junit.Assert.fail; import java.util.Arrays; import org ...查看全部
package hdfs;

import static org.junit.Assert.fail;

import java.util.Arrays;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
import org.junit.Test;

public class TestHdfs {

@Test
public void test() {
fail("Not yet implemented");
}

//上传本地文件到HDFS
@Test
public void testUpload() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));

FileSystem hdfs = FileSystem.get(conf);
Path src = new Path("F:\\lzp\\T.txt");
Path dst = new Path("/");
hdfs.copyFromLocalFile(src, dst);

System.out.println("Upload to " + conf.get("fs.default.name"));
FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files){
System.out.println(file.getPath());
}
}

//创建HDFS文件
@Test
public void testCreate() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));

byte[] buff = "hello world!".getBytes();

FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/test");
FSDataOutputStream outputStream = null;
try{
outputStream = hdfs.create(dst);
outputStream.write(buff,0,buff.length);
}catch(Exception e){
e.printStackTrace();

}finally{
if(outputStream != null){
outputStream.close();
}
}

FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files){
System.out.println(file.getPath());
}
}

//重命名HDFS文件
@Test
public void testRename() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/");

Path frpath = new Path("/test");
Path topath = new Path("/test1");

hdfs.rename(frpath, topath);

FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files){
System.out.println(file.getPath());
}
}

//刪除HDFS文件
@Test
public void testDel() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/");

Path topath = new Path("/test1");

boolean ok = hdfs.delete(topath,false);
System.out.println( ok ? "删除成功" : "删除失败");

FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files){
System.out.println(file.getPath());
}
}

//查看HDFS文件的最后修改时间
@Test
public void testgetModifyTime() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/");

FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files){
System.out.println(file.getPath() +"\t" + file.getModificationTime());
}
}

//查看HDFS文件是否存在
@Test
public void testExists() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/T.txt");

boolean ok = hdfs.exists(dst);
System.out.println( ok ? "文件存在" : "文件不存在");
}

//查看某个文件在HDFS集群的位置
@Test
public void testFileBlockLocation() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


FileSystem hdfs = FileSystem.get(conf);
Path dst = new Path("/T.txt");

FileStatus fileStatus = hdfs.getFileStatus(dst);
BlockLocation[] blockLocations =hdfs.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
for(BlockLocation block : blockLocations){
System.out.println(Arrays.toString(block.getHosts())+ "\t" + Arrays.toString(block.getNames()));
}
}

//获取HDFS集群上所有节点名称
@Test
public void testGetHostName() throws Exception{

Configuration conf = new Configuration();
conf.addResource(new Path("D:\\myeclipse\\Hadoop\\hadoopEx\\src\\conf\\hadoop.xml"));


DistributedFileSystem hdfs = (DistributedFileSystem)FileSystem.get(conf);
DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();

for(DatanodeInfo dataNode : dataNodeStats){
System.out.println(dataNode.getHostName() + "\t" + dataNode.getName());
}
}

}

java.lang.OutOfMemoryError: Java heap space 解决方法

cenyuhai 发表了文章 0 个评论 3041 次浏览 2015-09-11 14:19 来自相关话题

从网上抄过来的,因为经常碰到这个问题,记录一下。 java.lang.OutOfMemoryError: Java heap space 解决方法 这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实 ...查看全部
从网上抄过来的,因为经常碰到这个问题,记录一下。
java.lang.OutOfMemoryError: Java heap space 解决方法
这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个.
1.可以在windows 更改系统环境变量 加上JAVA_OPTS=-Xms64m -Xmx512m
2,如果用的tomcat,在windows下,可以在
C:\tomcat5.5.9\bin\catalina.bat 中加上:
set JAVA_OPTS=-Xms64m -Xmx256m
位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.
3.如果是linux系统 Linux 在{tomcat_home}/bin/catalina.sh的前面,加 set JAVA_OPTS='-Xms64 -Xmx512'
java.lang.OutOfMemoryError: Java heap space
使用Java程序从数据库中查询大量的数据时出现异常: java.lang.OutOfMemoryError: Java heap space
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 例如:java -jar -Xmn16m -Xms64m -Xmx128m MyApp.jar 如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。 Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。
转载地址:http://www.blogjava.net/liuwentao253/archive/2008/06/03/205466.html

线程池

cenyuhai 发表了文章 0 个评论 1502 次浏览 2015-09-11 14:18 来自相关话题

学习java很久很久了,得有个5年了,但是从来都没有真正的走进java世界,希望从这篇文章开始,把自己对java的点点滴滴都记录下来。   从java5开始,java就提供了名叫Executor framework的机制,主要是围绕着Executo ...查看全部
学习java很久很久了,得有个5年了,但是从来都没有真正的走进java世界,希望从这篇文章开始,把自己对java的点点滴滴都记录下来。
  从java5开始,java就提供了名叫Executor framework的机制,主要是围绕着Executor接口, 它的接口 ExecutorService, 以及实现了这两个接口的ThreadPoolExecutor类来展开,这种机制把线程的执行和创建分离开了,你只需要创建一个线程,然后把线程丢给Executor,让它执行去吧。使用这个机制的另外一个好处是可以使用Callable接口,它类似于Runnable接口,但是有两个不一样的特性。
  • 它的主要方法是call(), 它可以携带一个返回值。
  • 当你发送了一个Callable对象给executor之后,你可以拿到一个实现了Future接口的对象,通过这个对象,你可以控制对象的状态以及Callable对象的结果。

  
  

public Server(){
executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(5);
System.out.printf("Server: Task Count: %d\n",executor.
getTaskCount());
}

提交带返回值的任务。
public class FactorialCalculator implements Callable {
private Integer number;
public FactorialCalculator(Integer number){
this.number=number;
}
@Override
public Integer call() throws Exception {
int result = 1;
if ((num==0)||(num==1)) {
result=1;
} else {
for (int i=2; i<=number; i++) {
result*=i;
TimeUnit.MILLISECONDS.sleep(20);
}
}
System.out.printf("%s: %d\n",Thread.currentThread().
getName(),result);
return result;
}

public class Main {
public static void main(String[] args) {
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.
newFixedThreadPool(2);
List> resultList=new ArrayList<>();
Random random=new Random();
for (int i=0; i<10; i++){
Integer number= random.nextInt(10);
FactorialCalculator calculator=new
FactorialCalculator(number);
Future result=executor.submit(calculator);
resultList.add(result);
}
do {
for (int i=0; i Future result=resultList.get(i);
System.out.printf("Main: Task %d: %s\n",i,result.
isDone());
}
try {
TimeUnit.MILLISECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (executor.getCompletedTaskCount() System.out.printf("Main: Results\n");
for (int i=0; i Future result=resultList.get(i);
Integer number=null;
try {
number=result.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.printf("Main: Task %d: %d\n",i,number);
}
executor.shutdown();
}
}

}
View Code
  
  在Future对象里面,我们可以通过result.isDone()方法来判断线程是否计算完毕。
  执行一堆任务,只返回第一个完成的任务。result = executor.invokeAny(taskList);
  执行全部,resultList=executor.invokeAll(taskList);
  推迟执行,executor.awaitTermination(1, TimeUnit.DAYS);
  把任务的执行和结果的处理分开,需要用到CompletionService, CompletionServicei有两个方法,take和poll,poll是如果没有,它就会立刻返回一个null,take是没有的话,会一直等待。
  当线程池调用了关闭之后,它需要等待当前所有进行中的线程结束才会完全关闭,在这个过程当中提交的线程,需要拒绝处理,我们需要实现一个RejectedExecutionHandler,重写它的rejectedExecution方法,然后听过executor的setRejectedExecutionHandler()方法来设置。
  

public class RejectedTaskController implements 
RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor
executor) {
System.out.printf("RejectedTaskController: The task %s has
been rejected\n",r.toString());
System.out.printf("RejectedTaskController: %s\n",executor.
toString());
System.out.printf("RejectedTaskController: Terminating:
%s\n",executor.isTerminating());
System.out.printf("RejectedTaksController: Terminated:
%s\n",executor.isTerminated());
}
View Code
  
  Fork/Join Framework
   Fork/Join Framwork的诞生是为了解决如下图这样的问题的
  
   我们可以利用ForkJoinPool,它是一个特殊的Executors。
ForkJoin 框架主要是有两个操作:
Fork:把一个任务分成几个小任务,然后执行
Join:等待小任务的完成,并生成一个新任务。
这里我把ForkJoin称为刀叉框架,刀叉框架和Executor框架不一样的地方在于work-stealing算法,不同于Executor框架,刀叉框架在等待子任务的完成之前就已经创建并开始运行Join方法,Join方法一直在检测任务是否完成并且开始运行。通过这样的方式,可以很好的利用runtime的优势,提高性能。
这样就有一些限制:
任务只能采用Fork和Join来作为同步机制,而不能采用别的同步机制,如果采用其他的机制,他们在同步操作的时候,不能执行别的任务。比如:当你在刀叉框架里面一个任务sleep的时候,别的正在执行的任务也会停止,直到该线程sleep结束。
刀叉框架的核心是两个类:
(1)ForkJoinPool,它实现了ExecutorService接口和work-stealing算法,通过它可以很好的管理正在运行的任务以及了解任务的信息。
(2)ForkJoinTask,任务的基类,它提供了fork()方法和join()方法来控制任务的状态。不同通常,你会实现他们的两个子类,不带返回结果的RecursiveAction和带返回结果的RecursiveTask。

springMVC下的javascript调试

cenyuhai 发表了文章 0 个评论 1621 次浏览 2015-09-11 14:15 来自相关话题

最近想弄一个hadoop的管理界面,所以在网上下了一个名为jeecg的快速开发平台,由于工作之后没有用过java做网站,遇到了好多小问题,其中一个就是现在要说的javascript脚本调试的问题。说来也奇怪,其实我也分辨不出来这到底是因为是springMVC, ...查看全部
最近想弄一个hadoop的管理界面,所以在网上下了一个名为jeecg的快速开发平台,由于工作之后没有用过java做网站,遇到了好多小问题,其中一个就是现在要说的javascript脚本调试的问题。说来也奇怪,其实我也分辨不出来这到底是因为是springMVC,还是easy ui 给屏蔽掉的,找自己在自己的页面上的那段javascript脚本异常费劲,
可能这个真是是因为springMVC的缘故吧,因为右键出来的页面地址就是带有xxx.do这样的,而不是真是的jsp页面,所以看不到源码。这可怎么办呀,愁死我了,折腾一阵强有力的折腾之后,终于被我找到方法了,在三大浏览器上都找到了方法。。 都是误打误撞给装出来。
  第一个就是Chrome(只是略微描述),因为我的那个时间是通过点击开始的,我就给点击事件加了断点,一步一步的按下去,就进去了我的那个函数,之前也是找不到。
第二个出来的是IE10,因为我平常用习惯了IE,平时要调试个什么东西,我都是用的IE来调试。IE上其实也很容易找出来,比Chrome省事多了。
  首先打开页面,然后按F12放狗!
  
  然后别费劲找了,现在是找不到的,直接点击“开始调试”,然后在脚本列表里面就会出现动态脚本啦,我写的脚本就在里面,当然如果没出现的话,你可以先点击一下你要测试的功能。
  
  
  然后我们就可以搜索自己写的那段脚本在哪里了
  
   OK,然后给它打上断点即可,哈哈。
  
  第三个是火狐啦,火狐需要下载一个插件firebug,用自带的那个工具也不好找,但是用firebug的话,用那个搜索功能一搜索立马就能出来,实在是太强大了。

使用Ant编译Hadoop工程报错

cenyuhai 发表了文章 0 个评论 1544 次浏览 2015-09-11 14:13 来自相关话题

在win7用Ant编译hadoop工程的时候,遇到了一个报错,如下:   org.eclipse.core.runtime.CoreException: D:\workspace\hadoop-1.1.2\build.xml:83: Execute ...查看全部
在win7用Ant编译hadoop工程的时候,遇到了一个报错,如下:
  org.eclipse.core.runtime.CoreException: D:\workspace\hadoop-1.1.2\build.xml:83: Execute failed: java.io.IOException: Cannot run program "sed"
  打开build.xml文件,找到sed,然后把注释掉即可,这段内容是为了替换苹果系统的空格的,但是。。Windows出错啦,也难怪,因为hadoop他们压根儿就没想让它在windows上面跑。
outputproperty="nonspace.os">