• Posts tagged "rhadoop"

Blog Archives

ChinaHadoop大会 2103: R语言为Hadoop注入统计血脉

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/hadoop-china-rhadoop-2013/

rhadoop-chinahadoop

前言

今天有幸在2013年ChinaHadoop大会发言,为R语言推广做出一点点贡献,自己感觉非常的激动。自学习R语言以来,跨学科的思维模式,每天都在扩充自己的视野!“唯有跳出IT的圈子,才能体会IT正在改变着世界”。

以计算机技术和统计为工具,再结合行业知识,必将成为未来“数据掘金”的原动力!抓住时代的机会,是80后崛起的时候了!

目录

  1. 主题内容介绍
  2. 活动照片

1. 主题内容介绍

ChinaHadoop的大会主页:http://www.chinahadoop.com/

R语言为Hadoop注入统计血脉:PPT下载

  • 1). 主题:R语言为Hadoop注入统计血脉
  • 2). RHadoop基础程序
  • 3). 分步式协同过滤ItemCF算法介绍
  • 4). ItemCF算法:R本地程序实现
  • 5). ItemCF算法:RHadoop实现
  • 6). ItemCF算法:Java Hadoop MapReduce实现
  • 7). ItemCF算法:Mahout 实现
  • 8). 推荐结果,数据可视化

1). 主题:R语言为Hadoop注入统计血脉
主要内容:R语言为Hadoop注入统计血脉

2). RHadoop基础程序

主要内容:RHadoop实践系列之二:RHadoop安装与使用

源代码


#hdfs
library(rhdfs)
hdfs.init()
hdfs.ls("/user/")
hdfs.cat("/user/hdfs/o_t_account/part-m-00000")

#rmr
library(rmr2)
small.ints <- 1:10
sapply(small.ints, function(x) x^2)

small.ints <- to.dfs(keyval(1,1:10))
from.dfs(small.ints)

output<-mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
from.dfs(output)

#rmr-wordcount
input<-"/user/hdfs/o_t_account/"
wordcount = function(input, output = NULL, pattern = ","){
  
  wc.map = function(., lines) {
    keyval(unlist( strsplit( x = lines,split = pattern)),1)
  }
  
  wc.reduce =function(word, counts ) {
    keyval(word, sum(counts))
  }         
  
  mapreduce(input = input ,output = output, input.format = "text",
            map = wc.map, reduce = wc.reduce,combine = TRUE)
}
output<-wordcount(input)
from.dfs(output)

3). 分步式协同过滤ItemCF算法介绍
主要内容:RHadoop实践系列之三 R实现MapReduce的协同过滤算法

aglorithm_2

4). ItemCF算法:R本地程序实现

主要内容:RHadoop实践系列之三 R实现MapReduce的协同过滤算法

源代码:


library(plyr)

#读取数据集
train<-read.csv(file="small.csv",header=FALSE)
names(train)<-c("user","item","pref") 

#计算用户列表
usersUnique<-function(){
  users<-unique(train$user)
  users[order(users)]
}

#计算商品列表方法
itemsUnique<-function(){
  items<-unique(train$item)
  items[order(items)]
}

# 用户列表
users<-usersUnique() 
users

# 商品列表
items<-itemsUnique() 
items

#建立商品列表索引
index<-function(x) which(items %in% x)
data<-ddply(train,.(user,item,pref),summarize,idx=index(item)) 
data

#同现矩阵
cooccurrence<-function(data){
  n<-length(items)
  co<-matrix(rep(0,n*n),nrow=n)
  for(u in users){
    idx<-index(data$item[which(data$user==u)])
    m<-merge(idx,idx)
    for(i in 1:nrow(m)){
      co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1
    }
  }
  return(co)
}


#推荐算法
recommend<-function(udata=udata,co=coMatrix,num=0){
  n<-length(items)
  
  # all of pref
  pref<-rep(0,n)
  pref[udata$idx]<-udata$pref
  
  # 用户评分矩阵
  userx<-matrix(pref,nrow=n)
  
  # 同现矩阵*评分矩阵
  r<-co %*% userx
  
  # 推荐结果排序
  r[udata$idx]<-0
  idx<-order(r,decreasing=TRUE)
  topn<-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx])
  topn<-topn[which(topn$val>0),]
  
  # 推荐结果取前num个
  if(num>0){
    topn<-head(topn,num)
  }
  
  #返回结果
  return(topn)
}

co<-cooccurrence(data) 
co


#计算推荐结果
recommendation<-data.frame()
for(i in 1:length(users)){
  udata<-data[which(data$user==users[i]),]
  recommendation<-rbind(recommendation,recommend(udata,co,0)) 
} 

recommendation

5). ItemCF算法:RHadoop实现

主要内容:RHadoop实践系列之三 R实现MapReduce的协同过滤算法

源代码:


#加载rmr2包
library(rmr2)

#输入数据文件
train<-read.csv(file="small.csv",header=FALSE)
names(train)<-c("user","item","pref")

#把数据集存入HDFS
train.hdfs = to.dfs(keyval(train$user,train))
from.dfs(train.hdfs)

