Hadoop学习<一>--hadoop安装和环境变量设置,hadoop--hadoop


Hadoop核心项目:HDFS(Hadoop Distributed File System分布式文件系统),MapReduce(并行计算框架)
HDFS架构的主从结构:主节点,只有一个namenode,负责接收用户操作请求,维护文件系统的目录结构,管理文件与block之间关系,block与datanode之间的关系。
从节点,有很多个datanodes,负责存储文件,文件被分成block存储在磁盘上(方便管理,便于多节点读取),为保证数据安全,文件会有很多副本。
MapReduce的主从结构:主节点,只有一个JobTracker ,负责接收客户提交的计算任务,把计算任务分给TaskTracker执行,并监控TaskTracker的执行情况。
从节点,有很多个TaskTracker,负责执行JobTracker分配的计算任务,好比项目经理(JobTracker)和程序员(TaskTracker)的关系。

修改主机名:修改当前会话中的主机名:hostname zebra
修改配置文件中的主机名:vi /etc/sysconfig/network 改成zebra
把hostname和ip绑定:执行命令vi /etc/hosts,增加一行内容,如下

       192.168.1.120 zebra(当前用户名和ip)保持退出

值得指出的是,在Ubuntu这样Linux发行版中,并非都存在/etc/hostname文件。如Fedora发行版将主机名存放在/etc/sysconfig/network文件中。所以,修改主机名时应注意区分是哪种Linux发行版。

验证:ping zebra
关闭防火墙:执行命令 service iptables stop
验证:service iptables status
关闭防火墙的自动运行:执行命令,chkconfig iptables off
验证:chkconfig --list | grep iptables

JDK的安装:将文件拷贝到linux系统中,cp /media/jdk-1.6.bin /home/zebra
cd /home/zebra
对文件授予执行权限,chmod u+x jdk1.6.bin
执行解压缩,#./jdk1.6.bin
配置jdk环境变量:vi /etc/profile
添加两行内容,export JAVA_HOME=/home/zebra/jdk1.6
       export PATH=.:$JAVA_HOME/bin:$PATH  (后面的这个$PATH要加上,不然系统的一些配置可能就没有了)
保存退出,执行#source /etc/profile,生效配置
验证:javac -version


详细位置搜索ubuntu系统jdk安装的默认路径。

或者按照如下方法,手动查找(机器不同可能结果也不一样,但思路都是一样的):
which javac
返回/usr/bin/javac
file /usr/bin/javac
返回/usr/bin/javac: symbolic link to `/etc/alternatives/javac'
然后file /etc/alternatives/javac
返回/etc/alternatives/javac: symbolic link to `/usr/lib/jvm/java-6-sun/bin/javac'
然后file /usr/lib/jvm/java-6-sun/bin/javac
返回/usr/lib/jvm/java-6-sun/bin/javac: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
到此为止,说明路径是/usr/lib/jvm/java-6-sun/bin/,在Eclipse里面设置即可。

安装hadoop
执行命令,#tar -zxvf hadoop.1.0.tar.gz 进行解压缩
执行命令#mv hadoop.1.0 hadoop 重命名
执行命令#vi .etc/profile 设置环境变量
export HADOOP_HOME=/home/zebra/hadoop
修改文件,export PATH=.:$HADOOP_HOME/bin:$JAVA_HOME/bin:$PATH
保存退出
执行命令 source /etc/profile ,让配置文件生效
修改hadoop的配置文件,位于$HADOOP_HOME/conf目录下
    修改四个配置文件,分别是hadoop-env.sh,core-site.xml,hdfa-site.xml,mapred-site.xml.
    第一个是hadoop环境变量脚本文件hadoop-env.sh,修改第九行代码为#export JAVA_HOME=/home/zebra/jdk
    保存退出,这里设置的是JAVA_HOME,注意去掉前面的#符
    第二个是hadoop核心配置文件core-site.xml,结果如下:
<configuration>
     <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/zebra/hadoop/tmp</value>
    <description>hadoop 的运行临时文件的主目录</description>
     </property>
    <property>
    <name>fs.default.name</name>
    <value>hdfs://zebra:9000</value>
    <description>要修改为自己的HDFS 的访问路径</description>
    </property>
</configuration>
   第三个是hdfs配置文件hdfs-site.xml文件,结果如下
<configuration>
  <property>
     <name>dfs.replication</name>
     <value>1</value>
     <description>存储副本数</description>
  </property>
</configuration>
第四个是MapReduce配置文件mapred-site.xml,结果如下:
<configuration>
    <property>
    <name>mapred.job.tracker</name>
    <value>zebra:9001</value>
    <description>修改成自己的JobTracker 的访问路径</description>
    </property>
</configuration>
以上就是安装伪分布的最小化配置,接下来就是格式化文件系统。
hdfs是文件系统,所以在第一次使用之前需要进行格式化。执行命令(在#HADOOP_HOME/bin路径下)hadoop namenode –format。注意:只有第一次启动的时候格式化。如果真的有必要再次格式化,请先把“$HADOOP_HOME/tmp”目录下的文件全部删除。
格式化完成后,开始启动hadoop程序。
启动 hadoop 的命令脚本都在$HADOOP_HOME/bin/下,下面的所有命令都不再带有完整路径名称。
这里讲述 hadoop 启动的三种方式:
第一种,一次性全部启动:
执行 start-all.sh 启动 hadoop,观察控制台的输出,可以看到正在启动进程,分别是 namenode、datanode、secondarynamenode、jobtracker、tasktracker,一共 5 个,待执行完毕后,并不意味着这 5 个进程成功启动,上面仅仅表示系统正在启动进程而已。
我们使用 jdk 的命令 jps 查看进程是否已经正确启动。执行以下 jps,如果看到了这 5 个进程,说明 hadoop 真的启动成功了。如果缺少一个或者多个,那就得寻找原因了。
关闭 hadoop 的命令是 stop-all.sh。
上面的命令是最简单的,可以一次性把所有节点都启动、关闭。除此之外,还有其他命令,是分别启动的。
第二种,分别启动 HDFS 和 MapReduce:执行命令 start-dfs.sh,是单独启动 hdfs。执行完该命令后,通过 jps 能够看到 NameNode、DataNode、SecondaryNameNode 三个进程启动了,该命令适合于只执行 hdfs存储不使用 MapReduce 做计算的场景。关闭的命令就是 stop-dfs.sh 了。
执行命令 start-mapred.sh,可以单独启动 MapReduce 的两个进程。关闭的命令就是stop-mapred.sh 了。当然,也可以先启动 MapReduce,再启动 HDFS。这说明,HDFS 和 MapReduce的进程之间是互相独立的,没有依赖关系。
第三种,分别启动各个进程:
[root@zebra bin]# jps
14821 Jps
[root@zebra bin]# hadoop-daemon.sh start namenode
[root@zebra bin]# hadoop-daemon.sh start datanode
[root@zebra bin]# hadoop-daemon.sh start secondarynamenode
[root@zebra bin]# hadoop-daemon.sh start jobtracker
[root@zebra bin]# hadoop-daemon.sh start tasktracker
[root@zebra bin]# jps
14855 NameNode
14946 DataNode
15043 SecondaryNameNode
15196 TaskTracker
15115 JobTracker
15303 Jps执行的命令是“hadoop-daemon.sh start [进程名称]”,这种启动方式适合于单独增加、删除节点的情况,在安装集群环境的时候会看到。这也是我们的验证方法,通过jps查看启动个数。
我们也可以通过浏览器url:主机名:50070查看NameNode节点,可以发现他也是webserver服务,50030则是Map/Reduce的处理节点。

解决这个警告:Warning: $HADOOP_HOME is deprecated.
在/etc/profile中添加$HADOOP_HOME_WARN_SUPPRESS=1,这行记录即可

Hadoop 的常见启动错误:
当使用 hadoop 发现有问题时,首先使用 jps 命令查看启动的节点是否正确,然后再去查看日志文件。
1.设置主机名错误
看日志,会发现下面的错误
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode:
Invalid hostname for server: master
java.net.UnknownHostException:这是由于主机名设置错误造成的,请检查配置文件中关于主机名的设置,是否正确。
首先使用 hostname 命令查看主机名是否正确;
然后使用 more /etc/sysconfig/network 命令查看主机名是否记录在文件中;
最后使用 more /etc/hosts 命令查看 ip 与主机名的映射是否设置
2.ip 设置错误
看日志,发现下面的错误
ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.net.BindException:
Problembinding to zebra/192.168.1.100:9000 : Cannot assign requested address
这是由于 ip 地址设置错误引起的,请检查主机的 ip 设置与配置文件的 ip 设置是否一致。
使用 more /etc/hosts 命令查看 ip 与主机名的映射是否设置。
hostname 不能带有下划线,不能数字开头
hostname 含有下划线,也会造成启动失败。
启动完成后,一定使用 jps 命令查看 5 个节点是否全部成功启动。如果哪个节点没有启动,请查看对应的 log 日志。日志的默认目录是$HADOOP_HOME/logs。

文件命名是有规律的,“hadoop-[当前用户名]-[节点名称]-[主机名].log”我们只查看 log
结尾的文件。如果是 namenode 节点没有启动,查看 hadoop-root-namenode-zebra.log 文件。
3.多次执行 hadoop 格式化
现象:在 Hadoop-root-datanode-master.log 中有如下错误:
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException:
Incompatible namespaceIDs in
原因: 每次 namenode format 会重新创建一个 namenodeId,而 dfs.data.dir 参数配置的目录中包含的是上次 format 创建的 id,和 dfs.name.dir 参数配置的目录中的 id 不一致。
namenode format 清空了 namenode 下的数据,但是没有清空 datanode 下的数据,导致启动时失败,所要做的就是每次 fotmat 前,清空 dfs.data.dir 参数配置的目录。
重新格式化 hdfs的命令。
4.防火墙没有关闭
从本地往 hdfs 文件系统上传文件,出现异常,这个问题最有可能就是防火墙没有关闭,导致节点 DataNode 与节点 NameNode 通信失败。
可以使用 service iptables status 命令关闭防火墙。
这样关闭后,重启操作系统时,防火墙有可能重启,可以关闭自动重启功能。使用chkconfig iptables off 关闭。
5.安全模式导致的错误
错误提示如下:
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is in safe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个 DataNode 上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
如果着急的话,可以执行 hadoop dfsadmin –safemode leave 命令关闭安全模式。

相关内容