360实习工作日志2015.10 ~ 2015.12

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-13
1.利用计算平台统计2015-09-28 => 2015-10-11 共14天的spe_num=502306的云查杀日志,1天的结果在10万条-20万+条不等,两周的结果在200万条左右。
由于结果数据量较大,暂时无法从计算平台直接下载数据,下载会报内存溢出的错误。
2.开始学习mongodb

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-14
1.计算云查杀日志2015-09-28 => 2015-10-11两周spe_num=502306的uv/pv
2.尝试验证来电秀日志和v5日志wid,imei对应情况

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-16
1.学习使用云图跑hive程序
2.利用计算平台查找云查杀一个月spe_num=501833的日志
3.学习hive的分区分桶方式,以及hive优化方法

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-19
1.完成1个月云查杀日志spe_num=501833UV/PV的统计
2.申请mongodb测试环境,并进行了简单添删改查语句的测试
3.将2015-10-15一天的来电秀日志进行imei去重,准备验证它与v5日志的wid的对应情况

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-20
求一天来电秀日志和v5日志imei的交集,具体步骤是:
1.来电秀日志、v5日志imei去重
2.两份日志分别进行排序
3.顺序比较两份日志的imei及wid对应情况。对于一个imei在两份日志中wid对应的数量进行计数统计,对于不能对应的情况进行imei和wid的输出。时间复杂度O(max(n,m)),n=v5日志数量,m=来电秀日志数量。
注:由于每个日志数据量将近7000万行,数据处理速度较慢。

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-22
1.完成来电秀、v5日志wid对应情况统计任务
2.学习ElasticSearch相关知识

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-23
1.我在es小集群上建立dlc_datamining/phone_info/wid的文档(document)
例如:http://eseng1.safe.lycc.qihoo.net:9200/dlc_datamining/phone_info/0ff24eec0b6a6153522be24dabe422f0
目前的文档内容是{"imei":"xxxx","imsi":"xxxx","phone_num":"xxxx"},这个以后再扩充

目前依然在用php跑,比较慢,插入了40多万条,主要瓶颈在http请求。
后来看了看文档,发现可以用bulk模式打包插入。我已经配置好了官方的python sdk,正在用python改写建库的程序。

2.学习python和ElasticSearch的知识

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-26
用java重写了在es插入phone_info的程序,原因是官方的java api文档比较详细,而且java支持多线程。
目前已经插入了6500万+条数据,统计信息可以参考http://eseng1.safe.lycc.qihoo.net:9200/_cat/indices?v
目前java程序是用bulk每1000条数据批量插入,但似乎有个别数据遗漏而未插入的情况,问题原因有待查找。根据参考资料分析,有可能是批量条数过大的原因。

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 5 个月 之前添加

2015-10-27
1.通过IPC日志hi.ADSTAG字段统计16日有卫士无se/极速的用户安装了哪些软件
2.计算2015-10-14 ~ 2015-10-18 ,全量ipc_mid_adstag,约1.7亿
3.利用hadoop生成2015-10-15的v5日志wid和相应的imei、mac、ip、brand等信息(JSON格式),以便之后插入到ES中

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-10-28
在build17自己的目录下:
1.鉴于PHP开发效率较高,自己配置了官方es_php_sdk的环境
2.编译安装了新版本的PHP,并安装了SSH、多线程扩展
3.es_php_sdk官方文档比较简略,所以在自己做了基于PHP在es集群插入、更新和upsert等操作,熟悉官方ES PHP API的使用。
4.2015-10-15的v5日志的json信息已经在hadoop集群中生成

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-2
1.将来电秀和v5日志的wid和相应的imei、imsi、mac、ip、brand等信息在hadoop上合并,并生成json,以避免在es合并更新json效率不高的问题
2.学习hadoop的MultipleOutputs的用法,用以对将mapreduce结果输出到指定文件夹。例如:将wid对应一个mid的结果输出到one2one目录,而wid对应多个mid的结果输出到one2many目录

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-3
1.参考http://stackoverflow.com/questions/18541503/multiple-output-files-for-hadoop-streaming-with-python-mapper的方法,利用MultipleTextOutputFormat将将wid对应一个mid的结果分别输出到one2one目录和one2many目录
2.通过PHP的多线程库向ES中插入手机信息,主要性能瓶颈在HTTP请求

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-5
1.继续深入学习es平台的功能和用法
2.学习Hadoop平台全排序和TotalOrderPartitioner类的用法,以提高两个日志merge的速度
3.尝试在先在hadoop上筛选出需要新插入ES的WID再到ES中插入,以提高效率

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-6
鉴于每天完成向ES插入信息的数据处理量较大(独立wid≈1.2亿左右),为了提高向ES插入手机信息的效率,正在按照以下思路实现:
1.在HDFS存储已插入的数据(总量),总量数据基于wid全排序,并以wid前2位为前缀分组。
2.每次插入增量数据时,根据wid前两位从HDFS读取相应文件,进行归并排序,同时能够筛选出未插入的和数据存在变化的wid,时间复杂度o(n)
3.将筛选出的需要插入ES的数据每1000条通过ES的java api进行bulk操作
4.将排序好的数据重新写入总量文件
------------------------------------
以上过程需要使用Hadoop和ES的java api。由于之前一直使用PHP写MapReduce程序,所以现在在结合《hadoop权威指南》这本书在熟悉通过java写MapReduce的方法,以及文件分组、全排序、二进制输入输出、数据压缩、缓存文件等hadoop的高级特性。

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-9
继续编写向ES插入数据的JAVA程序
1.尝试用HADOOP内置的MapWritable和ArrayWritable序列化数据,发现需要自己完成数据的解析和大量的装箱拆箱操作,效率不高;
所以改用第三方的JSON库序列化数据,效果较好,不过由于是直接存储字符串,如果不压缩生成文件较大。
2.由于用JAVA写HADOOP程序不易调试,期间出现了一些细节问题花了较多的时间解决,好在现在程序基本能跑通
3.下一步是结合上ES的API将数据插入,并在计算平台上跑定时任务,正在实现中...

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-10
1.完成了通过Hadoop向ES插入数据的java程序,并插入了一天的数据
2.由于原始日志格式解析的问题,手机号插入了错误数据,一开始的解决方案是:先用update将手机号列删除,再update正确的数据。
但是,通过查询资料发现,es使用的lucene引擎是只读的,也就是说update操作后台会先get,再merge,再delete,在insert,效率极低。
因此只能将数据全部delete再重新插入。
-----------------------------
以上是个教训:
由于数据量大,es写入数据效率等问题,写程序每一步都要小心谨慎,并且应该在小范围内做好测试。
java写hadoop+es不易调试的问题依旧不好解决

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-11
1.学习了用MRUnit对mapreduce程序做单元测试的方法
2.利用MRUnit测试在reduce中merge另一个HDFS文件中数据的算法
3.将测试成功的算法应用到实际Mapreduce程序中
4.出于对MRUnit在本机模拟MR环境机制的好奇,查看了部分MRUnit的源代码,了解到mockito这个java模拟测试类库,学习了模拟测试的方法

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-13
1.之前在hadoop保存的es插入数据缺少一个文件(part-r-00339),原因未知。重新跑了插入es的mapreduce,结果正常了
3.在reduce程序cleanup处理es的bulk操作时忽略了边界检查,导致mr程序报错,修改后运行成功,但由于数据量较大,花费了不少时间
2.终于在计算平台将插入es数据的周期任务跑了起来

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-16
1.在计算平台跑的es插入mobile信息的任务,有一些文件访问权限问题,进行了修改。
2.原来是mr程序是保存增量+前一日全量,即今日全量,同时删除昨日全量,现在改为每天保存增量+前日全量,便于日后查验
3.阅览了es的java api的部分源代码,特别是网络通信部分,发现java api是通过socket通信而非http,但协议并不比http简单,且实现部分较复杂。
4.由于java开发使用ide能够提高效率,而windows下并不顺手,安装了centos虚拟机并进行了简单配置,但虚拟机性能堪忧,图形界面较卡顿。

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-17
1.解决es批量提交过载导致timeout的问题,解决方法是:
①加入catch(ElasticsearchTimeoutException)的错误处理
②timeout参数增加至60秒
再次运行未抛异常,避免了50%的reduce程序需要重试2次的问题

2.结合hadoop的源代码学习了hadoop及hdfs的安全认证机制
3.学习hadoop的RPC通信协议,及实现方法
4.深入学习es的搜索功能

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-19 ~ 2015-11-20
1.深入学习了ES的查询API,以及在JAVA中查询ES中数据的方法.
特别注意:
默认情况下ES会对插入的数据进行分词处理,这对精准查询有影响,会默认去掉符号,并按空格分词,所以如果插入的是整个字符串而不想让ES分析,需在建立索引前加入如下选项,这对于今后的查询和搜索影响很大。
PUT /my_store {
"mappings" : {
"products" : {
"properties" : {
"productID" : {
"type" : "string",
"index" : "not_analyzed" 
}
}
}
}
}
2.通过源代码,深入学习了hadoop的通信机制
3.学习了hadoop RPC协议用到的java动态代理的原理和实现方法

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 4 个月 之前添加

2015-11-23 ~ 2015-11-25
1.帮助李伟使用HIVE查询云查杀日志中指定mid的数据,并按指定方式去重
2.之前es中的mid是从v5日志中提取的,在es中查询mid的过程中发现了mid大量重复的问题,咨询陈明后得知原因是v5中部分mid并不是真实值,而是写死的。
于是利用备份数据重建了es中的索引,并删除了mid列
3.mid数据重新从wid2mid日志中获取,并录入到es中
4.解决了hadoop跑es录入程序过慢的问题:由于v5日志是大量小文件组成的,如果不用CombineTextInputFormat格式则map数量多达19万多,运行一次mapreduce需要3个多小时(一天数据量),因为map默认无法跨文件运行。
加入CombineTextInputFormat输入格式后map数缩减到3000+,时间缩短到半个小时。
由此结合hadoop权威指南深入学习了hadoop分片、分区、分组机制
5.发现如果输入文件使用MultipleInputs,路径中不能有逗号,结合源代码发现这是一个hadoop自身的bug,因为配置文件设置格式为“<path 1>,<mapper class 1>;<path 2>,<mapper class 2>”,path与mapper间按逗号分隔,
如果Path中再含有逗号会导致异常,也就是说路径中不能用含有逗号的通配符,如/xxx/2015{11,12}/在使用MultipleInputs设置路径时会报错

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 3 个月 之前添加

2015-11-27
1.为了解决每次运行mr任务需要上传的第三方jar包过大的问题(和mr程序打包在一个jar),打算利用hadoop的分布式缓存将已经存在于hdfs的jar设置成classpath,
但是没有目前成功,会出现class not found的错误。
2.为此结合源代码深入学习了hadoop的分布式缓存和java的classloader机制,
问题可能出在路径引用上,
正在逐步解决

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 3 个月 之前添加