#STEP 1, 建立物品的同现矩阵
# 1) 按用户分组,得到所有物品出现的组合列表。
train.mr<-mapreduce(
  train.hdfs, 
  map = function(k, v) {
    keyval(k,v$item)
  }
  ,reduce=function(k,v){
    m<-merge(v,v)
    keyval(m$x,m$y)
  }
)
from.dfs(train.mr)

# 2) 对物品组合列表进行计数,建立物品的同现矩阵
step2.mr<-mapreduce(
  train.mr,
  map = function(k, v) {
    d<-data.frame(k,v)
    d2<-ddply(d,.(k,v),count)
    
    key<-d2$k
    val<-d2
    keyval(key,val)
  }
)
from.dfs(step2.mr)

# 2. 建立用户对物品的评分矩阵
train2.mr<-mapreduce(
  train.hdfs, 
  map = function(k, v) {
    df<-v
    key<-df$item
    val<-data.frame(item=df$item,user=df$user,pref=df$pref)
    keyval(key,val)
  }
)
from.dfs(train2.mr)

#3. 合并同现矩阵 和 评分矩阵
eq.hdfs<-equijoin(
  left.input=step2.mr, 
  right.input=train2.mr,
  map.left=function(k,v){
    keyval(k,v)
  },
  map.right=function(k,v){
    keyval(k,v)
  },
  outer = c("left")
)
from.dfs(eq.hdfs)


#4. 计算推荐结果列表
cal.mr<-mapreduce(
  input=eq.hdfs,
  map=function(k,v){
    val<-v
    na<-is.na(v$user.r)
    if(length(which(na))>0) val<-v[-which(is.na(v$user.r)),]
    keyval(val$k.l,val)
  }
  ,reduce=function(k,v){
    val<-ddply(v,.(k.l,v.l,user.r),summarize,v=freq.l*pref.r)
    keyval(val$k.l,val)
  }
)
from.dfs(cal.mr)


#5. 按输入格式得到推荐评分列表
result.mr<-mapreduce(
  input=cal.mr,
  map=function(k,v){
    keyval(v$user.r,v)
  }
  ,reduce=function(k,v){
    val<-ddply(v,.(user.r,v.l),summarize,v=sum(v))
    val2<-val[order(val$v,decreasing=TRUE),]
    names(val2)<-c("user","item","pref")
    keyval(val2$user,val2)
  }
)
from.dfs(result.mr)

6). ItemCF算法:Java Hadoop MapReduce实现

主要内容:用Hadoop构建电影推荐系统

源代码:https://github.com/bsspirit/maven_hadoop_template/releases/tag/recommend

7). ItemCF算法:Mahout 实现

主要内容:Mahout分步式程序开发 基于物品的协同过滤ItemCF

源代码: https://github.com/bsspirit/maven_mahout_template/tree/mahout-0.8

8). 推荐结果,数据可视化

数据集:small.csv


1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.0
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0

结果集: result.csv


1,104,33.5
1,106,18
1,105,15.5
1,107,5
2,106,20.5
2,105,15.5
2,107,4
3,103,24.5
3,102,18.5
3,106,16.5
4,102,37
4,105,26
4,107,9.5
5,107,11.5

R语言Socail Graph可视化


library(igraph)

train<-read.csv(file="small.csv",header=FALSE)

drawGraph<-function(data){
  names(data)<-c("from","to","f") 
  g <- graph.data.frame(data, directed=TRUE)
  V(g)$label <- V(g)$name
  V(g)$size <- 25
  V(g)$color <- c(rep("green",5),rep("red",7))
  V(g)$shape <- c(rep("rectangle",5),rep("circle",7))
  E(g)$color <- grey(0.5)
  E(g)$weight<-data$f
  E(g)$width<-scale(E(g)$weight,scale=TRUE)+2
  g2 <- simplify(g)
  plot(g2,edge.label=E(g)$weight,edge.width=E(g)$width,layout=layout.circle)
}

#small
drawGraph(train)

src_graph


#recommandation
recommendation<-read.csv(file="result.csv",header=FALSE)
drawGraph(recommendation)

recommand_graph

2. 活动照片

chinahadoop-1

chinahadoop-2

chinaHadoop2013

转载请注明出处:
http://blog.fens.me/hadoop-china-rhadoop-2013/

打赏作者

R语言为Hadoop注入统计血脉

RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析。Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来替代Java的MapReduce实现。有了RHadoop可以让广大的R语言爱好者,有更强大的工具处理大数据1G, 10G, 100G, TB, PB。 由于大数据所带来的单机性能问题,可能会一去不复返了。

RHadoop实践是一套系列文章,主要包括”Hadoop环境搭建”,”RHadoop安装与使用”,R实现MapReduce的协同过滤算法”,”HBase和rhbase的安装与使用”。对于单独的R语言爱好者,Java爱好者,或者Hadoop爱好者来说,同时具备三种语言知识并不容 易。此文虽为入门文章,但R,Java,Hadoop基础知识还是需要大家提前掌握。

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-hadoop-intro/

rhadoop-intro

前言

写过几篇关于RHadoop的技术性文章,都是从统计的角度,介绍如何让R语言利用Hadoop处理大数据。今天决定反过来,从计算机开发人员的角度,介绍如何让Hadoop结合R语言,能做统计分析的事情。

目录

  1. R语言介绍
  2. Hadoop介绍
  3. 为什么要让Hadoop结合R语言?
  4. 如何让Hadoop结合R语言?
  5. R和Hadoop在实际中的案例

