Don't wanna be here? Send us removal request.
Text
又重装系统了~
上次重装系统是上一年了,自己在读研的时候,买了一个组装笔记本,很便宜,2000多块钱,15年到现在也有3年时间了,竟然没有一点问题。这个��子当时因为读研期间项目编程要用到VS,MAC系统不方便,而且不喜欢用虚拟机,于是有了这个本子的来历。
趁着office软件崩溃,想着干脆系统重做一下好了,于是就下载了最新的win10,然后安装了上。win10的版本与版本之间的差距还是挺明显的。刚好office订阅还有一台电脑可以用,刚好用在这个本上。硬件在win10下运行了一天也没什么问题~因为又怕遇到什么软件崩溃了什么的,所以也搜了下如何备份系统,最终采用了dism++工具备份系统。软件安装到现在,基本也就装齐了。
还差autocad和c4d两个软件。
工作最近的上班模式比较尴尬,就是上一天一夜再上一个白班才休息一天两夜。没有节假日,因为不好调班,所以也没法回家,只能等这次提职考试顺利通过才能恢复正常的上班模式,最近工作的收获还是很大的,但是离爱好又远了很大一截,不知道后面能不能拉回来。
from 又重装系统了~
0 notes
Text
最短的春节假期
作为工作之后第一个春节假期,果然不出意料短的要命。 赶在放假前我由白班转为运行班,所谓白班即周一到周五,双休,正常节假日。所谓运行班,不论周末或节假日,均上一休二。所以,春节的七天长假对于我来说,已经泡汤了。 还好,经值班长同意,初二的那个班我不用上,也就是由于放了一个班的假,我拥有了五天的休息时间,即三十下班,直到初五也就是今天再上班。这个放假的时间段我还是很满意的,因为走的时候人不多,来的时候也不堵,正好。 说起春节期间的值班,比我想象的要轻松。就拿大年二十九来说,总共出去两次,一次是接地故障,去检查,上午那会儿,然后还有一次是晚上11点多,一个通讯中断,去现场看了下。其余时间就是休息。 然后第二次的值班,也就是现在写这篇文的时候,目前为止,也是出了一次,返程的时候,我还开了车。其余时间也是自己忙自己的。 今天把电脑整理了一下,然后用上了本科同学帅迪的高速SS,终于静下心做了些自己的事,其实旁边还放了本专业书籍,想着空了看下,结果放弃了午休的时间投入到电脑中,也没有看书一眼,愧对于它。这样想想,运行班没有想象的那么忙,而且空闲的时间,可以静下心做其他事情,还是很不错的。 上次更新还是17年的10月份,不看日期根本想不到竟然有这么久没有更新,还要新上的垃圾屏蔽插件挺管用的,这次登录博客也没什么垃圾评论。 自上次写博客到现在,中间发生了很多事,最重要的事就是把房子买了,但是接下来的就是痛苦的还贷,还贷的压力还是很大,另外还要抓紧时间练车,用运维班的车练车,还要考虑买车的问题。不能像以前那么轻松。 这期间工作上也有了很多新的收获,参加了一个比赛,又去省公司帮了忙,考了实习副职,反正一直也没闲着。 也没有像以往对2017年做一个总结啥的,也没有拍很多有纪念意义的照片,各种各样的事情,忙活了不少,却没留下什么物件,慢慢整理起自己生活工作的节奏,争取把该记的东西记下来。留着以后回忆用。 希望2018年工作能够顺利,2018年年底争取完成买车的目标。
from 最短的春节假期
0 notes
Text
火星旅行~~
工作逐渐进入正轨,刚入职到了市公司的人资部,后来分了工区就转战工区机关,再后来又被工区机关下放到运维班组。在运维班组也是待了两周多了~一级一级的放下来,也意味着离这几年的工作常态越来越接近。生活逐渐也平淡下来,但是还是不愿意接受一成不变的生活状态,想学一些新的东西,充实下自己。
于是在AE和C4D中选择了C4D,我一直都挺喜欢设计的,小学接触电脑的时候,接触的第一款软件就是PhotoShop,在帮我们组装电脑的那个哥哥那里第一次看到,在蓝色的背景层上,新建一层,用柔化的笔刷刷出一朵云彩,感觉特别神奇。还记得当时大风车还是动画城节目的官方网站上面的一个涂色活动,要求使用windows自带的画图工具完成,但是我用了photoshop完成一些渐变色的填充,当时觉得自己特别厉害,信心百倍地去投了稿件,结果杳无音讯。再后来,就是初中繁重的学习任务。
小时候的爱好多种多样,学过画画,书法、电子琴……但是坚持下来的爱好一个都没有了。从小就听大人说考上大学就轻松了,可是面临着就业,一点都没有轻松的感觉,再后来读了研究生,我这样的学术渣再混了勉强毕业之后,工作也并没有想象中的好找。工作后也不会轻松,继续考虑房子和车,就这样慢慢地让自己融入这样的大环境,忧虑大多数人忧虑的事情。但是总要有个爱好,我想学摄影,想学设计,想学编程,但是这些东西不能给自己带来房子和车的话,就一无是处,学习的劲头是有,但是作为一个什么样的目的去学,我也不清楚。
前段时间偶然看到火星的票可以申请,虽然只是申请名字上火星,那就火星明年见了~
from 火星旅行~~
0 notes
Text
AUTOCAD 安全系统软件锁许可管理器不起作用或未正确安装?解决办法在这里
如上图!安全系统(软件锁许可管理器)不起作用或未正确安装 1,打开任务管理器灭掉LUM.EXE进程; 2,删除 C:\ProgramData\FLEXnet 下的所有文件 3,启动服务管理,找到FlexNet Licensing Service 如果有X64也一起 启用!! 4,重新启动CAD并重新授权,这个时候已经OK了
from AUTOCAD 安全系统软件锁许可管理器不起作用或未正确安装?解决办法在这里
0 notes
Text
工作狂魔
这周的周一到周五,是省公司组织的新员工培训,而上上周的周二到周四三天是市公司组织的新员工培训,也就是这两周都处在一个培训的过程中,也逐渐进入了工作状态。
自从7月14日正式入职以来也算是经历丰富,在供电服务指挥中心的客服岗帮忙了一个月,接过各种各样的电话,对业务也有了一些了解,后来又去人资档案室帮忙,跟其他新入职的小伙伴都逐个见了面,熟悉了下。
市公司组织的培训有去看变电站,有正常讲课,也有去营销去参观,还有素质拓展,短时间的军训,还有可怕的按规考试……
省公司组织的培训是拉到电专培训的,封闭式,从早6点40跑操到晚上快9点才能闲下来,课程安排很近,内容很多,也见识了很多厉害的人物,跟小伙伴的关系更紧密了。特别是素拓活动中,拿到了第一名还拉了第二名很大的差距。配合的相当完美,很多同事也表演了节目。省公司的培训这一期包括了有其他地市还有县公司的,认识很多很多人,很不错。还看到了大学开学,迎新生~就是自助餐不怎么好吃,吃来吃去就那么几样,没有新意~刚去的时候去做小组后面的黑板报,花费了两天时间,由于时间紧张,做的也很简陋,不过貌似用处不大。
培训完,主动来周末加班,从周六的下午5点半到周日的下午5点半,中间可以睡觉,主要就是接电话,不过只有一个电话,还被我接到,惊险!这个值班特别充实,让我好好整理了下电脑,删了该删的,重新安装了系统还有软件。
最最重要的事,把网站成功地迁移到了另外一台服务器上。
之前同时有两个服务器,而有一台总是处于荒废状态,后来,就觉得太可惜了,于是乎把网站又集中在一个网站上。
在这值班很安静,又很清闲,能够做很多事情,还有时间写这么一个博客。哈哈~开心。
发几张图吧,看看换了服务器后还能不能用七牛云的图床。。。
from 工作狂魔
0 notes
Text
毕业季
每年在毕业季的时候,都会跟导师和实验室的师兄师姐师弟师妹们一起合影留念,今年终于轮到我们穿着闷得要死的学位服去顶着太阳去当主角拍照了。
前天的时候学位认定结果下来,昨天去拍照,晚上聚餐吃喝玩。
最近网站关闭了评论,是因为备案的手机号有变更,因此做了变更备案的处理,所以,在5月22日的时候变更了备案手机号,也就是重新走了一遍备案流程,由于评论功能不符合个人网站要求,因此关了一段时间,今天确定了备案信息变更成功。因此今天把博客评论功能开启。
from 毕业季
0 notes
Text
最近,附多图慎入[54P]~
最近事情还算很多。因为论文不幸被抽到盲审,因此整个这段时间有一段便沉浸在苦逼该论文的过程中,也就刚刚送出外审,结果还未知,庆幸的是论文通过了查重,虽然不知道具体重复率为多少。 另外毕业中要填写的实践报告、学术交流报告、开题报告、中期报告等等信息也是烦的要命,还好一件件做完。 又赶上本科室友结婚,回去参加了下婚礼,又跟父母一起来,去了九寨沟和重庆,前前后后也有差不多两周的时间,也算是玩的透彻。 论文交出后的第二天,就召开了西南院的项目会,项目的最后阶段的重担也落到了我的身上,由于已经一年没有接触,还有重新拾起旧知识,在极其有限的时间内完成这项对我来说不可能完成的任务,还不知道能不能混到毕业结束。 文章也算是交了加急费能够赶在毕业前见刊,计划���月份上见刊,前段时间刚校正完稿件,希望能够顺利出刊。 跟着父母在成都、九寨、重庆拍得照片如下,一定要确保有足够的流量后再浏览:
from 最近,附多图慎入[54P]~
0 notes
Text
工作确定,保佑我毕业。。。
今天让同一学校的另外一个同学帮我取了三方,盖上了甲方的章,工作就这么定下了。看来真的要从事电力行业。工作地点跟我读研之前工作的地点一样,也算是比较熟悉的城市了。但是很多本科同学也都在那里,心里还是比较安稳。工作应该是稳定下来的工作,至少十年左右应该不会再换了。但是房价是一个很大的问题。从上一年下半年开始到现在,每平方已经涨了5000左右。
目前最大的问题就是毕业论文, 论文初稿的重复率很高,为了降重,不得不使出自己小学的语文水平重新组织语言。希望最后不要抽到盲审……
from 工作确定,保佑我毕业。。。
0 notes
Text
Excel记录
COUNTIF函数
最近帮妈妈整理Excel表格,然后用到EXCEL中的COUNTIF函数的时候,发现返回的结果不对。我的需求是这样的:就是有一个系统,导出已经建过档案的身份证号信息,然后往系统里面新添加档案,为了避免多余的工作,需提前判断待添加的档案是否已经在系统里面,根据COUNTIF函数可以返回待添加的身份证号在系统中的数量,如果为0,说明没有建过档案,如果为1,说明已建过档案,如果为2,说明系统中关于该身份证号有两项记录,以此类推。
后来,使用COUNTIF发现返回的数据有时候甚至为5,然后手动在已建档的表格中搜索该身份证号,并没有返回结果。
原因是:COUNTIF()函数只能识别数字的前15位,公式改为:=COUNTIF(参考的区域,待判断的单元格&"*"),向下填充即可。
根据身份证号判断性别
加入身份证号所在单元格为A1,则公式为=IF(LEN(A1)=15,IF(MOD(MID(A1,15,1),2)=1,"男","女"),IF(LEN(A1)=18,IF(MOD(MID(A1,17,1),2)=1,"男","女")))
from Excel记录
0 notes
Text
整合 WordPress 与七牛云存储 CDN 加速服务
想对博客的图片进行加速,使用七牛云的镜像加速功能,只需下面几步即可实现要求:
第一步:创建七牛公开空间
第二步:设置镜像存储
成功建立空间之后,打开该空间的【镜像存储】页面。
在【域名设置】下,我们知道了该空间的默认域名,你也可以绑定自己的域名,这里不展开讨论。
在【镜像存储】下,点击【一键加速网站】按钮,在弹出的对话框中,【镜像源】填写你的博客地址,确定即可。
第三步:添加 WordPress 代码
在 WordPress 主题目录下的 functions.php 文件中,加入以下代码实现替换功能:
if ( !is_admin() ) { add_action('wp_loaded','xiaoten_ob_start'); function xiaoten_ob_start() { ob_start('xiaoten_qiniu_cdn_replace'); } function xiaoten_qiniu_cdn_replace($html) { $local_host = 'http://www.xiaoten.com'; //博客域名 $qiniu_host = 'http://ift.tt/2iqK7Dm'; //七牛域名 $cdn_exts = 'js|css|png|jpg|jpeg|gif|ico'; //扩展名(使用|分隔) $cdn_dirs = 'wp-content|wp-includes'; //目录(使用|分隔) $cdn_dirs = str_replace('-', '\-', $cdn_dirs); if ($cdn_dirs) { $regex = '/' . str_replace('/', '\/', $local_host) . '\/((' . $cdn_dirs . ')\/[^\s\?\\\'\"\;\>\<]{1,}.(' . $cdn_exts . '))([\"\\\'\s\?]{1})/'; $html = preg_replace($regex, $qiniu_host . '/$1$4', $html); } else { $regex = '/' . str_replace('/', '\/', $local_host) . '\/([^\s\?\\\'\"\;\>\<]{1,}.(' . $cdn_exts . '))([\"\\\'\s\?]{1})/'; $html = preg_replace($regex, $qiniu_host . '/$1$3', $html); } return $html; } }
上述三步即可完成,当然,如果你的需求还包括加速远程图片或刷新缓存等,那么还是老老实实安装七牛镜像存储 WordPress 插件吧。
from 整合 WordPress 与七牛云存储 CDN 加速服务
0 notes
Text
新年好~
现在来说新年好已经比较晚了,昨天本来想写篇年志的,写完想了想还是就放在日记里面好了~人老了之后就会逐渐变得不太公开自己生活中的事情~
今天本来想给博客换个主题的,看重了一款免费主题,但是由于友情链接的位置还没想好放在新主题的哪个位置,于是就搁置了。
博客开头的那句“Welcome To XiaoTen.Com 5th Anniversary Long Live!”,由于今年的2月2日就是6周年了,因此今天就干脆把数字改成了6。这样算来,博客走过了6个年头,也是不容易。
不过2016年应该是记录自己生活中事情最少的一年吧。倒是很多学习方面的问题,因为才加了网易云课堂的一个微专业,就有一些作业需要在博客中完成,因此博客的访问量在2016年的下半年由于学员互评作业的缘故,增加了一波访问量。
上年的这个时候应该还在关注访问量吧,因为当时想着要换域名,唯一的担忧就是搜索引擎的权重问题,不过后来也算是想通了,也不顾那么多就把域名换到了顶级域名下面,倒也挺顺利。不过blog.xiaoten.com域名下的页面在百度的收录量也真是奇高。通过百度统计工具也看到这个域名下面有更多的来自搜索引擎的访客。
新的一年希望自己能给顺利工作,工作满意,也应该是转折的一年,真正离开校园生活的一年了。
from 新年好~
0 notes
Text
解决macOS系统下matlab无法访问中文路径及中文乱码问题
博主使用的matlab为2016a版本,首先通过feature('locale')命令,查看当前系统所用语言,如下图所示:
其中通过ctype: 'zh_CN.UTF-8'知道当前系统语言为"zh_CN"。
进而编辑matlab程序包中bin文件下的lcdata.xml,如下图所示:
在这个文件中,搜索zh_CN,可以找到<locale name="zh_CN" encoding="GB2312" xpg_name="zh_CN.GB2312">,将改段代码改为:<locale name="zh_CN" encoding="UTF-8" xpg_name="zh_CN.UTF-8">,然后重启matlab即可。
其他情况,如果最开始输入feature('locale')命令时,显示如下信息:
feature('locale') ans = ctype: 'zh_CN.US-ASCII' collate: 'zh_CN.US-ASCII' time: 'zh_CN.US-ASCII' numeric: 'en_US_POSIX.US-ASCII' monetary: 'zh_CN.US-ASCII' messages: 'en_US.US-ASCII' encoding: 'US-ASCII' terminalEncoding: 'UTF-8' jvmEncoding: 'US-ASCII' status: 'MathWorks locale management system initialized.' warning: 'Invalid locale name.'
warning处有对应的警告信息,说明该语言设置有问题,需要对matlab 2016a进行一个补丁处理。此时,通过访问:http://ift.tt/2iHVZOx,在这个页面登录mathworks账号,根据版本号下载对应的补丁。然后进行安装,即可恢复到默认状态,后续再进行上述操作。
from 解决macOS系统下matlab无法访问中文路径及中文乱码问题
0 notes
Text
实验室hadoop集群注意事项
一、如果是将备份的虚拟机文件重新添加到virtualbox时,需要注意以下几个要点: 1、添加新的虚拟机,选择已有虚拟机文件,导入成功后,进入设置界面,网络选择桥接网络,并记录当前虚拟机的MAC地址。 2、由于重新导入时网卡相当于新的网卡,因此需要删除旧网卡信息。 输入命令:sudo vim /etc/udev/rules.d/70-persistent-net.rules 即网卡的信息,保留最新的网卡信息,其余网卡信息删除。 3、配置当前网卡信息。 输入命令:sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改对应的HWADDR属性,即更改为当前虚拟机的MAC地址。 4、上述操作完成,输入reboot命令,重启虚拟机即可。并可通过ifconfig命令验证网络是否已经连接成功。
from 实验室hadoop集群注意事项
0 notes
Text
《HBase协处理器实战》学习笔记
一、HBase协处理器实战
大纲:
协处理器介绍
协处理器的分类
演示endpoint对表中某个列进行计数服务端编写
1.1 协处理器介绍
定义:HBase可以让用户的部分逻辑在数据存放端及hbase服务端进行计算的机制(框架)。协处理器允许用户在hbase服务端上运行自己的代码。
HBase作为列数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。
比如,在旧版本(<0.92)的Hbase中,统计数据表的总行数,需要使用Counter方法,执行一次MapReduce Job才能得到。
虽然HBase在数据存储层中集成了MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在server端,能够减少通讯开销,从而获得很好的性能提升。于是, HBase在0.92之后引入了协处理器(coprocessors)。
协处理器实现了一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。
HBase协处理器的灵感来自于Jeff Dean 09年的演讲。它根据该演讲实现了类似于bigtable的协处理器,包括以下特性:
每个表服务器的任意子表都可以运行代码。
客户端的高层调用接口 (客户端能够直接访问数据表的行地址,多行读写会自动分片成多个并行的RPC调用)。
提供一个非常灵活的、可用于建立分布式服务的数据模型。
能够自动化扩展、负载均衡、应用请求路由。
HBase的协处理器灵感来自 bigtable,但是实现细节不尽相同。 HBase建立了一个框架,它为用户提供类库和运行时环境,使得他们的代码能够在HBase region server和master上处理。
1.2 协处理器的分类
分类:协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。
一个是观察者(observer),类似于关系数据库的触发器。
另一个是终端(endpoint),动态的终端有点像存储过程。
1.2.1 Observer
分为RegionObserver、RegionServerObserver、MasterObserver、WalObserver。
观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall方法,而具体的事件触发的callback方法由HBase的核心代码来执行。
协处理器框架处理所有的callback调用细节,协处理器自身只需��插入添加或者改变的功能。
以HBase0.92版本为例,它提供了三种观察者接口:
RegionObserver:提供客户端的数据操纵事件钩子: Get、 Put、 Delete、Scan等。
WALObserver:提供WAL相关操作钩子。
MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。
这些接口可以同时使用在同一个地方,按照不同优先级顺序执行。用户可以任意基于协处理器实现复杂的HBase功能层。 HBase有很多种事件可以触发观察者方法,这些事件与方法从HBase0.92版本起,都会集成在HBase API中。不过这些API可能会由于各种原因有所改动,不同版本的接口改动比较大。
RegionObserver工作原理:
1.2.2 EndPoint
终端是动态RPC插件的接口,它的实现代码被安装在服务器端,从而能够通过HBase RPC唤醒。客户端类库提供了非常方便的方法来调用这些动态接口,它们可以在任意时候调用一个终端,它们的实现代码会被目标region远程执行,结果会返回到终端。用户可以结合使用这些强大的插件接口,为HBase添加全新的特性。
终端的使用如下面流程所示:
定义一个新的protocol接口,必须继承CoprocessorProtocol。
实现终端接口,该实现会被导入region环境执行。
继承抽象类BaseEndpointCoprocessor。
在客户端,终端可以被两个新的HBase Client API调用。
单个region:
HTableInterface.coprocessorProxy(Class<T> protocol, byte[] row)
regions区域:
HTableInterface.coprocessorExec(Class<T> protocol, byte[] startKey, byte[] endKey, Batch.Call<T,R> callable)
整体的EndPoint调用过程范例,如图所示:
官方给的示例程序大体流程:
对Endpoint进行设置的三个方法:
A. 启动全局aggregation,能过操纵所有的表上的数据。通过修改hbase-site.xml这个文件来实现,只需要添加如下代码:
<property> <name>hbase.coprocessor.user.region.classes</name> <value> org.apache.hadoop.hbase.coprocessor.RowCountEndpoint </value> </property>
B. 启用表aggregation,只对特定的表生效。通过HBase Shell 来实现。
(1)disable指定表。
hbase> disable 'mytable'
(2)添加aggregation 。
hbase> alter 'mytable','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.example.RowCountEndpoint ||'
(3)重启指定表 。
hbase> enable 'mytable'
C. API调用
HTableDescriptor htd=new HTableDescriptor("testTable"); htd.setValue("CORPROCESSOR$1" , path.toString+"|"+RowCountEndpoint.class.getCanonicalName()+"|"+Coprocessor.Priority.USER);
其中path为jar在HDFS中的路径。
Demo1:
package Coprocessor; import java.io.IOException; import java.util.Iterator; import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HConnectionManager; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.coprocessor.Batch; import org.apache.hadoop.hbase.coprocessor.example.generated.ExampleProtos; import org.apache.hadoop.hbase.ipc.BlockingRpcCallback; import org.apache.hadoop.hbase.ipc.ServerRpcController; import com.google.protobuf.ServiceException; public class CoprocessorRowCounter { private String rootDir; private String zkServer; private String port; private Configuration conf; private HConnection hConn = null; private CoprocessorRowCounter(String rootDir,String zkServer,String port) throws IOException{ this.rootDir = rootDir; this.zkServer = zkServer; this.port = port; conf = HBaseConfiguration.create(); conf.set("hbase.rootdir", rootDir); conf.set("hbase.zookeeper.quorum", zkServer); conf.set("hbase.zookeeper.property.clientPort", port); hConn = HConnectionManager.createConnection(conf); } public static void main(String[] args) throws ServiceException, Throwable { String rootDir = "hdfs://hadoop1:8020/hbase"; String zkServer = "hadoop1"; String port = "2181"; CoprocessorRowCounter conn = new CoprocessorRowCounter(rootDir,zkServer,port); //Configuration conf = HBaseConfiguration.create(); HTable table = new HTable(conn.conf, "students"); //发送请求 final ExampleProtos.CountRequest request = ExampleProtos.CountRequest.getDefaultInstance(); //回调函数 call方法 Map<byte[],Long> results = table.coprocessorService(ExampleProtos.RowCountService.class, null, null, new Batch.Call<ExampleProtos.RowCountService,Long>() { public Long call(ExampleProtos.RowCountService counter) throws IOException { ServerRpcController controller = new ServerRpcController(); BlockingRpcCallback<ExampleProtos.CountResponse> rpcCallback = new BlockingRpcCallback<ExampleProtos.CountResponse>(); //实现在server端 counter.getRowCount(controller, request, rpcCallback); ExampleProtos.CountResponse response = rpcCallback.get(); if (controller.failedOnException()) { throw controller.getFailedOn(); } //返回 return (response != null && response.hasCount()) ? response.getCount() : 0; } }); int sum = 0; int count = 0; /* Iterator<Long> iter = results.values().iterator(); Long val = iter.next();*/ for (Long l : results.values()) { sum += l; count++; } System.out.println("row count = " + sum); System.out.println("region count = " + count); } }
运行结果:
row count = 4 region count = 1
注意:
协处理器配置的加载顺序:先加载配置文件中定义的协处理器,后加载表描述符中的协处理器。
COPROCESSOR$<number>中的number定义了加载的顺序。
协处理器配置格式
移除协处理器
Demo2:
package Coprocessor; import java.io.IOException; import java.util.List; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.util.Bytes; public class RegionObserver extends BaseRegionObserver{ private static byte[] fixed_rowkey = Bytes.toBytes("Ivy"); //preGetOp代替preGet /*public void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results) throws IOException { if (Bytes.equals(get.getRow(), fixed_rowkey)) { //行键 列族 列 Cell cell = new KeyValue(get.getRow(), Bytes.toBytes("time"), Bytes.toBytes("time")); results.add(cell); } }*/ @Override public void preGet(ObserverContext<RegionCoprocessorEnvironment> c, Get get, List<KeyValue> result) throws IOException { if (Bytes.equals(get.getRow(), fixed_rowkey)) { //行键 列族 列 KeyValue kv = new KeyValue(get.getRow(), Bytes.toBytes("time"), Bytes.toBytes("time"),Bytes.toBytes(System.currentTimeMillis())); result.add(kv); } } }
打成jar包,上传到hdfs上面。
增加协处理器
disable 'students' alter 'students','coprocessor'=>'http://hdfsnameservice1/liguodong/coprocessor.jar|Coprocessor.RegionObserver||' enable 'students'
package HbaseAPI; import java.io.IOException; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.MasterNotRunningException; import org.apache.hadoop.hbase.ZooKeeperConnectionException; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HConnectionManager; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.io.compress.Compression.Algorithm; import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; import org.apache.hadoop.hbase.util.Bytes; public class HBaseConnection { private String rootDir; private String zkServer; private String port; private Configuration conf; private HConnection hConn = null; private HBaseConnection(String rootDir,String zkServer,String port) throws IOException{ this.rootDir = rootDir; this.zkServer = zkServer; this.port = port; conf = HBaseConfiguration.create(); conf.set("hbase.rootdir", rootDir); conf.set("hbase.zookeeper.quorum", zkServer); conf.set("hbase.zookeeper.property.clientPort", port); hConn = HConnectionManager.createConnection(conf); } //获取数据 public Result getData(String tableName,String rowkey) throws IOException{ HTableInterface table = hConn.getTable(tableName); //用来获取单个行的相关信息 Get get = new Get(Bytes.toBytes(rowkey)); return table.get(get); } public void format(Result result){ //行键 String rowkey = Bytes.toString(result.getRow()); //Return an cells of a Result as an array of KeyValues KeyValue[] kvs = result.raw(); for (KeyValue kv : kvs) { //列族名 String family = Bytes.toString(kv.getFamily()); //列名 String qualifier = Bytes.toString(kv.getQualifier()); //String value = Bytes.toString(result.getValue(Bytes.toBytes(family), Bytes.toBytes(qualifier))); String value = Bytes.toString(kv.getValue()); System.out.println("rowkey->"+rowkey+", family->" +family+", qualifier->"+qualifier); System.out.println("value->"+value); } } public static void main(String[] args) throws IOException { String rootDir = "hdfs://hadoop1:8020/hbase"; String zkServer = "hadoop1"; String port = "2181"; //初始化 HBaseConnection conn = new HBaseConnection(rootDir,zkServer,port); //输出结果 Result result = conn.getData("students", "Ivy"); conn.format(result); result = conn.getData("students", "Tom"); conn.format(result); } }
from 《HBase协处理器实战》学习笔记
0 notes
Text
《搭建企业Hbase》学习笔记
大纲:
实验环境讲解
演示搭建HBase步骤并讲解
一 实验环境讲解
架构
namenode1(master1)
namenode2(master2)
datanode(regionserver)
使用NameNode1、NameNode2和DataNode1 三个服务器来模拟集群,NameNode1上搭建Hbase和Hmaster,NameNode2搭建Hmaster,与NameNode1互为主备,DataNode1上搭建regionserver,Hbase通过zookeeper来保存活跃的master节点信息,保证活跃的master节点出现问题时,备用master取代主master。
主机名 IP 安装软件 JPS启动进程 hadoop-namenode1 192.168.152.153 JDK/Zookeeper/Hadoop/HBase namenode/zkfc/journalnode/resourcemanager/QuoqumPeerMain/Hmaster hadoop-namenode2 192.168.152.155 JDK/Zookeeper/Hadoop/HBase namenode/zkfc/journalnode/resourcemanager/QuoqumPeerMain/Hmaster hadoop-datanode1 192.168.152.154 JDK/Zookeeper/Hadoop/HBase datanode/journalnode/nodemanager/QuoqumPeerMain/Hregionserver
二 演示搭建HBase步骤并讲解
2.1 准备阶段
2.1.1 查看、修改Linux系统的最大文件打开数和最大进程数
ulimit –a //测试环境一般不用修改,但是商业应用时一般需要修改
su
vim /etc/security/limits.conf
root soft nproc 50000 root hard nproc 50000 root soft nofile 25535 root hard nofile 25535 hadoop soft nproc 50000 hadoop hard nproc 50000 hadoop soft nofile 25535 hadoop hard nofile 25535
2.1.2 调整Linux内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward= 0 net.ipv4.conf.default.rp_filter= 1 net.ipv4.conf.default.accept_source_route= 0 kernel.core_users_pid= 1 net.ipv4.tcp_syncookies= 1 net.bridge.bridge-nf-call-ip6tables= 0 net.bridge.bridge-nf-call-iptables= 0 net.bridge.bridge-nf-call-arptables= 0 kernel.mggmnb= 65536 kernel.mggmax= 65536 kernel.shmmax= 68719476736 kernel.shmall= 268435456 net.ipv4.tcp_max_syn_backlog= 65000 net.core.netdev_max_backlog= 32768 net.core.somaxconn= 32768 fs.file-max= 65000 net.core.wmem_default= 8388608 net.core.rmem_default= 8388608 net.core.rmem_max= 16777216 net.core.wmem_max= 16777216 net.ipv4.tcp_timestamps= 1 net.ipv4.tcp_synack_retries= 2 net.ipv4.tcp_syn_retries= 2 net.ipv4.tcp_mem= 94500000 915000000 927000000 net.ipv4.tcp_max_orphans= 3276800 net.ipv4.tcp_tw_reuse= 1 net.ipv4.tcp_tw_recycle= 1 net.ipv4.tcp_keepalive_time= 1200 net.ipv4.tcp_syncookies= 1 net.ipv4.tcp_fin_timeout= 10 net.ipv4.tcp_keepalive_intvl= 15 net.ipv4.tcp_keepalive_probes= 3 net.ipv4.ip_local_port_range= 1024 65535 net.ipv4.conf.eml.send_redirects= 0 net.ipv4.conf.lo.send_redirects= 0 net.ipv4.conf.default.send_redirects= 0 net.ipv4.conf.all.send_redirects= 0 net.ipv4.icmp_echo_ignore_broadcasts= 1 net.ipv4.conf.eml.accept_source_route= 0 net.ipv4.conf.lo.accept_source_route= 0 net.ipv4.conf.default.accept_source_route= 0 net.ipv4.conf.all.accept_source_route= 0 net.ipv4.icmp_ignore_bogus_error_responses= 1 kernel.core_pattern= /tmp/core vm.overcommit_memory= 1
保存修改后sysctl -p。
2.1.3 配置时间同步
如果集群节点时间不同步,可能会出现节点宕机或其它异常,生产环境中一般通过配置NTP服务器实现集群时间同步,需要确保各节点的时间差在10s以内,有条件最好隔一段时间同步一次。本集群在节点hadoop-namenode1中设置ntp服务器,具体方法如下:
切换至root用户
su root
查看、安装ntp
pm -qa | grep ntp
yum install -y ntp
配置时间服务器
vim /etc/ntp.conf
禁止所有机器连接ntp服务器
restrict default ignore
允许局域网内的所有机器连接ntp服务器
restrict 192.168.152.0 mask 255.255.255.0 nomodify notrap
使用本机作为时间服务器
server 127.127.1.0
启动ntp服务器
service ntpd start
设置ntp服务器开机自动启动
chkconfig ntpd on
集群其它节点通过执行crontab定时任务,每天在指定时间向ntp服务器进行时间同步,方法如下:
切换root用户
su root
执行定时任务,每天00:00向服务器同步时间,并写入日志
crontab -e
0 0 * * * /usr/sbin/ntpdate hadoop-namenode1>> /home/hadoop/ntpd.log
// 查看任务
crontab -l
2.2 Hbase的安装、配置
2.2.1 下载、安装Hbase
此处版本为:
hbase-1.2.2-bin.tar.gz
解压安装Hbase:
tar zxvf hbase-1.2.2-bin.tar.gz
删除安装文件:
rm hbase-1.2.2-bin.tar.gz
2.2.2 配置环境
cd /home/hadoop/apache/hbase-1.2.2/conf
vim hbase-env.sh
export JAVA_HOME=/home/hadoop/apache/jdk1.8.0_101 //设置jdk的路径 export HBASE_HEAPSIZE=1024 //设置hbase的堆(内存)的大小 export HBASE_MASTER_OPTS=”-Xmx512m” //设置hmaster的内存,企业级一般为4-8G export HBASE_REGIONSERVER_OPTS=”-Xmx1024m” //设置regionserver的大小 export HBASE_LOG_DIR=${HBASE_HOME}/logs //设置hbase日志路径 export HBASE_PID_DIR=/home/hadoop/apache/hbase-1.2.2/pids export HBASE_MANAGES_ZK=false //选用独立的zookeeper集群
vim hbase-site.xml
<!-- 关闭分布式日志切割,如果采用true会采用regionserver去对日志进行切割,但会产生大量的IO内存的消耗,建议填写false --> <property> <name>hbase.master.distributed.log.splitting</name> <value>false</value> </property> <!-- 设置hdfs的根路径,HRegionServers共享目录 --> <property> <name>hbase.rootdir</name> <value>hdfs://mycluster/hbase</value> </property> <!-- 开启分布式模式,false为单机模式 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 设置HMaster的rpc端口 --> <property> <name>hbase.master.port</name> <value>60000</value> </property> <!-- 指定ZooKeeper集群位置列表 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop-namenode1,hadoop-namenode2,hadoop-datanode1</value> </property> <!-- 指定Zookeeper数据目录,需要与ZooKeeper集群上配置相一致 --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/apache/zookeeper-3.4.8/data</value> </property> <!-- hbase客户端rpc扫描一次调用的行数,提高扫描速度,但是会占用一定内存 --> <property> <name>hbase.client.scanner.caching</name> <value>2000</value> </property> <!-- HRegion分裂前最大的文件大小(默认10G) --> <property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> </property> <!-- 某个HRegionServer中最大的region数量,一般设置在2000左右 --> <property> <name>hbase.regionserver.reginoSplitLimit</name> <value>2000</value> </property> <!-- StoreFile的开始合并的数量,即个数超过这个数就开始合并,值越大合并的时间越长,默认值为3 --> <property> <name>hbase.hstore.compactionThreshold</name> <value>6</value> </property> <!-- 当一个region的storefile个数多于这个值的的时候,它会执行一个合并操作(block写入,等待compact),且会阻塞更新操作。默认为7,一般可以设置为15-20左右,设置太小会影响系统的吞吐率 --> <property> <name>hbase.hstore.blockingStoreFiles</name> <value>14</value> </property> <!-- 超过memstore大小的倍数达到该值则block所有写入请求,阻塞更新操作,进行自我保护 --> <property> <name>hbase.hregion.memstore.block.multiplier</name> <value>20</value> </property> <!-- server端后排线程的sleep间隔,默认为10000,单位:ms --> <property> <name>hbase.server.thread.wakefrequency</name> <value>500</value> </property> <!-- ZooKeeper客户端同时访问的最大并发连接数,zookeeper也要设置,都设置了才能发挥作用,建议设大一点,2000左右,比较重要 --> <property> <name>hbase.zookeeper.property.maxClientCnxns</name> <value>2000</value> </property> <!-- 设置一个regionserver里面menstore占总堆的百分比,达到设定的值以后,会让大的menstore刷写到磁盘,后两个值相加要小于0.8,否则会出现out of memory,根据业务情况进行配置 --> <property> <name>hbase.regionserver.global.memstore.lowerLimit</name> <value>0.3</value> </property> <property> <name>hbase.regionserver.global.memstore.upperLimit</name> <value>0.39</value> </property> <property> <name>hbase.block.cache.size</name> <value>0.4</value> </property> <!-- RegionServer的RPC请求处理IO线程数 --> <property> <name>hbase.reginoserver.handler.count</name> <value>300</value> </property> <!-- 客户端最大重试次数,默认为10 --> <property> <name>hbase.client.retries.number</name> <value>5</value> </property> <!-- 客户端重试前的休眠时间,单位:ms --> <property> <name>hbase.client.pause</name> <value>100</value> </property> <!-- 指定ZooKeeper集群端口 --> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property>
vim regionservers //添加regionserver节点主机名
hadoop-datanode1
复制hdfs-site.xml到conf目录下
cp /home/hadoop/apache/hadoop-2.6.0/etc/hadoop/hdfs-site.xml .
vim backup-masters //添加备用Hmaster节点主机名
hadoop-namenode2
创建hbase的缓存文件目录、日志文件目录和pid文件目录
cd /home/hadoop/apache/hbase-1.2.2/
mkdir tmp
mkdir logs
mkdir pids
2.2.3 同步hbase工作目录到集群其它节点
scp -r /home/hadoop/apache/hbase-1.2.2 hadoop@hadoop-namenode2:/home/hadoop/apache/
scp -r /home/hadoop/apache/hbase-1.2.2 hadoop@hadoop-datanode1:/home/hadoop/apache/
2.2.4 在各节点上修改用户环境变量并使其生效,且授予权限
chown -R hadoop:hadoop hbase-1.2.2
vim ~/.bash_profile
export HBASE_HOME=/home/hadoop/apache/hbase-1.2.2 export PATH=$PATH:$HBASE_HOME/bin
source ~/.bash_profile
2.3 启动集群
2.3.1 在各节点上开启zookeeper集群
zkServer.sh start
2.3.2 在hadoop-namenode1上启动hdfs
start-dfs.sh
2.3.3 在hadoop-namenode2上启动yarn
start-yarn.sh
2.3.4 在hadoop-namenode1上启动ResourceManager
yarn-daemon.sh start resourcemanager
2.3.5 在hadoop-namenode1上启动hbase
start-hbase.sh
启动后各节点进程如下
hadoop-namenode1:
hadoop-namenode2:
hadoop-datanode1:
2.4 功能测试
2.4.1 Web UI
http://hadoop-namenode1:16010,可看到主Master状态
http://hadoop-namenode2:16010,可看到备份Master状态
2.4.2 Shell操作
进入Shell
hbase shell
创建表employee,列族data
> create ’employee’,’data’
往表employee中插入测试数据
> put ’employee’,’rowkey01′,’data:id’,’1001′
> put ’employee’,’rowkey01′,’data:name’,’Henry’
> put ’employee’,’rowkey01′,’data:address’,’Bangalore’
> put ’employee’,’rowkey02′,’data:id’,’1002′
> put ’employee’,’rowkey02′,’data:name’,’Messi’
检索表employee中的所有数据
> scan ’employee’
检索表employee中行键为rowkey01的数据
> get ’employee’,’rowkey01′
禁用表employee并删除它
> disable ’employee’
> drop ’employee’
2.5 HDFS、HBase动态替换节点
2.5.1 Hadoop、HBase动态增加节点
2.5.1.1 增加Hadoop节点
新节点的IP配置,用户创建,核对时间,修改最大文件读取数、最大用户进程数和内核参数,SSH免密码登录配置等
配置hosts文件,添加主机名和IP地址,且同步到其它节点
修改hadoop的配置文件slaves,添加新节点的主机名
复制JDK和hadoop目录到新的节点(注意新节点的hadoop的data、pids等目录需要清除数据)
新节点hadoop权限的修改
修改新节点的环境变量
在新节点中通过命令Hdfs dfsadmin –setBalancerBandwidth设置字节数、带宽,通过命令start-balancer.sh -threshold 5均衡当前的HDFS块 (threshold是平衡阈值,默认是10%,值越小负载越均衡,但需要更长的时间去执行)
在新节点通过命令hadoop-daemon.sh start datanode和yarn-daemon.sh start nodemanager启动datanode和nodemanager进程
2.5.1.2 增加HBase节点
在HBase的配置文件regionserver中添加新节点的主机名
复制hbase目录到新的节点(注意新节点的data等目录也需要清除数据)
在新节点通过命令hbase-daemon.sh start regionserver启动HRegionServer
在新节点上通过hbase-daemon.sh start regionserver启动regionserver
进入hbase shell,通过命令balance_switch true进行region负载平衡
2.5.2 Hadoop、HBase动态删除节点
2.5.2.1 删除HBase节点
通过‘graceful_stop.sh 节点名’使得需要删除的节点的负载均衡停止使用
在HBase的配置文件regionserver中移除删除节点的主机名
2.5.2.2 删除Hadoop节点
在hadoop的配置文件hdfs-site.xml中添加配置:
<property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/apache/hadoop-2.6.0/etc/hadoop/exclude</value> </property>
在配置文件exclude中添加需要删除的节点主机名
通过命令hdfsafsadmin -refreshNodes执行节点刷新操作,重新加载配置
通过命令hadoop dfsadmin –report查看集群状态
from 《搭建企业Hbase》学习笔记
0 notes
Text
找工作~
已经研三几个月了,先前的考博打算也随着周围实验室的同门逐渐找到工作而逐渐瓦解破灭了。也是直到上上周,微信公众号“电网头条”的一则消息,彻底让我坚定了去找工作的念头,就是河南电网有校招了,整整一周的时间,都是在准备简历和看专业课知识中度过。之前虽然也准备了简历,但都是草草了事,有的没的地路过哪家单位的校招就投了简历过去,也没有多上心,有些面试通知也是看到当没看到,更别说像别人一样,过着手中已拿到了若干offer的人生。
本来是打算去武汉大学那一站的,结果还是等得着急,在上周末决定要去东南大学那一站,周二也是第一次到南京,熟悉的同学已经都不在南京了。我是跟一个平顶山的老乡一起去的,下了动车就是晚上了,接下来的几天都是在雨中度过的。
到之后的第二天下午去参加宣讲会,提交了简历,然后晚上去了夫子庙、江南贡院这些景点去看了看,微信运动的步数当天都已经超过2w步了。而且下着大雨,当天11点多接到面试通知。于是到之后的第三天,去参加了面试,面试的整个过程不超过5分钟。我是从上午一直等到下午3点多的时候面试的。
当天晚上11点多被通知去教室签署承诺书,由于我们学校的三方没有纸质的,是网签,必须双方确定了明确的意向之后,才能在网上填写相关的单位信息,再打印,再签署。由于校招没有结束,还不能确定具体的工作地点,因此只是签了一个承诺书。
接下来应该就是等待通知的日子,两周之内给具体的消息。保佑我能够得到一个我满意的结果。
from 找工作~
0 notes