CDH 是Cloudera 完全开源的Hadoop 分布式系统架构,为了满足企业的需求而特别构建的系统。即一个开源的企业级分布式存储系统。全称:Cloudera Hadoop。
它是在Apache Hadoop基础上打入了很多patch。使之性能更好,更加满足生产环境。
CDH4.1.2使用的是apache 的hadoop 2.0版本,与之前的稳定的hadoop-1.x相比,Apache Hadoop 2.x有较为显著的变化。
Hadoop介绍
Hadoop是apache 的开源项目,开发的主要目的是为了构建可靠、可拓展、稳定的分布式的系统,hadoop 是一系列的子工程的总和,其中包含:
1. hadoop common:为其他项目提供基础设施
2. HDFS:分布式的文件存储系统
3. MapReduce:A software framework for distributed processing of large data setson compute clusters,一个简化分布式编程的框架。
4. 其他工程包含:Avro(序列化系 统),Cassandra(数据库项目)等。
Hadoop以 Hadoop 分布式文件系统HDFS (Hadoop Distributed File System)和MapReduce(Google MapReduce的开源实现)为核心,Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于 Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个 HDFS 集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的 DataNode 管理存储的数据。MapReduce框架是由一个单独运行在主节点上的 JobTracker和运行在每个集群从节点上的TaskTracker共同组成的。主节点(NameNode)节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上,主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点(DataNode)仅负责由主节点指派的任务,当一个 Job 被提交 时,JobTracker 接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS 和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce 在HDFS 的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop 分布式集群的主要任务。
集群环境
选择四台物理PC机,构建集群Hadoop环境。操作系统均为CentOS6.2或以上,集群中包括 4个节点: 1个Master,3个Salve节点,节点之间局域网连接,可以相互ping通。
Master机器主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行;3个Salve机器配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。
机器 |
主机名 |
HDFS |
MapReduce |
YARN(Mapreduce2.0) |
192.168.75.210 |
Master |
NameNode |
JobTracker |
ResourcesManager |
192.168.75.211 |
Slave01 |
DataNode |
TaskTracker |
NodeManager |
192.168.75.212 |
Slave02 |
DataNode |
TaskTracker |
NodeManager |
192.168.75.213 |
Slave03 |
DataNode |
TaskTracker |
NodeManager |
详细配置:
1、修改主机名
按照上述表里的设置,将四台机器分别设置相应主机名。例如Master机器。
# hostname Master
# vim/etc/sysconfig/network
HOSTNAME=Master
重启机器。
四台机器都要设置,设置完后,重启机器。
2、修改 hosts 文件
#vim /etc/hosts
在文件里面添加如下配置:
192.168.75.210 Master
192.168.75.211 Slave01
192.168.75.212 Slave02
192.168.75.213 Slave03
并用scp命令复制到其他所有机器,即四台机器做相同配置。
3、配置SSH无密码登陆
SSH无密码原理简介:
首先在Master上生成一个密钥对,包括一个公钥和一个私钥,并将公钥复制到所有的slave上。
然后当 master 通过SSH 连接slave时,slave就会生成一个随机数并用master的公钥对随机数进行加密,并发送给master。最后master收到加密数之后再用私钥解密,并将解密数回传给slave,slave确认解密数无误之后就允许master不输入密码就可以进行连接。
3.1 配置Master无密码登录所有Slave
具体操作过程如下:
(1)Master机器上生成密码对
#ssh-keygen -t rsa –P ’’
这条命是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa 和 id_rsa.pub,默认存储在“/root/.ssh”目录下。
(2)接着在 Master 节点上做如下配置,把 id_rsa.pub 追加到授权的 key 里面去。
#cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
(3)修改authorized_keys权限
权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用 RSA 功能。
# chmod600 ~/.ssh/authorized_keys
(4)修改SSH配置文件
#vim /etc/ssh/sshd_config
将下面三行注释去掉,并修改如下:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)
设置完后,重启SSH服务
# servicesshd restart
(5)验证是否成功
#ssh Master
接下来的事儿是把公钥复制所有的 Slave机器上。使用下面的命令格式进行复制公钥:
#scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器 IP:~/
例如:scp ~/.ssh/id_rsa.pub [email protected]:~/
以Slave01机器为例:
1)将Master上的id_rsa.pub复制到Slave01机器上root目录下。
登录到Slave01机器上。
2)在root目录下建立.ssh文件夹
这一步并不是必须的。如果已经存在.ssh目录,就不需要创建。
# mkdir~/.ssh
然后是修改文件夹“.ssh”的用户权限,把他的权限修改为“700”,用下面命令执行
# chmod700 ~/.ssh
3)追加到授权文件“authorized_keys”
#cat ~/id_rsa.pub >>~/.ssh/authorized_keys
4)修改权限
#chmod 600 ~/.ssh/authorized_keys
5)修改Slave01上的SSH配置文件
#vim /etc/ssh/sshd_config
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)
并重启SSH服务。
6)验证Master到Slave01的无密码登录
回到Master机器:
#ssh Slave01
看是否能成功进行无密码登录
7)删除id_rsa.pub文件
记得将Master复制过来的id_rsa.pub删除掉。
以同样的操作:步骤1)——7)对Slave2和Slave3做同样的操作。
3.2 配置所有Slave无密码登录Master
和 Master 无密码登录所有 Slave 原理一样,就是把 Slave 的公钥追加到 Master 的“.ssh” 文件夹下的“authorized_keys”中。
以Slave01为例:
1)首先创建Slave01自己的公钥和私钥,并把自己的公钥追加到自己的authorized_keys文件中。用到的命令如下:
#ssh-keygen -t rsa -P ’’
# cat~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
2)接着是用命令“scp”复制“Slave01”的公钥“id_rsa.pub”到“Master” 的“/root”目录下,并追加到“Master”的“authorized_keys”中。
#scp ~/.ssh/id_rsa.pub [email protected]:~/
#cat ~/id_rsa.pub >>~/.ssh/authorized_keys
3)然后删除掉刚才复制过来的“id_rsa.pub”文件。
#rm ~/id_rsa.pub
4)验证从Slave01无密码登录到Master
#ssh Master
将Slave02和Slave03也做同样的操作。
4、安装Java
1)拷贝文件
在Master机器上/usr/目录下新建一个java目录
#make /usr/java
将下载好的linux x86_64的jdk的安装文件jdk-6u31-linux-x64.bin拷贝到/usr/java目录下。
2)添加权限
#cd /usr/java
添加执行权限
#chmod +x jdk-6u31-linux-x64.bin
3)安装
#./ jdk-6u31-linux-x64.bin
4)安装完成后,配置环境变量
#vim /etc/profile
在末尾添加java的环境变量名
#set Java path
export JAVA_HOME=/usr/java/jdk1.6.0_31
exportCLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
exportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
5)保存退出后,使配置文件生效
# source/etc/profile
6)验证
执行 java -version 查看是否安装成功
[root@Master ~]# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build20.6-b01, mixed mode)
所有机器上做同样的操作。
可以将Master上安装好的java目录复制到其他Slave机器上,并配置环境变量即可。
5、安装配置CDH4.1.2
5.1 安装
到Cloudera官网上下载好CDH4.1.2源码包,此处采用源码包安装,为了方便后面的拷贝。安装目录清楚,安装操作方便。
源码包名称:hadoop-2.0.0-cdh4.1.2.tar.gz
在/usr/目录下新建一个cdh4目录,主要用于存放CDH4.1.2的安装软件,例如后面的Hbase,hive等。
#mkdir /usr/cdh4
将CDH4.1.2源码包拷贝到该目录下,并解压
# tar–zxvf hadoop-2.0.0-cdh4.1.2.tar.gz
将解压后的目录修改为hadoop-2.0,便于操作,不然名称很长。
# mv hadoop-2.0.0-cdh4.1.2 hadoop-2.0
5.2 配置
下面开始配置CDH4.1.2
进入到Hadoop-2.0的配置文件目录
# cdhadoop-2.0/etc/hadoop/
(1)配置Hadoop java环境变量
在配置hadoop-env.sh内添加java环境变量
# vim hadoop-env.sh
在末尾添加如下内容:
#set java path
export JAVA_HOME=/usr/java/jdk1.6.0_31
(2)编辑 core-site.xml
添加如下内容:
在根目录下,新建hadoop目录,在hadoop目录内建立tmp文件夹。作为hadoop临时数据存放目录。
(3)配置hdfs-site.xml
在/hadoop/内建立元数据存储目录name,HDFS存储目录data。
(4)配置mapred-site.xml
因为采用的是Mapreduce2.0版本。所有使用YARN。见下面第一个配置参数。
在/hadoop目录内建立mapred文件夹,并在里面建立local和system目录。
(5)配置yarn-site.xml
(6)配置slaves
#vim slaves
添加Slave节点的IP。
192.168.75.211
192.168.75.212
192.168.75.213
(7)配置Hadoop环境变量
vim/etc/profile
添加如下内容:
#set Hadoop path
export HADOOP_HOME=/usr/cdh4/hadoop-2.0
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
exportHADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
exportHDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
exportYARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop
至此Hadoop配置完成。
5.3 集群配置
将配置好的Hadoop-2.0文件夹复制到其三台Slave节点上。路径要一致。并创建相应的存储目录。
将环境变量文件/etc/profile也复制到其他节点上。
chown -R 1106:592 *
service iptables stop
chkconfig iptables off
6、格式化集群
以上配置都部署好后,就开始运行Hadoop环境。首先格式化HDFS集群文件系统。
到Master节点上执行如下命令:
#hadoop namenode -format-clusterid clustername
会打印相应的信息。看到successfully formatted 表示格式化成功。
7、开启Hadoop服务
启动hdfs
#start-dfs.sh
启动yarn
#start-yarn.sh
这里可以直接执行
#start-all.sh
它包括了start-dfs.sh和start-yarn.sh
启动过程如下:
要是停止的话,执行stop-all.sh
8、检验
到Master节点上执行jps命令:
必须有如上三个进程。
到Slave节点上执行jps命令:
必须有如上2个进程。
以上2个图表示HDFS的NameNode和DataNode进程以及Mapreduce的resourceManager和NodeManager进程都已经正确启动完成。
也可以通过web来查看
查看HDFS。
http://192.168.75.210:50070
可以看到如下结果:
查看Mapreduce
http://192.168.75.210:8088
下面运行一个简单的wordcount例子:
在Master上做如下操作:(此处是把Master也当做client)
在根目录下新建一个test目录。里面创建两个测试文件。test1和test2.每个文件里包含了很多hello world和hello hadoop。
例如:
在HDFS里新建一个input目录
将这两个test文件上传到input目录。
开始运行Mapreduce进行计算。
# cd /usr/hadoop-cdh4/hadoop-2.0/share/hadoop/mapreduce/
#hadoopjar hadoop-mapreduce-examples-2.0.0-cdh4.1.1.jar wordcount input output
输出如下:
表示成功。
到web里也能看到
到HDFS里查看结果
可以看到统计结果。
至此一个Hadoop集群环境搭建完成。