1. R语言介绍

起源

R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心团队”负责开发。R是基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现。R的语法是来自Scheme。

跨平台,许可证

R的源代码可自由下载使用,GNU通用公共许可证,可在多种平台下运行,包括UNIX,Linux,Windows和MacOS。R主要是以命令行操作为主,同时支持GUI的图形用户界面。

R的数字基因

R内建多种统计学及数字分析功能。因为S的血缘,R比其他统计学或数学专用的编程语言有更强的物件导向功能。

R的另一强项是绘图功能,制图具有印刷的素质,也可加入数学符号。

虽然R主要用于统计分析或者开发统计相关的软体,但也有人用作矩阵计算。其分析速度可媲美GNU Octave甚至商业软件MATLAB。

代码库

CRAN为Comprehensive R Archive Network的简称。它除了收藏了R的执行档下载版、源代码和说明文件,也收录了各种用户撰写的软件包。全球有超过一百个CRAN镜像站,上万个第三方的软件包。

R的行业应用

统计分析,应用数学,计量经济,金融分析,财经分析,人文科学,数据挖掘,人工智能,生物信息学,生物制药,全球地理科学,数据可视化。

商业竞争对手

  • SAS:(Statistical Analysis System),是SAS公司推出的一款用于数据分析和和决策支持的大型集成式模块化软件系统。
  • SPSS:(Statistical Product and Service Solutions)是IBM公司推出的一系列用于统计学分析运算、数据挖掘、预测分析和决策支持任务的软件产品及相关服务的总称。
  • Matlab:(MATrix LABoratory),是MathWorks公司出品的一款商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

2. Hadoop介绍

Hadoop对于计算机的人,都是耳熟能说的技术了。

Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。

zookeeper

Hadoop的家族成员:Hive, HBase, Zookeeper, Avro, Pig, Ambari, Sqoop, Mahout, Chukwa

  • Hive: 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
  • Pig: 是一个基于Hadoop的大规模数据分析工具,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。
  • HBase: 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
  • Sqoop: 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
  • Zookeeper:是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务
  • Mahout:是基于Hadoop的机器学习和数据挖掘的一个分布式框架。Mahout用MapReduce实现了部分数据挖掘算法,解决了并行挖掘的问题。
  • Avro: 是一个数据序列化系统,设计用于支持数据密集型,大批量数据交换的应用。Avro是新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制
  • Ambari: 是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。
  • Chukwa: 是一个开源的用于监控大型分布式系统的数据收集系统,它可以将各种各样类型的数据收集成适合 Hadoop 处理的文件保存在 HDFS 中供 Hadoop 进行各种 MapReduce 操作。

自2006年,Hadoop以MapReduce和HDFS独立发展开始,到今年2013年不过7年时间,Hadoop的家族已经孵化出多个Apache的顶级项目。特别是最近1-2年,发展速度越来越快,又融入了很多新技术(YARN, Hcatalog, Oozie, Cassandra),都有点让我们都学不过来了。

3. 为什么要让Hadoop结合R语言?

前面两章,R语言介绍和Hadoop介绍,让我们体会到了,两种技术在各自领域的强大。很多开发人员在计算机的角度,都会提出下面2个问题。

  • 问题1: Hadoop的家族如此之强大,为什么还要结合R语言?
  • 问题2: Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?

下面我尝试着做一个解答:

问题1: Hadoop的家族如此之强大,为什么还要结合R语言?

a. Hadoop家族的强大之处,在于对大数据的处理,让原来的不可能(TB,PB数据量计算),成为了可能。

b. R语言的强大之处,在于统计分析,在没有Hadoop之前,我们对于大数据的处理,要取样本,假设检验,做回归,长久以来R语言都是统计学家专属的工具。

c. 从a和b两点,我们可以看出,hadoop重点是全量数据分析,而R语言重点是样本数据分析。 两种技术放在一起,刚好是最长补短!

d. 模拟场景:对1PB的新闻网站访问日志做分析,预测未来流量变化

d1:用R语言,通过分析少量数据,对业务目标建回归建模,并定义指标。

d2:用Hadoop从海量日志数据中,提取指标数据

d3:用R语言模型,对指标数据进行测试和调优

d4:用Hadoop分步式算法,重写R语言的模型,部署上线

这个场景中,R和Hadoop分别都起着非常重要的作用。以计算机开发人员的思路,所有有事情都用Hadoop去做,没有数据建模和证明,”预测的结果”一定是有问题的。以统计人员的思路,所有的事情都用R去做,以抽样方式,得到的“预测的结果”也一定是有问题的。

所以让二者结合,是产界业的必然的导向,也是产界业和学术界的交集,同时也为交叉学科的人才提供了无限广阔的想象空间。

问题2: Mahout同样可以做数据挖掘和机器学习,和R语言的区别是什么?

a. Mahout是基于Hadoop的数据挖掘和机器学习的算法框架,Mahout的重点同样是解决大数据的计算的问题。

b. Mahout目前已支持的算法包括,协同过滤,推荐算法,聚类算法,分类算法,LDA, 朴素bayes,随机森林。上面的算法中,大部分都是距离的算法,可以通过矩阵分解后,充分利用MapReduce的并行计算框架,高效地完成计算任务。

