您的位置:首页 > 运维架构

Hadoop及RHadoop的初步尝试

2015-12-15 10:48 399 查看
http://chen.yi.bo.blog.163.com/blog/static/1506211092012720111910827/

跑步归来写个日记。最近在学习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/",
CRANextra = "http://www.stats.ox.ac.uk/pub/RWin"))

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.6.0_34。

然后是修改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

这样就可以在浏览器中查看相应信息啦。

NameNode - http://localhost:50070/ JobTracker - http://localhost:50030/
稍等片刻,等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 rJava_0.9-3.tar.gz

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')

system('hadoop dfsadmin -safemode leave')

加载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=unlist(strsplit(x=v, split=split))
              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.

加油加油,等用得熟练一点我就去尝试真正的分布式。就是这样,打完收工。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop