正在加载...

hadoop入门经验总结

一月 4th, 2012

最近一段时间研究Hadoop,入门的话,这两篇文档都不错,按照这些基本上都可以写出第一个hadoop程序了。

http://developer.yahoo.com/hadoop/tutorial/

http://hadoop.apache.org/common/docs/current/mapred_tutorial.html

文档中提到的,我就不说了,我说一下我在实践过程中遇到的问题,我想这些问题其他人也可能会遇到。

1. Eclipse版本的和Eclipse插件的问题:

Yahoo! Mapreduce tutorial 提示了版本兼容问题, “The most recent version which worked properly with the Hadoop plugin is version 3.3.1, "Europa." To download Europa, do not visit the main Eclipse website; it can be found in the archive site http://archive.eclipse.org/eclipse/downloads/ as the ‘Archived Release (3.3.1).’”。我没当回事,结果浪费了我好多天的时间,出现了很多稀奇古怪的问题。 换了版本后,就一切正常了。这就是“不听老人言,吃亏在眼前”,希望这个杯具不出现在其他人那里。

2. Host Name的问题:

hadoop会反向解析hostname,即使是用了IP,也会使用 hostname 来启动 TaskTracker。权宜之计,设置各机器的 /etc/hosts 使hostname能用。

http://stackoverflow.com/questions/4730148/unknownhostexception-on-tasktracker-in-hadoop-cluster

3. API 版本的问题:

《Hadoop The Definitive Guide》上说,0.20以后,有了新的API,就是 ora.apache.hadoop.mapreduce包,我愿意赶新潮,还花了不少力气找新API的代码例子,是写了一个跑的通的例子,但是新API是真心不成熟啊,很多内容都没有,比如 TotalOrderPartitioner、SkipBadRecords,这些扩充的功能都没有,看来还是不能在追赶潮流,还是用成熟的东西比较好。

4. Eclipse插件执行的问题:

一定要点击鼠标右键 Run As  -> Run on Hadoop。直接按工具栏上的执行按钮也可以运行,但可能在源代码上的修改不能立即生效执行,感觉好像执行的是旧的代码。

如果要设置参数,点击 “Open Run Dialog” 设置好以后,点击 “Apply”,然后再点击“Run on Hadoop”

5. 中文编码的问题

Hadoop的 io 都只支持UTF-8,如果原始文件是GBK编码(中国经常会这样),直接用 text.getString(),会读出乱码。要先用原始的编码读入到java内部,然后再处理,Java 内部都是用unicode来表示的 String s = new String(text.getBytes(), 0, text.getLength(), "GBK"); 这样告诉java,输入的是GBK编码。这样就能正确处理gbk的输入文件了。

另外, Hadoop.io.Text 中,直接用getBytes会出错,因为拿出来的字节数组中后面有可能会跟一些垃圾,所以要截断。

getBytes的说明:

getBytes()
          Returns the raw bytes; however, only data up to getLength() is valid.

6. Skip 模式的问题

SkipBadRecords.setMapperMaxSkipRecords 要在 new JobConf 之前。如果这两个语句的顺序颠倒的话,skip mode不能正常工作。 设置了Skip模式,会使效率大大的降低。参看我的博文 http://www.makenotes.net/?p=333002

7. Secondary Sort 中 GroupComparator的解释,参看我的博文 http://www.makenotes.net/?p=334001

Hadoop skip mode 代码要点

十二月 30th, 2011

如果hadoop数据集中有不合规格的数据,或者某些数据会引起程序崩溃,可以设置跳过模式,程序代码可以不处理这些异常,把异常抛出去让程序崩溃,hadoop框架会重新执行程序,并跳过会记录,参看http://hadoop.apache.org/common/docs/current/mapred_tutorial.html#Skipping+Bad+Records 。 但是这里没有给出代码例子,我尝试过几次都不能正常工作。经过一番排查,终于确定了可以正常工作的代码模式。

下面是可以工作的代码片断:

public class PwdSorter extends Configured implements Tool {

     ......

    public int run(String[] args) throws Exception {

            SkipBadRecords.setMapperMaxSkipRecords(getConf(), 5);

           JobConf jobConf = new JobConf(getConf(), getClass());

            ......

         }

   public static void main(String[] args) throws Exception {

            int res = ToolRunner.run(new PwdSorter(), args);

            System.exit(res);

      }

}

要点是 SkipBadRecords.setMapperMaxSkipRecords 要在 new JobConf 之前。如果这两个语句的顺序颠倒的话,skip mode不能正常工作。,缺省错误数据记录在 output/_logs/skip 目录,存储的格式是sequence file。

另外,如果用新的API,即 org.hadoop.mapreduce 包,这个包中没有 SkipBadRecords 类,用 mapred.SkipBadRecords 也能跳过怀记录。(修正:后来又试了一下,新的API Skip mode没成功,可能还是不能正常工作的,以前是记录错误的。)

Hadoop SecondrySort 中 setGroupingComparatorClass 的解释

十二月 22nd, 2011

最近看dadoop中关于辅助排序(SecondarySort)的实现,说到了三个东西要设置:1. partioner;2. Key Comparator;3. Group Comparator。前两个都比较容易理解,但是关于group的概念我一直理解不了,一,有了partioner,所有的key已经放到一个分区了,每个分区对应一个reducer,而且key也可以排序了,那么不是实现了整个数据集的全排序了吗?第二,mapper产生的中间结果经过shuffle和sort后,每个key整合成一个记录,每次reduce方法调用处理一个记录,但是group的目的是让一次reduce调用处理多条记录,这不是矛盾吗,找了好久一直都没找到这个问题的清晰解释。

后来找到一本书,《Pro Hadoop》,里面有一部分内容详细解释了这个问题,看后终于明白了,和大家分享一下。reduce方法每次是读一条记录,读到相应的key,但是处理value集合时,处理完当前记录的values后,还会判断下一条记录是不是和当前的key是不是同一个组,如果是的话,会继续读取这些记录的值,而这个记录也会被认为已经处理了,直到记录不是当前组,这次reduce调用才结束,这样一次reduce调用就会处理掉一个组中的所有记录,而不仅仅是一条了。

这个有什么用呢?如果不用分组,那么同一组的记录就要在多次reduce方法中独立处理,那么有些状态数据就要传递了,就会增加复杂度,在一次调用中处理的话,这些状态只要用方法内的变量就可以的。比如查找最大值,只要读第一个值就可以了。

参考资料: 《Pro Hadoop》 http://books.google.com.hk/books?id=H3mvcxPeUfwC&pg=PA372

Excel 函数 round

十一月 25th, 2011

前两天行政有个Excel 计算要我帮忙,这个需求比较常见,计时15分钟以下算0,15分钟以上,30分钟以下算30分钟,30分钟以上45分钟以下算 30分钟,45分钟以上算一个小时。一开始我准备用IF函数凑一个出来,写了一会查了查excel的函数发现了mround函数,这不是刚刚好时我找的那个嘛!

roun的这一组函数有: round, mround, rounddown, roundup,对于取整这类的操作还是挺好用的。

在实际运用过程中,发现了一个问题,wps计算后的值有时会精度丢失,比如 mround( ( 22:00 - 19:15 ),0.5) = 2.5,应该是等于3的。解决的办法是现round一下,然后再mround, mround(round( ( 22:00 - 19:15 ),2),0.5) = 3 了。

GPS 搜星加速

十一月 14th, 2011

最近感觉手机的GPS定位功能很慢,9月份在河北老家,居然一直都搜不到星,凯立德报搜不到星,google map提示在等待定位...,于是在网上找了很多关于gps定位资料,得到一个初步的结论,htc的GPS应该也是A-GPS,也是需要网络支持的,HTC的GPS配置需要改进一下,很多服务器地址设置的在中国不合适。

修改HTC GPS配置的过程如下:

  1. 首先要 获得root权限
  2. 安装 root explore,修改 /etc/gps.conf
    • 原来的文件内容如下:
      NTP_SERVER=north-america.pool.ntp.org
      XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
      XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
      XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
      SUPL_HOST=supl.google.com
      SUPL_PORT=7276
    • 修改成这个样子:
      NTP_SERVER=0.cn.pool.ntp.org;1.cn.pool.ntp.org;2.cn.pool.ntp.org;3.cn.pool.ntp.org;time.nist.gov
      XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
      XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
      XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
      SUPL_HOST=supl.google.com
      SUPL_PORT=727
    • 这里NTP_SERVER是时间服务器,XTRA_SERVER是星历数据的的服务器,具体的原理可以google一下。north-america.pool.ntp.org基本ping不通,这可能是我GPS定位慢的一个原因。

