Hadoop入门系列(2) -- Hadoop运行环境搭建

来源:互联网 发布:java调用db2存储过程 编辑:程序博客网 时间:2024/06/05 14:42

由于服务器上一般centos的系统安装得比较多,我们环境使用CentOS 6.3 64位操作系统来运行Hadoop。同时,hadoop依赖于java,所以os上要安装好
jdk,一般安装centos时注意下选择openjdk就可以,限于篇幅,这里不讲解centos6.3的安装,上网任意搜索都可以查看到教程。

Hadoop版本选择上,我们选择较新的1.2.1版本。

另外,如果你是从头开始安装整套环境,那么可以在一台上先安装好后,再把整个系统镜像到其他多台机子上,只需要注意mac地址问题、主机ip和主机名即可,其他hadoop程序、hadoop配置在所有机子上都是一样的,不管是master还是slave


安装Hadoop

从apache的官方镜像上下载Hadoop的安装包,http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-1.2.1/ ,这里选择hadoop-1.2.1的版本

下载好的tar.gz的包,在centos上任意解压就行。我们这里把它解压到/usr/目录下

[root@hmaster hadoop]# tar xzvf hadoop-1.2.1.tar.gz -C /usr/[root@hmaster hadoop]# mv /usr/hadoop-1.2.1 /usr/hadoop

解压后,Hadoop的安装就算完了,因为它是基于jar的,所以部署十分方便


配置Hadoop

我们这边为了方便,直接使用root用户,因为如果使用其他用户,那么后面如果没有配置好的话,运行Hadoop应用会提示权限的问题。

修改host

我们首先要定义host,用它来代替ip。修改/etc/hosts文件,如下面的输入

192.168.6.110 hmaster192.168.6.111 hslave1192.168.6.112 hslave2192.168.6.113 hslave3192.168.6.114 hslave4

上面配置中,我们把当前机子192.168.6.110配置为hadoop的集群,其他为slave。同时,对每台机子,设置它的host name和ip,使它与这个hosts文件对应,更改主机名的命令如下:

[root@hmaster hadoop]# vi /etc/sysconfig/network 

把该文件中的HOSTNAME改为/etc/hosts中对应的host名

配置环境变量

我们在/etc/profile中输入如下内容,用来设置hadoop环境变量(如果不使用mahout的话,可以把它的路径去掉)

export JAVA_HOME='/usr/lib/jvm/java-1.6.0-openjdk.x86_64'export MAHOUT_HOME=/usr/mahoutexport CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$MAHOUT_HOME/libexport PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAHOUT_HOME/bin export HADOOP_HOME=/usr/hadoopexport PATH=$PATH:$HADOOP_HOME/binexport HADOOP_HOME_WARN_SUPPRESS=1

配置hadoop中的文件

hadoop中修改配置文件,只要修改几个文件即可,这些文件都在hadoop的安装目录下,如/usr/hadoop/conf下

  • hadoop_env.sh

因为我们在profile中已经配置了一些环境变量,这边可以不配置了

  • 修改core-site.xml文件
<configuration>     <property>        <name>hadoop.tmp.dir</name>        <value>/usr/hadoop/tmp</value>        <description>A base for other temporary directories.</description>    </property>    <!-- file system properties -->     <property>        <name>fs.default.name</name>        <value>hdfs://hmaster:9000</value>     </property></configuration>

这里设置hadoop临时目录,和hdfs的地址

  • 修改hdfs-site.xml文件
<configuration>     <property>        <name>dfs.replication</name>        <value>1</value>    </property> </configuration>

这里设置hdfs文件系统只冗余一份数据

  • 修改mapred-site.xml
<configuration>     <property>        <name>mapred.job.tracker</name>        <value>http://hmaster:9001</value>     </property></configuration>

这里配置mapreduce的jobtracker的地址

  • 修改masters和slaves文件

在masters文件中输入我们master主机的hostname

hmaster

slaves文件中输入所有slave的hostname,内容如下

hslave1hslave2hslave3hslave4

配置ssh免密码登录

这里要实现在master上免密码登录所有的slave,首先在master上使用如下命令生成无密码私钥和公钥