c. Mahout的空白点,还有很多的数据挖掘算法,很难实现MapReduce并行化。Mahout的现有模型,都是通用模型,直接用到的项目中,计算结果只会比随机结果好一点点。Mahout二次开发,要求有深厚的JAVA和Hadoop的技术基础,最好兼有 “线性代数”,“概率统计”,“算法导论” 等的基础知识。所以想玩转Mahout真的不是一件容易的事情。

d. R语言同样提供了Mahout支持的约大多数算法(除专有算法),并且还支持大量的Mahout不支持的算法,算法的增长速度比mahout快N倍。并且开发简单,参数配置灵活,对小型数据集运算速度非常快。

虽然,Mahout同样可以做数据挖掘和机器学习,但是和R语言的擅长领域并不重合。集百家之长,在适合的领域选择合适的技术,才能真正地“保质保量”做软件。

4. 如何让Hadoop结合R语言?

从上一节我们看到,Hadoop和R语言是可以互补的,但所介绍的场景都是Hadoop和R语言的分别处理各自的数据。

一旦市场有需求,自然会有商家填补这个空白。

1). RHadoop
RHadoop是一款Hadoop和R语言的结合的产品,由RevolutionAnalytics公司开发,并将代码开源到github社区上面。RHadoop包含三个R包 (rmr,rhdfs,rhbase),分别是对应Hadoop系统架构中的,MapReduce, HDFS, HBase 三个部分。

参考文章:
RHadoop实践系列之二:RHadoop安装与使用
RHadoop实践系列之四 rhbase安装与使用

2). RHive
RHive是一款通过R语言直接访问Hive的工具包,是由NexR一个韩国公司研发的。

参考文章:
R利剑NoSQL系列文章 之 Hive
用RHive从历史数据中提取逆回购信息

3). 重写Mahout
用R语言重写Mahout的实现也是一种结合的思路,我也做过相关的尝试。

参考文章:
用R解析Mahout用户推荐协同过滤算法(UserCF)

4).Hadoop调用R

上面说的都是R如何调用Hadoop,当然我们也可以反相操作,打通JAVA和R的连接通道,让Hadoop调用R的函数。但是,这部分还没有商家做出成形的产品。

我写了2个例子,大家可以自己尝试着结合,做出不一样的应用来。

参考文章:
Rserve与Java的跨平台通信
解惑rJava R与Java的高速通道

5. R和Hadoop在实际中的案例

R和Hadoop的结合,技术门槛还是有点高的。对于一个人来说,不仅要掌握Linux, Java, Hadoop, R的技术,还要具备 软件开发,算法,概率统计,线性代数,数据可视化,行业背景 的一些基本素质。

在公司部署这套环境,同样需要多个部门,多种人才的的配合。Hadoop运维,Hadoop算法研发,R语言建模,R语言MapReduce化,软件开发,测试等等。。。

所以,这样的案例并不太多。

我做过一些尝试和努力,已经整理成文章的有3个项目,文章中仅仅是实现思路。

参考文章:
RHadoop实践系列之三 R实现MapReduce的协同过滤算法
RHadoop实验 – 统计邮箱出现次数
用RHive从历史数据中提取逆回购信息

展位未来
对于R和Hadoop的结合,在近几年,肯定会生成爆发式的增长的。但由于跨学科会造成技术壁垒,人才会远远跟不上市场的需求。

所以,肯定会有更多的大数据工具,被发明!机会就在我们的手中,也许明天你的创新,就是我们追逐的方向!!

加油!!

######################################################
看文字不过瘾,作者视频讲解,请访问网站:http://onbook.me/video
######################################################

转载请注明出处:
http://blog.fens.me/r-hadoop-intro/

打赏作者

了解google的指令集

我的博客我的SEO系列文章,将介绍如何利用搜索引擎优化技术,来提高我的博客的排名,一方面把知识分享给更多的人,另一方面通过网站流量做些转化的尝试。

写博客文章已经有3个月,70篇博文,9大系列,覆盖R语言,Hadoop,RHadoop,NoSQL,MongoDB,Ubuntu,VPS,NodeJS 等领域。 有一部分文章已经被google和baidu收录,并且自然搜索排名的位置比较靠前。通过保证文章的质量,提高自然搜索的排名,是没有捷径的。但由于博客没有做任何推广,所以PR一直是0,搜索引擎速带来的流量也是非常有限的。优化必然带来提升。

做IT技术不仅要扎根深入,广度也要有所积累。所以今天就开始自己动手,优化自己的博客,让网站流量提高20倍吧…..

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/google-command/

google-command

前言

Google是全球最大的搜索引擎,我每天都要在Google上面进行搜索。大部分情况是输入关键字,然后看到模糊匹配的结果。这仅仅是Google搜索的冰山一角,Google还提供了很多的高级搜索指令,方便地帮我们定位到想找的资源页面。这些高级指令更贴心的比喻,就像是“快捷键”一样。还有人说,这些高级指令是黑客的必修课,是发现漏洞的武器。今天就让我们体验一把,Google搜索的神奇。

目录

  1. 高级搜索命令概况
  2. 常用指令:
    双引号,减号,星号,inurl,intitle,allintitle,filetype,site,link,related
  3. 没什么用指令:
    info,insubject,movie,phonebook,safesearch,source,stocks,datarange,ext,weather,tq
  4. 参考资料

1. 高级搜索命令概况

按搜索功能进行的分类

搜索服务 搜索指令
网页搜索 allinanchor:, allintext:, allintitle:, allinurl:, cache:, define:, filetype:, id:, inanchor:, info:,  intext:, intitle:, inurl:,link:, related:, site:
图片搜索 allintitle:, allinurl:, filetype:, inurl:, intitle:, site:
分组搜索 allintext:, allintitle:, author:, group:, insubject:, intext:, intitle:
目录搜索 allintext:, allintitle:, allinurl:, ext:, filetype:, intext:, intitle:, inurl:
新闻搜索 allintext:, allintitle:, allinurl:, intext:, intitle:, inurl:, location:, source:
产品搜索 allintext:, allintitle:

下面将具体介绍,每个搜索指令,并以常用,不常用进行分类。

2. 常用指令

1) 双引号
把搜索词放在双引号中,代表完全匹配搜索。

例如:”rhadoop实践”
seo1

结果都是cos.name,虽然我的博客也相同的文章,但由于cos.name的权重比大,会显示cos.name的。

2) 减号
减号(-)表示搜索引擎搜索不包括减号后面词的页面。(前面必须是空格,减号后面没有空格,紧跟着需要排除的词).

例如:”rhadoop实践” -cos.name ,排除cos.name的域名。
seo2

在排除cos.name的域名之后,我的博客被放到第一的位置。

3) 星号
星号(*)是通配符,用在搜索引擎中,匹配任意的字符。

例如:rhadoo*实践, 用*号替代的文字会自动的匹配上面
seo3

4) inurl
inurl:搜索词在URL上面的

例如:inurl:rhadoop实践
seo4

匹配后只有2条记录,只有两个页面URL中,包含rhadoop实践关键字。

5) intitle
intitle:搜索词是页面title中包含关键词

例如:intitle:rhadoop实践
seo5

回到了cos.name的域名。

6) allintitle
allintitle:搜索返回的是页面标题中包含多组关键词的文件。

例如:allintitle:rhadoop实践 粉丝
seo6

回到了我的博客

7) filetype
filetype: 用于搜索特定文件的格式,用于搜索特定的资源,比如PDF电子书、word文件等非常有用。

例如:filetype:pdf rhadoop
seo7

这样就找到了当时准备rhadoop沙龙的PDF

8) site
site:针对某个域名进行搜索

例如:site:fens.me rhadoop
seo8

还是我的博客内容。

9) link
link:查找某网站的反向链接,包括内部链接,外部链接

例如:link:fens.me
惭愧的是,Google并没记录我的博客的反链。

10) related
related:与网站内容相关的页面

例如:related:fens.me
依然没有返回结果,因为我的博客还没有明确的定位。

查一下统计之都的网站:related:cos.name

seo9

最相关的是创始人:谢益辉的博客。

3. 没什么用的指令

1) info
提交info:url,将会显示需要查询网站的一些信息。

例如:info:fens.me

2) insubject
insubject: 当我们用insubject进行查询的时候,Google会限制论坛搜索结果仅是那些在主题里边包含了查询关键词的网面。[insubject:”falling asleep”],提交这个查询,Google会返回在文章主题里边包含了”falling asleep”的文章。
例如:insubject:fens.me

3) movie
movie: 当我们用movie提交查询的时候,Google会返回跟查询关键词相关的电影信息。

4) phonebook
phonebook: 当我们用phonebook进行查询的时候,Google会返回美国当地跟查询关键词相关的电话信息。例:phonebook:fens.me

5) safesearch
safesearch: 用safesearch提交查询的时候,Google会过滤你搜索的结果,其中过滤的内容可能包括一些色情的,暴力,赌博性质的,还有传染病毒的网页。但是它不是百分之百确保安全的。例,[safesearch:breasts]。

6) source
source: 当用source提交查询的时候,Google新闻会限制我们的查询仅是那些我们指定了特定ID或新闻源的网址。例[election source:new_york_times],提交这个查询,Google将会显示纽约时报包含了查询关键词”election”的相关文章。(我们也可以通过Google news高级搜索完成查询)

7) stocks
stocks: 当我们用stocks提交查询的时候,Google会返回跟查询关键词相关的股票信息,这些信息一般来自于其它一些专业的财经网站。例如:stocks:GOOGLE

8) datarange
datarange: 当我们使用datarange进行查询的时候,Google会将查询结果限制在一个特定的时间段内,这个时间相对于网站来说,是按网站被google收录的时间算的。例 ”Geri Halliwell” “Spice Girls” daterange:2450958-2450968 。这里的时间日期格式是按天文学的儒略日。(这个搜索语法Google并不推荐使用,因为它会返回一些莫名其妙的东西)

9) ext
ext: 这是一个没有证实的语法,可以用于filetype:查找扩散名为ext的文件。

10) weather
weather: 当我们用weather提交查询的时候,如果我们指出一个Google可以识别的地区或城市,Google会返回该地区或城市当前的天气状况。

例如:weather:beijing
s1

11) tq同weather
tq: 如果想查某个地方的天气如何,我们只要在Google搜索框中输入”城市名称 Tq”就可以查询到这个城市的天状况.例”北京 tq”,当然tq也可以用汉字的天气代替。

4. 参考资料

转载请注明出处:
http://blog.fens.me/google-command/

打赏作者

解决RHadoop错误:PipeMapRed.waitOutputThreads(): subprocess failed with code 1

RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析。Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来替代Java的MapReduce实现。有了RHadoop可以让广大的R语言爱好者,有更强大的工具处理大数据1G, 10G, 100G, TB, PB。 由于大数据所带来的单机性能问题,可能会一去不复返了。

RHadoop实践是一套系列文章,主要包括”Hadoop环境搭建”,”RHadoop安装与使用”,R实现MapReduce的协同过滤算法”,”HBase和rhbase的安装与使用”。对于单独的R语言爱好者,Java爱好者,或者Hadoop爱好者来说,同时具备三种语言知识并不容 易。此文虽为入门文章,但R,Java,Hadoop基础知识还是需要大家提前掌握。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/rhadoop-rmr2-pipemapred/

rhadoop-pipemapred

前言

一行错误难倒一片同学,今天在准备 统计之都沙龙 的时候,我也遇到相同的错误。就让我来解决一下,在使用rhadoop的rmr2中,经常会遇到的一个错误。

按照 RHadoop实践系列之二:RHadoop安装与使用 rmr2中实例所演示。


> small.ints = to.dfs(1:10)
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
> from.dfs("/tmp/RtmpWnzxl4/file5deb791fcbd5")

 

文章目录:

  1. rmr2运行错误日志
  2. 定位错误到hadoop日志
  3. 从hadoop入手找解决办法 — 失败
  4. 从rhadoop入手找解决办法 — 成功

 

1. rmr2运行错误日志

R执行的错误日志如下面:

packageJobJar: [/tmp/Rtmpdf7egm/rmr-local-env3cbb70983, /tmp/Rtmpdf7egm/rmr-global-env3cbb654b85fe, /tmp/                        Rtmpdf7egm/rmr-streaming-map3cbba213f2e, /home/conan/hadoop/tmp/hadoop-unjar1697638502297829404/] [] /tmp                        /streamjob4620072667602885650.jar tmpDir=null
13/06/23 10:44:25 INFO mapred.FileInputFormat: Total input paths to process : 1
13/06/23 10:44:25 INFO streaming.StreamJob: getLocalDirs(): [/home/conan/hadoop/tmp/mapred/local]
13/06/23 10:44:25 INFO streaming.StreamJob: Running job: job_201306231032_0001
13/06/23 10:44:25 INFO streaming.StreamJob: To kill this job, run:
13/06/23 10:44:25 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -D                        mapred.job.tracker=hdfs://master:9001 -kill job_201306231032_0001
13/06/23 10:44:25 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_20                        1306231032_0001
13/06/23 10:44:26 INFO streaming.StreamJob:  map 0%  reduce 0%
13/06/23 10:45:04 INFO streaming.StreamJob:  map 100%  reduce 100%
13/06/23 10:45:04 INFO streaming.StreamJob: To kill this job, run:
13/06/23 10:45:04 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://master:9001 -kill job_201306231032_0001
13/06/23 10:45:04 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306231032_0001
13/06/23 10:45:04 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201306231032_0001_m_000000
13/06/23 10:45:04 INFO streaming.StreamJob: killJob...
Streaming Command Failed!
Error in mr(map = map, reduce = reduce, combine = combine, vectorized.reduce,  :
  hadoop streaming failed with error code 1

我们光看上面的日志,根本发现不了hadoop的实际错误是什么!

2. 定位错误到hadoop日志

接下来需要定位到实际错误的位置。为了方便查询日志,我们打开jobtracker的控制台:http://192.168.1.210:50030/jobtracker.jsp
并找到刚才出现错误的, 日志中有提示的网页位置, Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306231032_0001

rhadoop

查看map的错误,现在已经明确有了错误定义。


Running a job using hadoop streaming and mrjob: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 at 
org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:362) at 
org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:576) at 
org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:135) at 
org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) at 
org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) at 
org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436) at 
org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) at 
org.apache.hadoop.mapred.Child$4.run(Child.java:255) at 
java.security.AccessController.doPrivileged(Native Method) at 
javax.security.auth.Subject.doAs(Subject.java:396) at 
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) at 
org.apache.hadoop.mapred.Child.main(Child.java:249)

3. 从hadoop入手找解决办法 — 失败

查看hadoop错误列表:code 1的错误
“OS error code 1: Operation not permitted”"OS error code 2: No such file or directory”

我来分析一下:hadoop和R的用户和用户组

启动hadoop, 用户conan, 用户组conan
启动R, 用户conan, 用户组conan

既然都是相同权限的用户,怎么会有权限的问题呢。

再找另一个hadoop环境做测试,用户使用root,没有错误如文章所示,RHadoop实践系列之二:RHadoop安装与使用

好了,这样问题已经很具体了,我们去网上查找一下错误原因。

通过google搜索,找到 org.apache.hadoop.security.AccessControlException解决办法文章
http://www.51testing.com/?uid-445759-action-viewspace-itemid-821244

具体的错误原因,在文章中有写,我就不再列出了。我们参考他的方法二,对我们的hadoop环境进行调整。
在hdfs-site.xml中增加dfs.permissions.superusergroup的定义。

superusergroup,默认值用什么我们可以在系统中查一下。


~ hadoop fs -ls /
drwxr-xr-x   - conan supergroup          0 2013-04-24 01:52 /hbase
drwxr-xr-x   - conan supergroup          0 2013-04-25 04:59 /home
drwxr-xr-x   - conan supergroup          0 2013-06-23 10:44 /tmp
drwxr-xr-x   - conan supergroup          0 2013-04-24 19:28 /user

这样就得到了supergroup的名字是supergroup, 我们修改hdfs-site.xml,增加dfs.permissions.superusergroup的定义


~ vi $HADOOP_HOME/conf/hdfs-site.xml

<configuration>
<property>
<name>dfs.data.dir</name>
<value>/home/conan/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.superusergroup</name>
<value>supergroup</value>
</property>
</configuration>

重启hadoop,重启R程序,重新执行rmr2脚本。还是有错误,没有解决问题。

4. 从rhadoop入手找解决办法 — 成功

我们找到rhadoop的作者github的issue 122:
https://github.com/RevolutionAnalytics/RHadoop/issues/122

发现其他人也遇到了,类似的错误。这issue已经是closed状态,证明错误已经解决。
根据作者的回答我们发现,错误是由于:“R的类库在特定的用户下面,而不是标准合位置,导致类库不能被hadoop找到”。

在我们的环境中,发现也是同样的配置,与错误描述一致。


~ R
> .libPaths()
[1] "/home/conan/R/x86_64-pc-linux-gnu-library/2.15"
[2] "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"
[4] "/usr/lib/R/library"

~ ls /home/conan/R/x86_64-pc-linux-gnu-library/2.15
colorspace  functional  iterators  munsell  RColorBrewer  rhdfs    rmr2
dichromat   ggplot2     itertools  plyr     Rcpp          rJava    scales
digest      gtable      labeling   proto    reshape2      RJSONIO  stringr

~ ls /usr/local/lib/R/site-library

我们环境安装的所有类库,都在/home/conan目录下面,而/usr/local/lib/R/site-library一个库类都没有。

我们按照rhadoop作者指示,把包进行重新安装。


#切换到root下面
~ sudo -i

#查看R的类库路径
~ R
> .libPaths()
[1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library"
[3] "/usr/lib/R/library"

#在root下进行安装
~ R CMD javareconf 
~ R

#启动R程序
install.packages("rJava")
install.packages("reshape2")
install.packages("Rcpp")
install.packages("iterators")
install.packages("itertools")
install.packages("digest")
install.packages("RJSONIO")
install.packages("functional")

~ cd /home/conan/R
~ R CMD INSTALL rmr2_2.1.0.tar.gz
~ ls /usr/local/lib/R/site-library
digest  functional  iterators  itertools  plyr  Rcpp  reshape2  rJava  RJSONIO  rmr2  stringr

依赖包都安装在了/usr/local/lib/R/site-library下面,我们退出root用户,重新启动R程序测试


~ exit
~ whoami
conan

~ R
> library(rmr2)
Loading required package: Rcpp
Loading required package: RJSONIO
Loading required package: digest
Loading required package: functional
Loading required package: stringr
Loading required package: plyr
Loading required package: reshape

#再次运行 rmr2程序
> small.ints = to.dfs(1:10)
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))

packageJobJar: [/tmp/RtmpM87JEc/rmr-local-env1c7588ca7ed, /tmp/RtmpM87JEc/rmr-global-env1c77fdcab5f, /tmp                       /RtmpM87JEc/rmr-streaming-map1c76a4ddf6e, /home/conan/hadoop/tmp/hadoop-unjar6992113986427459004/] [] /tm                       p/streamjob2762947354578034435.jar tmpDir=null
13/06/23 13:27:36 INFO mapred.FileInputFormat: Total input paths to process : 1
13/06/23 13:27:36 INFO streaming.StreamJob: getLocalDirs(): [/home/conan/hadoop/tmp/mapred/local]
13/06/23 13:27:36 INFO streaming.StreamJob: Running job: job_201306231141_0007
13/06/23 13:27:36 INFO streaming.StreamJob: To kill this job, run:
13/06/23 13:27:36 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -D                       mapred.job.tracker=hdfs://master:9001 -kill job_201306231141_0007
13/06/23 13:27:36 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_20                       1306231141_0007
13/06/23 13:27:37 INFO streaming.StreamJob:  map 0%  reduce 0%
13/06/23 13:27:51 INFO streaming.StreamJob:  map 100%  reduce 0%
13/06/23 13:27:58 INFO streaming.StreamJob:  map 100%  reduce 100%
13/06/23 13:27:58 INFO streaming.StreamJob: Job complete: job_201306231141_0007
13/06/23 13:27:58 INFO streaming.StreamJob: Output: /tmp/RtmpM87JEc/file1c722c5c6ae

执行成功, 错误解决!!

本文从发现错误,定位错误,查找错误,解决错误,4个步骤解决上面的问题。
希望给遇到问题束手无策的同学,不仅提供直接的错误帮助,更有一个思路上的认识,提高自己的动手能力!!

转载请注明出处:
http://blog.fens.me/rhadoop-rmr2-pipemapred/

打赏作者

RHadoop实验 – 统计邮箱出现次数

RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析。Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来替代Java的MapReduce实现。有了RHadoop可以让广大的R语言爱好者,有更强大的工具处理大数据1G, 10G, 100G, TB, PB。 由于大数据所带来的单机性能问题,可能会一去不复返了。

RHadoop实践是一套系列文章,主要包括”Hadoop环境搭建”,”RHadoop安装与使用”,R实现MapReduce的协同过滤算法”,”HBase和rhbase的安装与使用”。对于单独的R语言爱好者,Java爱好者,或者Hadoop爱好者来说,同时具备三种语言知识并不容 易。此文虽为入门文章,但R,Java,Hadoop基础知识还是需要大家提前掌握。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/rhadoop-demo-email/

rhadoop-demo-email

目录

  1. 需求描述
  2. 实验数据
  3. 算法实现

1. 需求描述

基于RHADOOP通过rmr包实现MapReduce算法

  • 1). 计算邮箱域出现了多少次
  • 2). 按次数从大到小排序

例如:
163.com,14
sohu.com,2

2. 实验数据

wolys@21cn.com
zss1984@126.com
294522652@qq.com
simulateboy@163.com
zhoushigang_123@163.com
sirenxing424@126.com
lixinyu23@qq.com
chenlei1201@gmail.com
370433835@qq.com
cxx0409@126.com
viv093@sina.com
q62148830@163.com
65993266@qq.com
summeredison@sohu.com
zhangbao-autumn@163.com
diduo_007@yahoo.com.cn
fxh852@163.com
weiyang1128@163.com
licaijun007@163.com
junhongshouji@126.com
wuxiaohong11111@163.com
fennal@sina.com
li_dao888@163.com
bokil.xu@163.com
362212053@qq.com
youloveyingying@yahoo.cn
boiny@126.com
linlixian200606@126.com
alex126126@126.com
654468252@qq.com
huangdaqiao@yahoo.com.cn
kitty12502@163.com
xl200811@sohu.com
ysjd8@163.com
851627938@qq.com
wubo_1225@163.com
kangtezc@163.com
xiao2018@126.com
121641873@qq.com
296489419@qq.com
beibeilong012@126.com

3. 算法实现

1). 计算邮箱域出现了多少次

把数据上传到HDFS


library(rmr2)
data<-read.table(file="hadoop15.txt")
d0<-to.dfs(keyval(1, data))
from.dfs(d0)

输出:


$key
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[39] 1 1 1
$val
V1
1 wolys@21cn.com
2 zss1984@126.com
3 294522652@qq.com
4 simulateboy@163.com
5 zhoushigang_123@163.com
6 sirenxing424@126.com
7 lixinyu23@qq.com
8 chenlei1201@gmail.com
9 370433835@qq.com
10 cxx0409@126.com
11 viv093@sina.com
12 q62148830@163.com
13 65993266@qq.com
14 summeredison@sohu.com
15 zhangbao-autumn@163.com
16 diduo_007@yahoo.com.cn
17 fxh852@163.com
18 weiyang1128@163.com
19 licaijun007@163.com
20 junhongshouji@126.com
21 wuxiaohong11111@163.com
22 fennal@sina.com
23 li_dao888@163.com
24 bokil.xu@163.com
25 362212053@qq.com
26 youloveyingying@yahoo.cn
27 boiny@126.com
28 linlixian200606@126.com
29 alex126126@126.com
30 654468252@qq.com
31 huangdaqiao@yahoo.com.cn
32 kitty12502@163.com
33 xl200811@sohu.com
34 ysjd8@163.com
35 851627938@qq.com
36 wubo_1225@163.com
37 kangtezc@163.com
38 xiao2018@126.com
39 121641873@qq.com
40 296489419@qq.com
41 beibeilong012@126.com

计算邮箱域出现了多少次


mr<-function(input=d0){
map<-function(k,v){
keyval(word(as.character(v$V1), 2, sep = fixed('@')),1)
}
reduce =function(k, v ) {
keyval(k, sum(v))
}
d1<-mapreduce(input=input,map=map,reduce=reduce,combine=TRUE)
}
d1<-mr(d0)
from.dfs(d1)

输出:

$key
[1] "126.com" "163.com" "21cn.com" "gmail.com" "qq.com"
[6] "sina.com" "sohu.com" "yahoo.cn" "yahoo.com.cn"
$val
[1] 9 14 1 1 9 2 2 1 2

2). 按次数从大到小排序


sort<-function(input=d1){
map<-function(k,v){
keyval(1,data.frame(k,v))
}
reduce<-function(k,v){
v2<-v[order(as.integer(v$v),decreasing=TRUE),]
keyval(1,v2)
}
d2<-mapreduce(input=input,map=map,reduce=reduce,combine=TRUE)
}
d2<-sort(d1)
result<-from.dfs(d2)
result$val

输出:


k v
2 163.com 14
1 126.com 9
5 qq.com 9
6 sina.com 2
7 sohu.com 2
9 yahoo.com.cn 2
3 21cn.com 1
4 gmail.com 1
8 yahoo.cn 1

转载请注明出处:
http://blog.fens.me/rhadoop-demo-email/

打赏作者