因为定位要用到网络,所以要先打开网络,3G或者gprs,这样可以快速的下载星历,然后再打开 GPS,这样搜星的速度的确快了很多,从原来7-8分钟甚至搜不到,提高到了十几秒,最多2-3分钟。

对Apple iphone 的GPS功能的误解:

不知道大家怎么样,我以前以为iphone是没有 gps 功能的,主要是对A-GPS的误解,以为A-GPS功能就是蜂窝网络定位功能,查看iphone的规格说明,可以看到定位功能有以下几种:

  • 辅助全球卫星定位系统
  • 数字指南针
  • WLAN
  • 蜂窝网络

http://www.apple.com.cn/iphone/specs.html

找到一篇资料介绍iphone定位功能的说明:

最近在做一个iPhone地图相关的应用,在这介绍在iPhone或iPod touch中几种定位技术,顺便做下笔记。 蜂窝基站定位: 所有的iPhone都可以蜂窝三角网定位(cellular triangulation)。利用附近的蜂窝基站的信号强弱来确定当前位置,比如中国移动的GSM信号基站,中国联通的CDMA等。蜂窝基站越多,定位数据越可靠。 GPS、A-GPS定位: 从 iPhone 3G起,iPhone就装备了卫星 GPS 接收器。GPS接收器同样采用三角网定位法,不同的是它使用轨道卫星发射的无线信号,而不是蜂窝基站的信号。但还有一种情况,A-GPS定 位,Assisted-GPS,即辅助全球卫星定位系统,它却利用蜂窝基站的手机信号来配合传统的GPS卫星信号来迅速定位。一般GPS使用太空中的24 颗人造卫星来进行三角定位 ,以获得经纬度坐标,通常需要一个可视天空的开放环境和至少3颗GPS卫星信号才能进行3D定位。AGPS则利用手机基站的信号,辅以连接远程服务器的方 式下载卫星星历 (英语:Almanac Data),再配合传统的GPS卫星接受器,让定位的速度更快。(Via Assisted_GPS)。这种定位可精确到5m左右。

WiFi三角网定位: 在iPod Touch上,地理位置是通过WiFi三角网定位实现的。iPod Touch查询包含WiFi路由器位置的数据库,并根据附近的WiFi路由器信号强度来确定当前位置。这种方法的误差最大,而且,如果附近没有已知的WiFi热点的话,将无法进行定位。 三轴陀螺仪: 三轴陀螺仪在定位时,与显示位置的地图结合使用来确定方向。因为三轴陀螺仪具有指南针的功能,但它处于静止时,任何形式的地理位置定位都不能提供方向,不管它有多准

http://www.magicalboy.com/gps-in-iphone-ipod.html

AGPS的原理:

AGPS就是Assisted Global Positioning System(辅助全球卫星定位系统)的简写,它是是一种GPS的运行方式。它可以利用手机基地台的信息,配合传统GPS卫星,让定位的速度更快。一般 GPS使用太空中的24 个人造卫星来三角定位GPS 接受器的位置,并提供经纬度坐标,而且需要一个空旷的地点并且需要至少4 颗GPS 卫星讯号才能3D 定位。

AGPS 是使用协助服务的技术,可以利用手机基地台的信息,透过链接远程服务器的方式下载卫星星历(Almanac Data),再配合传统GPS 卫星接受器,让定位的速度更快,用来减少定位所需的时间。

AGPS的具体工作原理如下所示:

AGPS手机首先将本身的基站地址通过网络传输到位置服务器;

位置服务器根据该手机的大概位置传输与该位置相关的GPS辅助信息(包含GPS的星历和方位俯仰角等)到手机;

该手机的AGPS模块根据辅助信息(以提升GPS信号的第一锁定时间TTFF能力)接收GPS原始信号;

手机在接收到GPS原始信号后解调信号,计算手机到卫星的伪距(伪距为受各种GPS误差影响的距离),并将有关信息通过网络传输到位置服务器;

位置服务器根据传来的GPS伪距信息和来自其他定位设备(如差分GPS基准站等)的辅助信息完成对GPS信息的处理,并估算该手机的位置;

位置服务器将该手机的位置通过网络传输到定位网关或应用平台。

AGPS解决方案的优势:

主要在其定位精度上。在室外等空旷地区,其精度在正常的GPS工作环境下,可达10米左右,堪称目前定位精度最高的一种定位技术。该技术的另一优点为:首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟。

虽然AGPS技术的定位精度很高、首次捕获GPS信号时间短,但是该技术也存在着一些缺点。

AGPS的缺点:

首先,室内定位的问题目前仍然无法圆满解决。另外,AGPS的定位实现必须通过多次网络传输(最多可达六次单向传输),这对运营商来说是被认为大量 的占用了空中资源。AGPS最主要的问题是用户对于使用移动定位业务必须更换手机难以接受。而且AGPS手机比一般手机在耗电上有一定的额外负担,间接减 短了手机的待机时间。(注:这里指手机在使用GPS的过程中一直打开AGPS功能而言)。除此之外,就是使用有效性问题。由于GPS系统受美国政府拥有和 控制,在非常时期(如海湾战争、反恐战争等),民用GPS服务可能会受到影响,AGPS的定位业务更难以正常运作了。目前,AGPS的方案提供商主要是美 国高通公司和其子公司Snaptrack公司,现在还只能用于CDMA和iDEN网络的市场,在不久的将来该定位技术还会用于GSM网络。

引自 http://www.lt163.com/jc/s60/new/200912/6676.html

HTC g7 root 过程实录

十一月 10th, 2011

HTC用了超过半年,终于忍受不了它这么小的内部存储了,决心root之。现在root已经很简单了,不用做金卡啥的了。但是我下载了几个一键root应用,始终都是不成功的。在网上搜了很久,得知HTC G7 (HTC Desire)是NAND locked,就是 S-ON,要解锁才行,怎么样看是否S-ON呢,关机,按住声音减小键和电源开关,开机,就可以看到了。

原始的显示是如下这样的,S-ON就是表示 NAND locked,要把它搞成S-OFF,这样才能刷机 :)

BRAVO PVT4 SHIP S-ON
HBOOT-0.93.0001
MICROP-051d
TOUCH PANEL-SYNW0101
RADIO-5.10.05.23
Aug 10 2010,17:52:18

S-OFF的方法可以参看这个帖子: http://bbs.gfan.com/android-2428393-1-4.html,用的是这个软件 http://revolutionary.io/,照着指引一步一步做就行了,最后就可以看到期望的 S-OFF 啦!

然后随便找一个应用市场,搜索root,可以找到一对的root软件,我安装了 z4root。注意要把它移植内部存储,不能放在sd卡上。然后选择永久root,等着它一步一步做就行了,最后要重启,我在这里等了很久,最后不耐烦等了,直接重新启动了手机,居然也成功的root了。

随后安装了一个 root卸载,就可以卸载原来卸不掉的那些系统应用了。没把握的我不敢删,而我又想用google原生的那些应用,所以只删除来12M的空间,也算比以前好了。

z4Root这个软件安装起来居然要占用将近30M的内部存储,我不需要root是,我就把它删掉了。

淘宝商城围城危机我的分析和对策

十月 20th, 2011

沸沸扬扬的淘宝伤城事件告一段落,双方都有各自的委屈。不以阴暗的心理来猜想,就认为他们说的都是自己真的是想法,都不是包装过的说辞的话,按照矛盾论的方法来说,那么这次危机的主要矛盾是淘宝希望提高商城的商业环境、解决诚信问题和小商家流动资金短缺的矛盾。

淘宝的解决方案是用现金作担保,出问题的话,可以先行赔付消费者。(也作为对违规者的惩罚)。这样虽然很简单,但是15万的资金对于流动资金紧张的小商家来讲,压力是巨大的。

如果双方的诉求真的是这样的话,有没有可能采用信用卡或者保险的思路,既解决消费者先行赔付的风险,又不占用商家宝贵的现金呢?