2015-12-11
1.hadoop计算平台的HDFS分块为256M,而不是默认的64M,所以在map分片控制上需要特别注意。
2.HDFS的分块不能跨文件,即使1kb的文件也会占用一块,但这个分块大小(如256M)是逻辑单位(hadoop处理文件的最小单位),实际1kb的文件占用HDFS磁盘大小仍为1kb。
3.有些业务的原始日志文件是由许多小文件(几M)组成的,如V5升级和云查杀,通常设置输入格式为CombineTextInputFormat能够解决分片粒度问题。
但hadoop在处理输入时会调用InputFormat子类实现的List<InputSplit> getSplit()方法,InputSplit会包含输入路径,当大量小文件作为输入路径时
,会出现OutOfMemory的异常(比如将2天的云查杀日志作为输入,即使JVM设置2G堆内存也不够)。hive同样回出现以上问题。
这个问题会导致,即便数据量不大,但由于数据是由海量小文件组成的,仍然需要分成几个Job来跑,大大限制了hadoop的运算能力。
针对这个问题的解决思路是:
①瓶颈出在List<InputSplit>这个容器会占用大量内存,其实将所有输入目录都保存到list是没有必要的。
通过源代码可知hadoop最终会将分片信息写入job.split文件,并将其上传到job的临时目录,map task只依赖这个文件作为输入分片信息。
所以可以自己生成这个文件(生成方法源码很清晰),FileSystem的listLocatedStatus方法会返回RemoteIterator<LocatedFileStatus>迭代器,所以可以通过类似stream的方式将输入文件信息写入到job.split,从而避免内存溢出。
②多线程版本的listLocatedStatus可以参考最新版本(2.7)的hadoop源代码,实现稍复杂,但可以加快读取大量小文件目录的速度。
③可根据需求适当参考CombineFileInputFormat类的getSplit方法自己实现小文件的combine操作。
4.写mapreduce输入文路径时应尽量避免(小心)使用通配符,例如dir目录下包含2万个文件(没有子目录),java版的mr程序使用input=/dir/*和input=/dir/的效果相同,但是后者比前者快将近10倍,可以使用hadoop fs -ls测试。
这与hadoop读取文件路径的实现方式有关。

RE: 焦诚 ~ 日报 - 由 焦 诚 在 3 个月 之前添加

2015-12-15
hadoop注意事项小结(续12-11)
5.hadoop平台使用的是基于facebook的版本,有些api或api的行为与apache版本有些不同
①分布式缓存需要使用DistributedCache.addSharedxxx,如addSharedCacheArchive、addSharedArchiveToClassPath。而不是通常的addCacheArchive,不加上“shared”是似乎无法使用缓存机制(已实验)。
②facebook版本使用coronajobtracker,类似于mapreduce v2版本的yarn。
coronajobtracker有三种模式:
- In-process: In this mode, the CJT performs its entire functionality in the same process as the JobClient
- Forwarding: In this case, the CJT just forwards the calls to a remote CJT.
- Standalone: This is the remote CJT that is serving the calls from the forwarding CJT.
hadoop客户端机器(05v)默认配置mapred.coronajobtracker.forceremote=true,意味着coronajobtracker强制启动远程模式(Forwarding),这样设置虽然便于集中管理,但对于小mr任务(默认map数小于1000)有些浪费资源。
对于小任务可以使用In-process模式,即forceremote=false且保证map数小于1000(此阈值可设置)。

 

RE: 焦诚 ~ 日报 - 由 焦 诚 在 3 个月 之前添加

2015-12-21
1.用php的curl模块向es中录入数据应该设置curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:")); 选项,否则curl会先向es握手确认(expect:100),es响应http code : 100,再传输数据,比较影响效率。

2.hadoop streaming模式下结合-inputformat org.apache.hadoop.mapred.lib.CombineTextInputFormat选项,并合理设置
-D mapred.max.split.size=$[10*1024*1024*1024]
-D mapred.max.num.blocks.per.split=99999999
能显著提高input总量大且由大量文件组成的mr作业的运行效率(如云查杀日志)。
java程序同理。

3.hadoop streaming模式可以通过环境变量获取hadoop的configuration信息,只需将jobconf变量名的"."变为"_"即可,例如php中要在运行时获取mapred.input.dir的值,只需$var=getenv('mapred_input_dir');即可。
这极大方便了基于streaming模式mr程序的开发。

你可能感兴趣的:(360实习工作日志2015.10 ~ 2015.12)