ssh-keygen -t rsa -P ''
  • 方法1:

然后多次调用如下命令把公钥拷到各个slave机子上,在要求输入密码时,输入slave的密码

ssh-copy-id -i ~/.ssh/id_rsa.pub root@hslave1:~/
  • 方法2:

在master机子,接着执行如下命令

cat  ~/.ssh/id_rsa.pub  >>  ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keysecho "RSAAuthentication yes" >> /etc/ssh/sshd_config   echo "PubkeyAuthentication yes " >> /etc/ssh/sshd_config    echo "AuthorizedKeysFile .ssh/authorized_keys " >> /etc/ssh/sshd_config     service sshd restart

接着用scp把id_rsa_pub拷贝到远程slave主机上

scp  ~/.ssh/id_rsa.pub  root@hslave1:~/

拷贝镜像后修改网卡信息

如果你是用拷贝整个系统的方式来部署多台机子,那么要对复制的机子进行一些网卡的修改,否则会存在mac冲突等问题。

启动复制后的机子,打开 /etc/udev/rules.d/70-persistent-net.rules文件

# PCI device 0x8086:0x100f (e1000)SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:c6:77:44", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x100f (e1000)SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:3a:fb:86", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

可以看到,由于物理网卡(或虚拟网卡)mac地址变化,udev会检测出两个eth,删除旧的eth0,把第二个eth1改为eth0,修改后如下

# PCI device 0x8086:0x100f (e1000)SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:3a:fb:86", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

打开 /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0BOOTPROTO=noneHWADDR=00:0c:29:c6:77:44NM_CONTROLLED=yesONBOOT=yesTYPE=EthernetUUID="32ae4a4c-631a-4c39-8e6a-66714c43ca90"IPADDR=192.168.6.110NETMASK=255.255.255.0GATEWAY=192.168.6.254IPV6INIT=noUSERCTL=no

可以看到HWADDR这个mac地址还是原来第一台主机的mac,这里把它改成udev中的mac,并把uuid注册掉,修改ip后,效果如下

DEVICE=eth0BOOTPROTO=noneHWADDR=00:0c:29:3a:fb:86NM_CONTROLLED=yesONBOOT=yesTYPE=Ethernet#UUID="32ae4a4c-631a-4c39-8e6a-66714c43ca90"IPADDR=192.168.6.111NETMASK=255.255.255.0GATEWAY=192.168.6.254IPV6INIT=noUSERCTL=no

这里可以同时修改/etc/sysconfig/network文件中的hostname后,重启机子,这台机子就完全不会跟被拷贝的机子冲突了。


启动验证

验证之前要保证master能够免密码登录所有slave,在master上依次执行如下命令

ssh hmasterssh hslave1ssh hslave2ssh hslave3ssh hslave4

如果ssh某个主机时,提示输入 yes or no, 则输入 yes连接上后,断开再试,看是否不用提示直接就能登录了。

关闭防火墙和selinux

验证之前一定要关闭防火墙和selinux

vim /etc/sysconfig/selinux

把SELINUX=enforcing中的enforcing修改为disabled

setenforce  0service iptables stopchkconfig iptables off

格式化文件系统

在master上输入如下命令

[root@hmaster hadoop]# hadoop namenode -format15/05/27 11:42:00 INFO namenode.NameNode: STARTUP_MSG: /************************************************************STARTUP_MSG: Starting NameNodeSTARTUP_MSG:   host = hmaster/192.168.6.110STARTUP_MSG:   args = [-format]STARTUP_MSG:   version = 1.2.1STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013STARTUP_MSG:   java = 1.6.0_24************************************************************/15/05/27 11:42:00 INFO util.GSet: Computing capacity for map BlocksMap15/05/27 11:42:00 INFO util.GSet: VM type       = 64-bit15/05/27 11:42:00 INFO util.GSet: 2.0% max memory = 93211852815/05/27 11:42:00 INFO util.GSet: capacity      = 2^21 = 2097152 entries15/05/27 11:42:00 INFO util.GSet: recommended=2097152, actual=209715215/05/27 11:42:00 INFO namenode.FSNamesystem: fsOwner=root15/05/27 11:42:00 INFO namenode.FSNamesystem: supergroup=supergroup15/05/27 11:42:00 INFO namenode.FSNamesystem: isPermissionEnabled=true15/05/27 11:42:00 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=10015/05/27 11:42:00 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)15/05/27 11:42:00 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 015/05/27 11:42:00 INFO namenode.NameNode: Caching file names occuring more than 10 times 15/05/27 11:42:00 INFO common.Storage: Image file /usr/hadoop/tmp/dfs/name/current/fsimage of size 110 bytes saved in 0 seconds.15/05/27 11:42:00 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/usr/hadoop/tmp/dfs/name/current/edits15/05/27 11:42:00 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/usr/hadoop/tmp/dfs/name/current/edits15/05/27 11:42:00 INFO common.Storage: Storage directory /usr/hadoop/tmp/dfs/name has been successfully formatted.15/05/27 11:42:00 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************SHUTDOWN_MSG: Shutting down NameNode at hmaster/192.168.6.110************************************************************/

输出如上述所示,则表示文件系统创建成功了。


启动hadoop集群

在master上执行如下命令,启动集群

[root@hmaster hadoop]# start-all.sh starting namenode, logging to /usr/hadoop/libexec/../logs/hadoop-root-namenode-hmaster.outhslave2: starting datanode, logging to /usr/hadoop/libexec/../logs/hadoop-root-datanode-hslave2.outhslave3: starting datanode, logging to /usr/hadoop/libexec/../logs/hadoop-root-datanode-hslave3.outhslave1: starting datanode, logging to /usr/hadoop/libexec/../logs/hadoop-root-datanode-hslave1.outhslave4: starting datanode, logging to /usr/hadoop/libexec/../logs/hadoop-root-datanode-hslave4.outhmaster: starting secondarynamenode, logging to /usr/hadoop/libexec/../logs/hadoop-root-secondarynamenode-hmaster.outstarting jobtracker, logging to /usr/hadoop/libexec/../logs/hadoop-root-jobtracker-hmaster.outhslave1: starting tasktracker, logging to /usr/hadoop/libexec/../logs/hadoop-root-tasktracker-hslave1.outhslave2: starting tasktracker, logging to /usr/hadoop/libexec/../logs/hadoop-root-tasktracker-hslave2.outhslave4: starting tasktracker, logging to /usr/hadoop/libexec/../logs/hadoop-root-tasktracker-hslave4.outhslave3: starting tasktracker, logging to /usr/hadoop/libexec/../logs/hadoop-root-tasktracker-hslave3.out

使用jps命令在各个机子上查看java应用是否启动

[root@hmaster hadoop]# jps2421 SecondaryNameNode2238 NameNode2651 Jps2514 JobTracker

在slave上查看,应用如下

[root@hslave1 usr]# jps2202 DataNode2301 TaskTracker2401 Jps

通过网页查看集群状态,在浏览器中输入 http://192.168.6.110:50030,其中6.110是master的ip。点击网页中的Node节点数,可以看到所有Node的情况
这里写图片描述


hadoop常用命令

文件系统

这类命令以fs开头,主要是对hdfs的相关操作,主要有

  • 显示文件
hadoop fs -ls
  • 上传文件:

    把linux文件系统中的input目录上传到hdfs文件系统中

    hadoop fs -put input
  • 删除文件
hadoop fs -rm input
  • 移动文件
hadoop fs -mv input input1

运行MR应用

在要运行的jar包的目录中运行

hadoop jar aaa.jar

hadoop常用告警处理

启动startall时,jps查看部分设备未启动节点

清除旧的数据,重新格式化dfs文件系统

rm -rf /usr/hadoop/tmpmkdir /usr/hadoop/tmprm -rf /tmp/hadoop*hadoop namenode -format

safemode错误

如果出现如下错误

org.apache.hadoop.dfs.SafeModeException: Cannot delete..., Name node is in safe mode

那么可以使用如下命令禁用安全模式::

hadoop dfsadmin -safemode leave
0 0