商家在银行开设一个企业信用卡类似的帐号,授权给淘宝15W的一个额度,如果出现赔付问题,在此帐户支付。商家支付年费给银行。或者采用类似保险的机制,商户交额度较少的金额,由保险公司承保赔付的金额。

这个解决了赔付资金的来源问题,相对于罚款来讲,商家信用和运营的资格是更重要的一个因素,比如交通违章,罚款200并不可怕,扣分是更具威慑力的。所以对商家来讲,除了问题的主要惩罚是剥夺在商城运营的资格,而不是资金。

这两个前提都是有信用体系,商家经过高质量的审核,从而使赔付问题出现的几率很低。

本人对银行和保险业务完全不懂,随便说的 :)

Node.js 初探

九月 27th, 2011

1. 安装 node.js https://github.com/joyent/node/wiki/Installation

2. 学习 http://nodebeginner.org/

3.  安装 npm “ curl http://npmjs.org/install.sh | sh ” (要设置http_proxy)

4.  npm install mysql (可以本地安装在项目的根目录下,也可以用 -g 参数全局安装)

5. follow the instuction  https://github.com/felixge/node-mysql or http://utahjs.com/2010/09/22/nodejs-and-mysql-introduction/

6. node-mysql 不支持 connection pool,随便找了一个pool node-mysql-pool https://github.com/Kijewski/node-mysql-pool

7. 安装 mysql-pool "npm install mysql-pool"

10. 用nginx做负载均衡,启多个node实例来充分利用机器的资源

11. 让node后台运行 forever https://github.com/indexzero/forever

     npm install forever -g

     forever start your-main.js

 

一些杂项问题:

并发测试问题: 一个浏览器请求同一个url是串行的(加个参数改变url可以同时发送请求, 或者从不同的浏览器发请求),http://stackoverflow.com/questions/6772981/why-is-this-node-js-code-blocking ,我在用浏览器测试时,开了两个tab,期望看到请求的并发执行,但是总是看到串行的,就是这个原因了。

npm代理设置:如果是在代理后面的,需要设置代理环境变量。设置环境变量要把协议也写上

export HTTP_PROXY=http://<host>:<port>; export HTTPS_PROXY=https://<host>:<port>,

export HTTPS_PROXY=<host>:<port>,这个写法不行。

为什么互联网行业用 mysql 而不是 postgreSQL

九月 6th, 2011

同事在研究 postgreSQL,听他的总结,pg各方面完胜mysql,我在思考为什么互联网行业用mysql的多,可能是互联网的人对mysql作很多很极端的做法,不完全把mysql当关系型数据库来用的。为了性能可以起放弃事务甚至数据的完整性。

其实一做分表分库,关系型数据库的优点就减少了一大半了。不能join、不能分组、不能做子查询,优化器再好也没有意义。sql的优点就是把复杂性隐藏起来,只要描述规则,不去管具体的实现。

互联网行业用mysql只是一个存储介质而已,关系型数据的优点根本就不是关注的重点。

资讯媒体网站在开放平台的潮流的姿态

五月 12th, 2011

资讯网站的盈利模式是广告,内容吸引流量,流量产生impression和click。

开发开放平台上的应用,通常都是不允许放置广告位的,所以这部分流量不能变现。甚至有不少开放平台,比如淘宝的TOP,都不允许有外链,这个就连导入流量都没有了。这样就只能作为品牌宣传的平台。另外一个想法就是做“试用装”,开放平台的应用只是个引子,要看更精彩的内容还是要到网站上来看,类似于RSS中非全文输出,这有个前提是存在从开放平台到来源网站的通路,很有时这个路不通。

如果用开放平台的API,比如Oauth或者OpenID,还可以把开放平台的用户引入到自己网站上,这点还是有实际价值的,降低了用户注册的门槛,提高了方便性。

合作应用产生的流量能否算到网站自身的流量中呢?我个人认为有两个标准,1,能放广告位的,算,可以直接产生营收;2,页面域名用网站域名的,算,能增加网站影响力(在第三方流量监控平台上,比如alexa,google trends之类的)。

开放平台应用最适合的事能产生营收的项目,比如交易或者收取服务费,如果能找到这样的模式是最好的了:)