最近公司战略调整,终于可以轻松点研究hadoop相关技术。了解hadoop,首先需要搭建hadoop运行环境。
由于资源有限,于是就在单机windows和vmware虚拟机下进行伪分布式实战操作。闲话少说,分享下我的环境搭建过程吧,希望对大家有所帮助。
主要分为如下几部分:
一、环境版本要求和准备
二、Fedora13服务器hadoop安装过程
三、Fedora13服务器Hbase配置安装过程
四、Windows下eclipse配置hadoop插件
五、Eclipse运行WordCount项目
一、环境版本要求和准备:
1. 为避免hadoop版本不匹配造成的ipc协议错误,windows7下的hadoop版本尽量和fedora下的hadoop版本保持一致,调试环境为hadoop-1.2下载地址为:
http://apache.dataguru.cn/hadoop/common/hadoop-1.2.1/
2. Windows7中的eclipse版本为:Helios Service Release 2
3. 客户端操作系统:win7 ,vmware虚拟操作系统为: Fedora-13-i386
备注:fedora-10默认是没有安装telnet-server*.rpm的,安装完Fedora后需要安装telnet-server驱动。
A.检查系统telnet-server的rpm包是否安装:#rpm –q telnet-server 如果返回结果为空,进行B、C、D操作步骤:
B.安装telnet-server,命令如下:#rpm -ivh telnet-server-0.17-47.el6_3.1.i686.rpm
C. 配置文件/etc/xinetd.d/telnet,将"disable = yes"改为 "disable = no"。如果需要修改最大连接数为3,那就需要在里面加入 instance = 3。如下:
# vi /etc/xinetd.d/telnet
service telnet
{flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = yes <----- 修改成no
}
D.启动服务:# /etc/rc.d/init.d/xinetd restart
或者:#service xinetd restart
E.开放防火墙端口:# vi /etc/sysconfig/iptables,添加如下端口:
以上端口开放,可以从windows下的web或者eclipse来访问hadoop相关服务。以下红色部分必须放开,否则eclipse调试报错
HDFS端口:
参数 | 描述 | 默认 | 配置文件 | 例子值 |
fs.default.name | namenode RPC交互端口 | 8020 | core-site.xml | hdfs://0.0.0.0:8020/ |
dfs.http.address | NameNode web管理端口 | 50070 | hdfs-site.xml | 0.0.0.0:50070 |
dfs.datanode.address | datanode 控制端口 | 50010 | hdfs-site.xml | 0.0.0.0:50010 |
dfs.datanode.ipc.address | datanode的RPC服务器地址和端口 | 50020 | hdfs-site.xml | 0.0.0.0:50020 |
dfs.datanode.http.address | datanode的HTTP服务器和端口 | 50075 | hdfs-site.xml | 0.0.0.0:50075 |
MR端口:
参数 | 描述 | 默认 | 配置文件 | 例子值 |
mapred.job.tracker | job tracker交互端口 | 8021 | mapred-site.xml | hdfs://0.0.0.0:8021/ |
mapred.job.tracker.http.address | job tracker的web管理端口 | 50030 | mapred-site.xml | 0.0.0.0:50030 |
mapred.task.tracker.http.address | task tracker的HTTP端口 | 50060 | mapred-site.xml | 0.0.0.0:50060 |
F.重启防火墙iptables服务:#service iptables restart
在windows端验证以上端口是否可以telnet通过。
二、Fedora服务器hadoop安装过程:
1. 配置ssh本地登录证书
注:单机伪分布模式运行情况下,Hadoop不会使用SSH进行通信,可以省略如下步骤:
[root@localhost hadoop-1.2.1]# which ssh
/usr/bin/ssh
[root@localhost hadoop-1.2.1]# which ssh-keygen
/usr/bin/ssh-keygen
[root@localhost hadoop-1.2.1]# which sshd
/usr/sbin/sshd
[root@localhost hadoop-1.2.1]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/home/hadoop/hadoop-1.2.1/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in
/home/hadoop/hadoop-1.2.1/.ssh/id_rsa.
Your public key has been saved in
/home/hadoop/hadoop-1.2.1/.ssh/id_rsa.pub.
The key fingerprint is:
51:67:a7:2d:58:09:60:eb:3e:f8:18:bf:8c:56:96:a0 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| o.o.+.. |
| . o =.+ |
| o . o . |
| .. . . |
| . .S. |
| E o+ |
| ooo |
| .B . |
| .o =. |
+-----------------+
最终将在/home/hadoop/.ssh/路径下生成私钥id_rsa和公钥id_rsa.pub
id_rsa.pub
[root@localhost hadoop-1.2.1]#
cd /home/hadoop/hadoop-1.2.1/.ssh
[root@localhost .ssh]#ls –l
total 8
-rw-------. 1 root root 1675 Nov 25 20:58 id_rsa
-rw-r--r--. 1 root root 408 Nov 25 20:58 id_rsa.pub
修改sshd服务配置文件:
[root@localhost .ssh]# vi /etc/ssh/sshd_config
修改如下内容:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
保存并退出,然后重启sshd服务
[root@localhost .ssh]# service sshd restart
将ssh证书公钥拷贝至/home/hadoop/hadoop-1.2.1/.ssh/authorized_keys文件中
[root@localhost .ssh]# ls
id_rsa id_rsa.pub
[root@localhost .ssh]# cat id_rsa.pub >> authorized_keys
非root用户需要修改~/.ssh/authorized_keys文件的权限为644,~/.ssh文件夹的权限为700,/home/hadoop文件夹的权限为700(权限正确是成功认证的先决条件)
[root@localhost .ssh]# chmod 644 authorized_keys
[root@localhost .ssh]# ssh 192.168.11.129
The authenticity of host '192.168.11.129 (192.168.11.129)' can't be established.
RSA key fingerprint is
9c:7a:90:bf:ab:7a:22:fb:5c:7b:2c:7c:06:eb:a6:ee.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added '192.168.11.129' (RSA) to the list of known hosts.
root@192.168.11.129's password:
Last login: Sun Nov 23 19:10:12 2014 from 192.168.11.1
2.在安装hadoop应用服务前,需要安装JDK运行环境
[root@localhost ~]# java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode, sharing)
如果没有安装需要到http://java.com/zh_CN/download/help/linux_install.xml下载安装包jre-7u71-linux-i586.tar.gz
Java文件将安装在当前目录jre1.7.0_07目录中,解压缩 tarball 并安装 Java
tar zxvf jre-7u7-linux-i586.tar.gz
rpm –ivh jre-7u7-linux-i586.rpm
设置java环境变量(若为开发者使用,建议将所有用户的shell都有权使用这些环境变量)
·用文本编辑器打开/etc/profile·在profile文件末尾加入:
export JAVA_HOME=/usr/java/jre1.8.0_25
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
备注:
a. 你要将/usr/java/jre1.8.0_25 改为你的jre安装目录
b. linux下用冒号“:”来分隔路径
c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值。在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种常见的错误。
d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。
e. export是把这三个变量导出为全局变量。
f. 大小写必须严格区分。
使环境变量的更改马上起作用:source /etc/profile
检查环境变量更改是否生效: java -version
3.安装hadoop
在Hadoop官网下载hadoop-1.2.1.tar.gz并上传至服务器/home/hadoop路径下
1. [root@localhost ~]$ tar -xzf hadoop-1.2.1.tar.gz
2. [root@localhost ~]$ rm -rf hadoop-1.2.1.tar.gz
3. [root@localhost ~]$ cd hadoop-1.2.1/conf/
4. [root@localhost conf]$ vi hadoop-env.sh
将JAVA_HOME指向第二步安装的JDK所在目录
1. # The java implementation to use. Required.
2. export JAVA_HOME=/usr/java/jre1.8.0_25
保存并退出
[root@localhost ~]$ vi ~/.bash_profile
4.修改hadoop配置文件
伪分布式使用IP地址而不是主机名或localhost的好处是不需要修改/etc/hosts,当然全分布式还是需要修改的。
修改core-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.11.129:8020</value>
</property>
</configuration>
修改mapred-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.11.129:8021</value>
</property>
</configuration>
修改hdfs-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/dfsname</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/dfsdata</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>permissions is false</description>
</property>
</configuration>
通过以上步骤hadoop即安装配置完成,进入hadoop-1.21.1主目录的bin目录下
#./hadoop namenode -format //格式化hadoopnamenode,很多时候namenode启动不起来可以试试格式化一下。
#./start-all.sh //启动hadoop的各个监护进程。
可以通过http://localhost:50070 和http://localhost:50030 查看namenode和jobtracker。
#./stop-all.sh //关闭hadoop的各个监护进程
三、Fedora服务器Hbase配置安装过程:
我用的版本是Hbase-0.94.23,下载网http://apache.etoak.com//hbase/hbase-0.94.23/ 将Hbase-0.94.233解压到系统主目录下,伪分布式的配置如下:
(1)编辑{HBASE_HOME}/conf/hbase-env.sh文件,设置JAVA_HOME和HBASE_CLASSPATH变量
export JAVA_HOME=/usr/java/jre1.8.0_25 (自己的JAVA_HOME主目录)
export HBASE_CLASSPATH=/home/hbase/hadoop-0.94.23/conf (自己的HADOOP_HOME主目录)
(2)编辑{HBASE_HOME}/conf/hbase-site.xml文件,增加以下内容
<property> <name>hbase.rootdir</name> <value>hdfs://192.168.11.129:8020/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> |
注:以上表格中标红色的路径一定要跟hadoop中core-site.xml中fs.default.name中的路径相同,否则会出错。
(3)替换Hbase中的jar包
需要用{HADOOP_HOME}下的hadoop-1.21.1-core.jar替换掉{HBASE_HOME}/lib目录下的hadoop-core-0.20-append-r1056497.jar。
如果不替换jar文件Hbase启动时会因为hadoop和Hbase的客户端协议不一致而导致HMaster启动异常。报错如下:
localhost: Exception in thread "main" org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol version mismatch. (client = 42, server = 41),所以如果遇到以上错误,就通过替换jar包解决。
完成以上操作,就可以正常启动Hbase了。
启动顺序:先启动Hadoop——>再启动Hbase
关闭顺序:先关闭Hbase——>再关闭Hadoop
启动Hbase的命令,进入到hbase安装主目录的bin目录下
# ./start-hbase.sh //启动hbase
# ./hbase shell //进入shell模式
# ./stop-all.sh //停止hbase
如果在操作Hbase的过程中发生错误,可以通过hbase安装主目录下的logs子目录查看错误原因。
注意:
(1)hbase的运行需要用到zookeeper,而hbase-0.94.23自带了zookeeper,所以可以使用hbase自带的zookeeper,在conf/hbase-env.sh文件中 export HBASE_MANAGES_ZK=true
true表示使用hbase自带的zookeeper,如果不想使用其自带的zookeeper,自己下载包安装的化,该项设置为false。
当然如果自己安装zookeeper,启动及关闭先后顺序为:启动Hadoop—>启动ZooKeeper集群—>启动HBase—>停止HBase—>停止ZooKeeper集群—>停止Hadoop
(2) hbase启动时报错:localhost: Exception in thread "main" org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol version mismatch. (client = 42, server = 41) ,
原因就是上面hbase安装第三步中提到的没有替换jar包的原因。
四、Windows下eclipse配置hadoop插件:
1.复制hadoop-eclipse-plugin-1.2.1.jar到 eclipse安装目录/plugins/下。
说明:hadoop源文件中不提供相关插件,需要本地编译打包
2.重启eclipse,配置hadoop installation directory。
如果安装插件成功,打开Window-->Preferens,你会发现Hadoop Map/Reduce选项,在这个选项里你需要配置Hadoop installation directory,配置完成后退出。
3.配置Map/Reduce Locations
在Window-->Show View中打开Map/Reduce Locations。
在Map/Reduce Locations中新建一个Hadoop Location。在这个View中,右键-->New Hadoop Location。
在弹出的对话框中你需要配置Location name,如Hadoop,还有Map/Reduce Master和DFS Master。
这里面的Host、Port分别为你在mapred-site.xml、core-site.xml中配置的地址及端口。如:
配置完后退出。
点击DFS Locations-->Hadoop,如果能显示文件夹(2)说明配置正确;如果显示"拒绝连接",请检查你的配置。
五、Eclipse运行WordCount项目:
1.新建WordCount项目
File-->New-->Other-->Map/Reduce Project
项目名可以随便取,如WordCount。
复制 hadoop安装目录/src/example/org/apache/hadoop/example/WordCount.java到刚才新建的项目下面。
2.上传模拟数据文件夹
为了运行程序,我们需要一个输入的文件夹,和输出的文件夹。
A)在本地新建word.txt
mapreduce java hadoop hbase
java cdd python c
java cmmd javascript
helloworld hadoop
B)通过hadoop的命令在HDFS上创建/tmp/workcount目录,命令如下:bin/hadoop fs -mkdir /tmp/wordcount
C)通过copyFromLocal命令把本地的word.txt复制到HDFS上,命令如下:
bin/hadoop fs -copyFromLocal /home/grid/word.txt /tmp/wordcount/word.txt
3.运行Wordcount项目
A)在新建的项目Hadoop,点击WordCount.java,右键-->Run As-->Run Configurations
B)在弹出的Run Configurations对话框中,点Java Application,右键-->New,这时会新建一个application名为WordCount
C)配置运行参数,点Arguments,在Program arguments中输入“你要传给程序的输入文件夹和你要求程序将计算结果保存的文件夹”,如:
hdfs://192.168.11.129:8020/tmp/wordcount/word.txt hdfs://192.168.11.129:8020/tmp/wordcount/out
如果运行时报java.lang.OutOfMemoryError: Java heap space配置VM arguments(在Program arguments下)
-Xms512m -Xmx1024m -XX:MaxPermSize=256m |
4.点击Run,运行程序
点击Run,运行程序,过段时间将运行完成,等运行结束后,查看运行结果,使用命令: bin/hadoop fs -ls /tmp/wordcount/out查看例子的输出结果。
发现有两个文件夹和一个文件,使用命令查看part-r-00000文件:
bin/hadoop fs -cat /tmp/wordcount/out/part-r-00000可以查看运行结果。
如果这一步有问题,请看最后的“注意事项(2)”。
注意事项:
(1)eclipse可能会报无法连接的错:"Map/Reduce location status updater". org/codehaus/jackson/map/JsonMappingException
经过查询,是由于hadoop的eclipse插件里面缺少了一些包,按照这篇文章的说明修改包后,重新运行成功。
(2)可能会报错:
12/04/24 15:32:44 ERROR security.UserGroupInformation: PriviledgedActionException as:Administrator cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:682)
这是由于Windows下文件权限问题,在Linux下可以正常运行,不存在这样的问题。
参考:http://blog.csdn.net/keda8997110/article/details/8533633
解决方法是修改src\core\org\apache\hadoop\fs\RawLocalFileSystem.java,注释掉 checkReturnValue(有些粗暴,在Window下,可以不用检查)
1 2 3 4 5 6 7 | private void checkReturnValue(boolean rv, Path p, FsPermission permission) throws IOException { /*if (!rv) { throw new IOException("Failed to set permissions of path: " + p + " to " + String.format("%04o", permission.toShort())); }*/ } |
然后重新编译、打包 hadoop-core-1.21.21.0.jar,再次运行即可成功。关于这个重新编译hadoop的方法我上面的压缩包里也有教程文档。
目前为止还没有完全用到hbase,但后续可以利用该环境研究hadoop+hbase。