- 浏览: 283682 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (247)
- free talking (11)
- java (18)
- search (16)
- hbase (34)
- open-sources (0)
- architect (1)
- zookeeper (16)
- vm (1)
- hadoop (34)
- nutch (33)
- lucene (5)
- ubuntu/shell (8)
- ant (0)
- mapreduce (5)
- hdfs (2)
- hadoop sources reading (13)
- AI (0)
- distributed tech (1)
- others (1)
- maths (6)
- english (1)
- art & entertainment (1)
- nosql (1)
- algorithms (8)
- hadoop-2.5 (16)
- hbase-0.94.2 source (28)
- zookeeper-3.4.3 source reading (1)
- solr (1)
- TODO (3)
- JVM optimization (1)
- architecture (0)
- hbase-guideline (1)
- data mining (3)
- hive (1)
- mahout (0)
- spark (28)
- scala (3)
- python (0)
- machine learning (1)
最新评论
-
jpsb:
...
为什么需要分布式? -
leibnitz:
hi guy, this is used as develo ...
compile hadoop-2.5.x on OS X(macbook) -
string2020:
撸主真土豪,在苹果里面玩大数据.
compile hadoop-2.5.x on OS X(macbook) -
youngliu_liu:
怎样运行这个脚本啊??大牛,我刚进入搜索引擎行业,希望你能不吝 ...
nutch 数据增量更新 -
leibnitz:
also, there is a similar bug ...
2。hbase CRUD--Lease in hbase
去重过程同样很简单,不过需要些技巧。
正如你想的一样,在入手之前我自己也分析,怎样根据url & md5去重呢?去重又怎样实现呢?
*其中我当时想法跟job1(见下面)做法是相近的:url+time;
*而md5去重时我又觉得使用md5+time亦未尝不可,因为当时我没有考虑到score因素,但可以断定的是不能使用md5作为distinct,因为这就是题目要求;
*至于怎样去删除索引 ,当时也没有考虑:)
让我们先分析一个删除例子:
A多个urls中,如果存在相同的urls,只取最新的一个;
B如果存在相同md5的urls,只保留评分最高或url最短的一个。
data model:
url |
fetch time | content | score |
a.cn | 2011-1-1 | a | 2 |
a.cn | 2011-7-1 | b | 4 |
a.cn | 2011-5-1 | a | 1 |
b.cn | 2011-4-1 | b | 2 |
要么,按照A要求 ,第一轮后输出結果如下 :
a.cn |
2011-7-1 |
b |
4
|
b.cn |
2011-4-1 |
b |
2 |
再根据B要求,发现这两urls含有相同的content,所以再进行score筛选,結果为:
a.cn |
2011-7-1 |
b |
4
|
如果b.cn的评分比a.cn高时,则为另一結果。可见,从实际 上出发,这也是符合需求的。
因为相同的有相同的urls只取最后 一个;当有相同的content时只取score最高的一个,这样导致二种結果:
1.要么相同的urls中有一个最新的留下来了;或者
2.内容相同的url只保留score高的一个。
即取舍原则是:最新的优先;分数高的优先。NOTE:上面先url再md5这个过程是可逆的
。(可以分析一下上面的反过程,結果是一样的)
至于为什么先进行url再到md5,其实已经不太重要了?
*****************************
注意以上过程未严格的考虑url与content的对应关系,极端情况下,url与content 是m:n的关系,如
一个url可以对应多个content,比如页面中存在时间,不同的访问时间生成的内容不一样;
同样的content,如404页面,只要是访问了不存在的url都会进行这个页面。
******************************
好了,现在开始进行分析,其实上面过程也大概反应了这个dedup的过程:
1.url-distinct job
input :利用inputFormat改写了输入格式,在next()时对<url,Indexdoc>进行了数据shipping,其中indexdoc是对索引 中的doc的简单encapsulation,包括hash,score,tstamp etc.
*其中next方法遍历了所有的doc;
*同时拆分原则也是一份index一个split,这样保证在递归输入<key,value>到mapper之前 是可以让next()中的reader完整读取index,因为一个split生成一个对应 的recordReader;
*同时让url作为key也可以保证了处理需求,即上述A要求
mapper :use default
reducer :对url相同的进行distinct,如果是最后 个则标记为keep=true,表明是将要以md5与其它比较取舍。
output :<MD5Hash,indexdoc>,在reduce中对上述的key进行了转换,方便后续job处理。
note:这里使用了默认的partition,所以相同 的url去到想再的reducer,保证了不至于url混跑。
2.md5-distinct job
input:上述输出
mapper:default
partition:对md5进行hash。注意已经改写了hashCode(),只返回高四位的hash
reducer:将job1中标记为false的直接输出(待删除索引 );只保留true的一个(如果存在),然后与其中md5相同的url进行比对,得出score top1或min(url lengh)的一个(不输出)
output:注意些又将job1中的<md5,indexdoc>退回它的输入格式,即<url,indexdoc>
3.delete-index job
input:如上
mapper:对上述的输出进行转换:<index-path,docid>
reducer:根据 indexpath和docid进行删除索引。(其实这个reader不可以提取出来复用,因为这是根据 不同的indexpath进行发分的)
output:由于索引已经在red阶段已经处理了,没有输出必要,所以改写了outputformat.
*索引删除时是按照docid进行了,一方面增高性能;其次是如果利用url,因为可能相同的有多个(如上述)这述造成删除错误。
其中具体的删除流程如下图:
环境假定:
有三份索引 (所以有三个mappers)
指定二个reducers(固每次map之后都有二个r,数据均匀的理论值)
默认使用SequenceFileInputFormat(splitable)
分析 :
在job2-3之间的mappers是不确定 的,根据 当时的运行情况进行splits;
在每次map完后又恢复至二个r;
在job3,我们有理由 相信其中的一个r被分发的数据大于另一个,这是因为分发时使用了indexpath-hash来实现的。固图中浓黑色的一个数据是多的,另一个是小的;
所以由数据多的r将负责index dedup的任务就多了一个;
总之,一个red可以对应 多个index dedup(由于r处理时是按key按sequential order input的,所以不会出现 一份索引 被多个r处理的局面,初初看到其中的reader在每次r时构成一个感觉耗费很大,其实不然);但反之不然。
发表评论
-
nutch 几种搜索布署
2011-12-29 13:21 8721。这是最简单的一种布署方式,通常用于简单测试。 ... -
nutch搜索架构关键类
2011-12-13 00:19 14todo -
nutch结合hadoop解説 RPC机制
2011-12-13 00:18 895todo -
nutch搜索架构关键类
2011-12-13 00:17 1139在整个crawl->recrawl ... -
访问hadoop数据时注意相对路径问题
2011-12-07 00:30 1423今天在nutch配置分布式搜索时出现搜索不到結果,背景是: ... -
nutch 发布时要注意的问题
2011-12-04 23:40 1859在利用Nutch自身的ant打 ... -
nutch 中的trie tree 算法简介
2011-11-18 14:18 945todoo -
nutch 配置文件详解
2011-11-17 16:58 2169下面来分析 一下,conf目录下各文件的作用是怎样的: cr ... -
nutch 分布式索引(爬虫)
2011-10-19 00:15 3848其实,全网抓取比intranet区别再于, 前者提供了较 ... -
nutch 分布式搜索-cluster-hdfs index
2011-10-17 02:14 1369此过程也很简单,步骤是: a.put the indexes ... -
nutch 分布式搜索-cluster-local index
2011-10-17 02:13 782此过程亦相当简单,只是修改一下search-servers.t ... -
nutch 分布式搜索-standalone mode
2011-10-17 01:47 970本地模式篇,其实就是相当 于之前图中的虚线部分。詳細如下 ... -
nutch对某个contentType文档进行解析的流程--html
2011-09-22 23:44 992经过上一遍contentType流程 介绍后,现在进入具体的 ... -
nutch对某个contentType文档进行解析的流程
2011-09-04 12:48 1673nutch支持对诸多的文档 ... -
nutch 处理robots.txt原理
2011-08-28 16:42 1711形如大多SE一样,在bot ... -
nutch analyzers 使用机制
2011-07-31 14:35 823一。索引时analyzer 我们知道,在Indexer ... -
nutch 数据增量更新
2011-07-22 19:25 3029以下是转载的执行recrawl的脚本(其实还是可以再优化的,比 ... -
nutch 评分机制
2011-07-22 02:28 1755其实nutch的评分机制有二部分,与通常的SE类似: 1 ... -
nutch 搜索site dedup
2011-07-22 01:41 887这个版本发现有个大大的bug,就是搜索时同一页面出现重复,不同 ... -
nutch 搜索流程 2-distributed search
2011-07-20 13:55 997了解了local search ,那么进行distribute ...
相关推荐
标题 "go代码-https://leetcode-cn.com/problems/insert-delete-getrandom-o1-duplicates-allowed/comments/" 指向的是一个LeetCode上的编程挑战,题目编号381,要求实现一个数据结构,支持在O(1)时间复杂度内进行...
- Delete 方法根据索引删除一个元素。 - LoadFromFile 和 SaveToFile 分别用于从文件加载和保存列表。 - Clear 清空列表内容。 - Free 释放TStringList对象的内存。 5. **Duplicates 属性**: Duplicates 属性...
DELETE ADJACENT DUPLICATES FROM itab2 COMPARING posnr. ``` - 解析:首先按照`posnr`和`datuv`字段降序排序表`itab2`,然后删除所有相邻的重复项,只保留第一个出现的记录。 - **按索引删除**: - 示例代码...
- **删除缺失值**(B.delete()):虽然这里提到的`delete()`并不是Python中标准的数据处理方法,但在实际应用中通常会使用Pandas库中的`dropna()`方法来删除包含缺失值的行或列。 ### 数据可视化 - **单变量分布**...
在**过程部**,你会使用如`OPEN`, `READ`, `WRITE`, `DELETE`等语句进行实际的文件操作。`OPEN`用来打开文件,`READ`和`WRITE`进行读写操作,`DELETE`则用于删除文件记录。 以下是一些示例: 1. **顺序文件**: ``...
5. 创建唯一索引时,如果创建索引的列有重复值,应先将其【去除重复(remove duplicates)】,否则索引不能创建成功。 6. 索引一旦创建,将由【数据库管理系统(DBMS)】管理和维护。 7. 在每次访问视图时,视图都是...
- **删除元素**:使用`Delete`方法可以删除指定索引处的元素。例如: ```pascal List.Delete(0); ``` - **清空列表**:`Clear`方法用于清空整个列表。例如: ```pascal List.Clear; ``` #### 八、读写文件 - ...
- **避免使用SELECT DISTINCT**:使用`DELETE ADJACENT DUPLICATES`来替代`SELECT DISTINCT`,以提高性能。 - **使用CASE-ENDCASE而非IF-ENDIF**:使用`CASE-ENDCASE`结构可简化代码并提高性能。 - **优化变量赋值**...
6. `DELETE ADJACENT DUPLICATES FROM itab COMPARING fieldlist`:删除相邻的重复行,fieldlist定义比较的字段。 内表记录数的获取有两种方法: 1. `data a type i. a = lines( itab ).`:使用`lines`函数直接获取...
- 示例:利用SORT、DELETE ADJACENT DUPLICATES等操作减少数据处理时间。 **10.3 其他语句** **10.3.1 CASE语句** - 使用 `CASE` 语句代替多个 `IF` 条件。 - 示例:`CASE lv_choice WHEN 'A'.`。 **10.3.2 ...
int removeDuplicates(sqlist& S) { if (S.empty()) return 0; int tracker = 0; for (int i = 1; i (); i++) { if (S.get(i) == S.get(tracker)) { S.delete(i); i--; } else { tracker++; } } return S...
- **一维和二维数组的元素选取**:通过索引或切片来选取数组中的元素。 4. **数组的重塑和转置** - **reshape()函数**:改变数组的形状,保持数组元素总数不变。 - **flatten()和ravel()函数**:将多维数组转换...
- 结合`Range("A1").RemoveDuplicates`方法实现。 33. **定位删除特定内容所在的行** - 通过查找特定内容并定位到所在行,再删除实现。 34. **判断是否选中整行** - 通过`Target.EntireRow.Selected`判断。 35...
例如,不要使用`SELECT DISTINCT`,可尝试用`SORT BY`和`DELETE ADJACENT DUPLICATES`来替代。尽量减少子查询和嵌套SELECT...ENDSELECT的使用,因为它们会增加执行次数。在索引字段上避免使用NOT, 等不等操作符,...
`Delete`方法根据索引删除字符串,例如`StringList.Delete(0)`。`Remove`方法根据内容删除字符串,但需要提供要删除的字符串。 4. **访问字符串** 可以通过索引访问字符串,如`var Str: string; Str := String...
每次DELETE操作之后,我们都等待索引更新。 处理过的文档将登录到/tmp/es_dedupe.log 。 不幸的是,聚合查询不一定是精确的。 基于/tmp/es_dedupe.log日志文件,我们查询每个field值,并在其他分片上删除文档副本。...