CWYAlpha

Just another WordPress.com site

Thought this was cool: Hadoop及RHadoop的初步尝试

leave a comment »


跑步归来写个日记。最近在学习Hadoop的使用,起初是写一点Hive的统计脚本,后来觉得不了解Hadoop的机制就没办法对脚本做优化,所以就硬着头皮开始学习。众所周知我是个计算机小白,直接上集群操作的话总担心把机器搞坏掉,于是我就冒着较小的风险把我工作电脑的WIN7系统卸掉了,用UBUNTU来跑伪分布式的Hadoop。这两天又顺手试用了一下RHadoop项目中的rmr包和rhdfs包。作为新手,学习过程中遇到不少坑,之前关于R的知识也大多没办法移植到LINUX平台上,所以我就做了个笔记。没啥有意思的东西,只是整理个备忘。
1、操作系统
我选用的是UBUNTU系统12.04桌面版。很早就听说这个系统比较好用适合入门,终于也尝试了一把。确实比较好用的,尤其安装起来很方便,可以直接装在U盘里面,以后需要重装神马的也很便利。自带的几张壁纸都很漂亮。
2、JAVA环境
最开始是用的1.7的JDK,后来装rJava包死活装不上,貌似是只能用1.6的版本。官网直接可以下载,jdk-6u34-linux-x64.bin。然后就是解压到指定的路径下面。
sudo cp jdk-6u34-linux-x64.bin /usr/lib/jvm
cd /usr/lib/jvm
sudo chmod +x jdk-6u34-linux-x64.bin
sudo ./jdk-6u34-linux-x64.bin
接下来需要配置环境变量。貌似有好几种做法,我比较了一下,选择修改/etc/environment这个文件。
sudo vim /etc/environment
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/jdk1.6.0_34/bin”
JAVA_HOME=”/usr/lib/jvm/jdk1.6.0_34″
JRE_HOME=”$JAVA_HOME/jre”

CLASSPATH=”.:$JAVA_HOME/lib:$JRE_HOME/lib”

