说明:
-
本文描述的是基于Windows+虚拟机+CentOS的Hadoop+HBase的开发环境搭建过程,使用的Hadoop版本是CDH5(Cloudera Distribution including Apache Hadoop,CDH),旨在说明HADOOP的伪分布式环境搭建关键步骤。CDH5与Hadoop的关系,Hadoop、Hbase、Zookeeper之间的关系,及文中涉及的一些工具、命令的使用等与本文有关系不是特别密切的东西都没有详细说明,想了解更多请:http://www.google.com
-
本文旨在学习Hadoop,而且所有操作基本都是在虚拟机中进行,所以方便起见所有操作直接用root用户。
基础环境
操作系统
CDH5的环境要求可以参见:CDH 5 Requirements and Supported Versions 虚拟机可以用VMWare或VirtualBox,详细安装过程请自行Google ,本文所用的环境为Win8+VMWare+CentOS6.4 +CDH5:
虚拟机安装CentOS6.4方便起见推荐使用安装minimal版,小巧玲珑百度网盘下载
- minimal版的CentOS网络默认没有打开
用以下命令打开:ifconfig eth0 up
dhclient eth0
可以修改/etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT=no 改成ONBOOT=yes开机打开网络,如果要设置静态IP可以参考以下内容进行做修改
DEVICE=eth0 BOOTPROTO=static ONBOOT=yes HWADDR=00:0C:29:30:35:C5 TYPE=Ethernet NAME="System etho0" UUID=fdaced38-14e2-4b7e-905e-01eebc698573 NM_CONTROLLED=yes BROADCAST=192.168.242.255 IPADDR=192.168.242.129 NETMASK=255.255.255.0 GATEWAY=192.168.242.2 IPV6INIT=no DNS1=192.168.242.2
-
为方便之后的操作,可能还需要以下操作,这一步不是必须的
yum update
先更新一下会自动选最快的源
常用软件安装yum install vim wget
下面这些你可能会能也会用到yum install lsof make ntp tcpdump time zip unzip git
yum groupinstall "Development Tools"
-
为方便与宿主机共享文件,可以安装VMwareTools,这一步也不是必须的
在虚拟机启动前先设置好共享目录然后
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom tar -zxvf VMwareTools-xxxxx.tar.gz -C /tmp cd /tmp/vmware-tools-distrib ./vmware-install.pl #安装 一路回车选默认值直接到**Would you like to enable VMware automatic kernel modules? [no]**这个地可能需要yes
安装完成后重启,在/mnt/hgfs/就是可以看到共享的宿主机的目录
不行的话可以尝试手工挂载
mount -t vmhgfs .host:/ /mnt/hgfs/ 编辑 /etc/fstab,添加下面一行 .host:/ /mnt/hgfs vmhgfs defaults 0 0
注意:
- /etc/sysconfig/network中HOSTNAME的值初始值是安装的时候提供的主机名,而在/etc/hosts中又没有提供相应的映射,Hadoop各组件之件默认会用HOSTNAE+端口号进行通信,所以默认情况下会出错,并且我们需要的是宿主机中进行开发测试,也就是需要外部访问此伪分布式集群,所以你需要在/etc/hosts文件中加入一条映射:
1 |
192.168.242.129 centos.migle |
以上需要按实际情况做修改192.168.242.129是文中虚拟机地址, centos.migle是文中虚拟机HOSTNAME,下文中不再特别说明,如有出现请按自已实际对应做修改
估计不用虚拟机IP和HOSTNAME做映射也是可以,用一个新名字映射虚拟机IP也是可以的!!
- CentOS默认iptables是开的,可以这样查看状态
service iptables status
而本文描述的是在虚拟机中安装的Hadoop,会在宿主机中通过WEB UI或客户端的形式访问虚拟机中的Hadoop所以为方便起见把Iptables给关了:service stop iptables
可以直接设成开机不启动chkconfig iptables off
免得麻烦
软件环境
-
JDK安装
先检查是否已经安装java -version
环境变量是否已经设置echo $JAVA_HOME
如果没安装继续看下面,如果都没问题进入
下一步- 下载 :http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
-
安装:rpm -i jdk-7u55-linux-x64.rpm
-
环境变量设置:/etc/profile 添加以下内容:
1 2 3 |
export JAVA_HOME=/usr/java/jdk1.7.0_55 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin |
>> *重新登录或 `source /etc/profile` 生效*
伪分布式运行应该是不需要SSH Server的,安装主要是为方便在宿主机中用XShell连接虚拟机,不过好处是CentOS自带,不用额外安装
Hadoop
安装
- 设置软件源
1 2 3 |
wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm sudo yum --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm sudo rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera |
- 安装:
sudo yum install hadoop-conf-pseudo
- 检查安装:
rpm -ql hadoop-conf-pseudo
hadoop version
配置
CDH5把Hadoop的配置文件都是在/etc/hadoop/conf下面放着伪分布部署时会有一个名为conf.pseudo的符号链接如果你需要在宿主机中访问,默认配置不用改变
CDH5的Hadoop部署只需要修改core-site.xml一个文件的一个位置,如果你不需要在虚拟机外部分访问,可以不用修改
- 修改:core-site.xml
1 2 3 4 5 |
<property> <name>fs.defaultFS</name> <!--把localhost修改成VM的IP,本文中修改为:192.168.242.129,如果配置成VM的HOSTNAME,在VM上操作没问题,但宿主机用JAVA API操作的时候会报报错!!--> <value>hdfs://localhost:8020</value> </property> |
-
格式化HDFS:
sudo -u hdfs hdfs namenode -format
可以看看: /etc/hadoop/conf.pseudo/hdfs-site.xml
namenode的data分别保存在:
/var/lib/hadoop-hdfs/cache/hdfs/dfs/name
/var/lib/hadoop-hdfs/cache/hdfs/dfs/data -
启动服务: for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done
下次开机会自动启动
-
宿主机浏览器里打开:http://centos.migle:50070/ 如果看到类似以下界面,说明问题成功了一小步!..
-
创建相关目录
1 2 3 4 5 |
sudo -u hdfs hadoop fs -mkdir -p /tmp/hadoop-yarn/staging/history/done_intermediate sudo -u hdfs hadoop fs -chown -R mapred:mapred /tmp/hadoop-yarn/staging sudo -u hdfs hadoop fs -chmod -R 1777 /tmp sudo -u hdfs hadoop fs -mkdir -p /var/log/hadoop-yarn sudo -u hdfs hadoop fs -chown yarn:mapred /var/log/hadoop-yarn |
查看结果: hadoop fs -ls -R /
也可以在WEB界面中查看
安装的时候会自动创建hadoop,hdfs,yarn,mapred等用户
hadoop fs
会改给出HDFS的命令的帮助,和相应的Linux名字和相应功能都很像,参数也比较简单
- 启动YARN服务
1 2 3 |
sudo service hadoop-yarn-resourcemanager start sudo service hadoop-yarn-nodemanager start sudo service hadoop-mapreduce-historyserver start |
下次开机会自动启动
jps
后会有类似如下的输出:
1 2 3 4 5 6 |
13988 SecondaryNameNode 14627 ResourceManager 15051 JobHistoryServer 14705 NodeManager 13878 NameNode 13785 DataNode |
如有以上输出,说明配置基本完成,进行下一步测试
开发测试
本地MR任务测试
为管理方便给root用户在HDFS上创建个目录,并赋权
1 2 |
sudo -u hdfs hadoop fs -mkdir -p /user/root sudo -u hdfs hadoop fs -chown root /user/root |
在/etc/profile 中添加个环境变量
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
export CLASSPATH=$CLASSPATH:$HADOOP_MAPRED_HOME
hadoop的JAR都在HADOOP_MAPRED_HOME目录下,但不知道这个环境变量是用来干什么的
创建一个test.txt的文件加上几行内容
1 2 3 |
echo "hello" >> test.txt echo "hadoop" >> test.txt echo "hi,hadoop" >> test.txt |
上传到hdfs中:hadoop fs -put -f test.txt /user/root/
查看文件:hadoop fs -ls -R /user/root/
查看文件内容 hadoop fs -cat /user/root/test.txt
如下图:
运行一个自带MR例子,
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount test.txt output
hadoop-mapreduce-examples.jar源码在Hadoop的源码包里有
结果会在output目录下生成output是相对路径,绝对
/user/root/output
查看结果:
hadoop fs -ls -R output
hadoop fs -cat /user/root/output/part-r-00000
远程HDFS JAVA API
代码见:https://github.com/longforfreedom/StudyHadoop
HBASE
安装:
1 2 3 4 |
sudo yum install zookeeper-server sudo yum install hbase-master sudo yum install hbase sudo yum install hbase-regionserver |
可选:sudo yum install hbase-thrift
##thrift接口需要sudo yum install hbase-rest
##rest接口
查看:
rpm -ql hbase
配置
- 创建相关目录
zookeeper的dataDir
1 2 |
mkdir -p /var/lib/zookeeper chown -R zookeeper /var/lib/zookeeper/ |
hbase目录ms会自动创建
sudo -u hdfs hadoop fs -mkdir /hbase
sudo -u hdfs hadoop fs -chown hbase /hbase
-
配置:
两个配置文件 /etc/hadoop/conf/hdfs-site.xml和/etc/hbase/conf/hbase-site.xml-
/etc/hadoop/conf/hdfs-site.xml中添加
dfs.datanode.max.xcievers
4096单机小测试不改这个应该不会出错!!
修改hdfs-site.xml需要重启Hadoop -
/etc/hbase/conf/hbase-site.xml 添加以下:
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <!--按实际情况修改--> <value>hdfs://centos.migle:8020/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>centos.migle</value> </property> |
-
启动:
- 启动Zookeeper
sudo service zookeeper-server init
#第一次启动时执行以后再不需要sudo service zookeeper-server start
测试zookeeper:
zookeeper-client -server localhost:2181
- 启动Hbase
sudo service hbase-master start
sudo service hbase-regionserver start
- 启动Zookeeper
下次开机会自动启动
宿主机中的访问:http://centos.migle:60010/
开发测试
HBASE SHELL 基本操作
hbase shell
进入HBASE SHELL,提示符会变成类似:hbase(main):002:0>以下命令都在HBASE SHELL执行.
- 查看状态 :
status
- 查看版本:
version
- 创建表:
create 'mtable','cf'
指定表名和列族,多个列族用“,”分隔如:create 'mtable','cf','cf2'
- 插入数据:
put '表名','rowKey','列名','列值'
put 'mtable','rowKey1','cf:acc_nbr','18797384480'
put 'mtable','rowKey1','cf:name','migle'
列可以动态创建: 列格式是:列族:列名 - 查看数据:
单行:get 'mtable' , 'rowKey1'
get 'mtable','rowKey1','cf:acc_nbr'
get 'mtable','rowKey1','cf'
所有:scan 'mtable'
- 行数:
count 'mtable'
- 更新数据:
put 'mtable','1','cf:acc_nbr','18797384481'
- 删除数据:
delete 'mtable','1','cf:name'
- 清空表:
truncate 'mtable'
- 查看表结构:
describe 'mtable'
- 修改表结构:
- 添加一个列族:
1 2 3 |
disable 'mtable' alter 'mtable', NAME => 'cf2' enable 'mtable' |
2. 删除列族:
1 2 3 |
disable 'mtable' alter 'mtable', 'delete' => 'cf2' enable 'mtable' |
- 删除表:
1 2 |
disable 'mtable' drop 'mtable' |
JAVA API远程测试
代码见:https://github.com/longforfreedom/StudyHadoop
Python
@TODO
安装 thrift
thrift依赖
sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel zlib-devel python-devel ruby—-devel
/usr/lib/hbase/include/thrift
http://blog.csdn.net/guxch/article/details/12163047
其它:
- 在虚拟机中不要把HOSTNAME映射成127.0.0.1否则宿主机中JAVA API不能访问HBASE!!
- 可以pom.xml中加入cloudera的仓库,但直接用Apache版本的好像也没问题
1 2 3 4 5 6 |
<repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> </repositories> |