Hadoop及RHadoop的初步尝试
生活随笔
收集整理的這篇文章主要介紹了
Hadoop及RHadoop的初步尝试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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及RHadoop的初步尝试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPSS因子分析经典案例分享
- 下一篇: 有关javabean的说法不正确的是_关