接下来是选择使用的JAVA版本。
sudo update-alternatives –install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_34/bin/java 300
sudo update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_34/bin/javac 300
sudo update-alternatives –config java
sudo update-alternatives –config javac
java -version
这样关于JAVA就配置好啦。
3、R
这个我是参考谢益辉的忍者手册,基本上就是下面几步。
synaptic中添加软件库 deb http://mirrors.ustc.edu.cn/CRAN//bin/linux/ubuntu precise/
gpg –keyserver keyserver.ubuntu.com –recv-key E084DAB9
gpg -a –export E084DAB9 | sudo apt-key add –
sudo apt-get update
sudo apt-get install r-base-dev
配置环境变量。
vim ~/.Renviron
R_LIBS_USER=”~/R-library”
配置启动文件。
vim ~/.Rprofile
options(repos = c(CRAN = “http://mirrors.ustc.edu.cn/CRAN/”,
4、Hadoop
我用的是hadoop-1.0.3这个版本。下载以后,解压到指定的路径,比如我是放在/home/yibo/hadoop下面。
tar -xzf hadoop-1.0.3-bin.tar.gz
然后是配置Hadoop的环境变量,跟之前JAVA环境变量类似。
sudo vim /etc/environment
PATH中添加”:/home/yibo/hadoop/hadoop-1.0.3/bin”,也就是变成”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/jdk1.6.0_34/bin:/home/yibo/hadoop/hadoop-1.0.3/bin”。
然后要配置ssh无密码登录localhost,在这之前需要确认ssh和rsync已经安装。
ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh localhost
接下来是Hadoop的配置,首先是JAVA路径,修改hadoop-1.0.3/conf/hadoop-env.sh文件中的JAVA_HOME=/usr/lib/jvm/jdk1.7.0_06。
然后是修改conf下面的几个xml文件。
1- vim core-site.xml
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/yibo/hadoop/hadoop-1.0.3/datatmp/hadoop-${user.name}</value>
  </property>
</configuration>
2- vim hdfs-site.xml
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
3- vim mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
  </property>
</configuration>
至此一个伪分布式的Hadoop就配置好啦。可以运行一下测试脚本。
查看版本 hadoop version
格式化一个namenode(之后不要轻易格式化,否则namenode的ID变化会比较麻烦)。
rm /home/yibo/hadoop/hadoop-1.0.3/datatmp/hadoop-yibo/dfs/data/current/VERSION
# 就是因为namenode变化导致需要修改或者删除这个VERSION文件
hadoop namenode -format
然后启动各项服务。
start-all.sh
这样就可以在浏览器中查看相应信息啦。
稍等片刻,等datanode启动好,就可以把文件复制到分布式系统。
hadoop fs -put conf input
如果不是初次使用这个namenode,可能会进入保护模式。不过这个保护模式貌似会在30秒后解除。如果需要手动解除的话就是这样:
hadoop dfsadmin -safemode leave
接下来就是运行一个测试的任务,查找dfs叉叉叉。
hadoop jar hadoop-examples-*.jar grep input output ‘dfs[a-z.]+’
查看测试结果。会显示三条记录。
hadoop fs -cat output/*
最后停止服务。
stop-all.sh
5、RHadoop
RHadoop是RevolutionAnalytics的项目,包含三个R包(rmr,rhdfs,rhbase),分别对应了MapReduce,HDFS,HBASE,使得我们能够在R环境中利用Hadoop做分析。目前我还没用到HBASE,所以也暂时还没尝试rhbase这个包。
首先是安装rhdfs依赖的rJava包。这个过程中可能会遇到JAVA参数配置的问题,可以尝试下面这个命令。
sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/jdk1.6.0_34
另外需要配置Hadoop相关的环境变量,照例修改/etc/environment文件,添加两句。
HADOOP_CMD=”/home/yibo/hadoop/hadoop-1.0.3/bin/hadoop”
HADOOP_STREAMING=”/home/yibo/hadoop/hadoop-1.0.3/contrib/streaming/hadoop-streaming-1.0.3.jar”
然后就是依次安装各个R包。
sudo R CMD INSTALL -l /usr/local/lib/R/site-library rhdfs_1.0.5.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library Rcpp_0.9.13.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library RJSONIO_0.98-1.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library iterators_1.0.6.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library itertools_0.1-1.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library digest_0.5.2.tar.gz
sudo R CMD INSTALL -l /usr/local/lib/R/site-library rmr_1.3.1.tar.gz
6、WordCount的例子
最后来用rmr包和rhdfs包做个WordCount的试验,函数主要修改自RHadoop的教程。
首先记得要启动Hadoop。
system(‘start-all.sh’)
加载R包。
require(rmr)
require(rhdfs)
rhdfs包会建议做一个初始化测试。
hdfs.init()
编写wordcount函数。
wordcount <- function (input, output=NULL, split='[[:punct:][:space:]]+’){
  mapreduce(input=input, output=output, 
            map=function(k, v){
              v2=strsplit(x=v, split=split)[[1]]
              v3=v2[v2!=’ ‘]
              lapply(v3, function(w){keyval(w, 1)})
            },
            reduce=function(k, vv){
              keyval(k, sum(unlist(vv)))
            })
}
直接输入文本,转成HDFS文件,计数。
lines <- c(‘this is just a joke,’,
‘and that is just another joke,’,
‘we all like them very much,’,
‘because they are so funny.’)
lines_dfs <- to.dfs(lines)
wc1 <- wordcount(input=lines_dfs)
data.frame(do.call(rbind, from.dfs(wc1)))
       key val
1        a   1
2       is   2
3       so   1
4       we   1
5      all   1
6      and   1
7      are   1
8     joke   2
9     just   2
10    like   1
11    much   1
12    that   1
13    them   1
14    they   1
15    this   1
16    very   1
17   funny   1
18 another   1
19 because   1
也可以直接将本地文件转成HDFS文件,计数。数据文件来自HadoopStreaming包的例子。
hdfs.put(src=’/home/yibo/anna.txt’, dest=’/home/yibo/tmp/anna.txt’)
wc2 <- wordcount(input=’/home/yibo/tmp/anna.txt’)
wc22 <- data.frame(do.call(rbind, from.dfs(wc2)))
wc22[100:120, ]
     key val
100 fond   1
101 from   2
102 girl   1
103 gold   1
104 good   2
105 gown   1
106 hand   4
107 have   1
108 heat   1
109 home   1
110 hour   1
111 huge   1
112 hung   1
113 hurt   1
114 into   3
115 just   1
116 kept   1
117 last   3
118 long   1
119 look   1
120 maid   1
RHadoop教程里面有句话说得不错:
Our main goal was not simply to make it easy to run a mapreduce job but to make mapreduce jobs first class citizens of the R environment and to make it easy to create abstractions based on them.
加油加油,等用得熟练一点我就去尝试真正的分布式。就是这样,打完收工。

from 生活也是大事业: http://chen.yi.bo.blog.163.com/blog/static/1506211092012720111910827/

Written by cwyalpha

八月 21, 2012 在 9:11 上午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: