本文共 7885 字,大约阅读时间需要 26 分钟。
Hadoop 安裝測試:nn处于安全模式,执行命令hadoop dfsadmin-safemode leave
有两个方法离开这种安全模式 (1)修改dfs.safemode.threshold.pct为一个比较小的值,缺省是0.999。 (2)hadoopdfsadmin -safemode leave命令强制离开
用户可以通过dfsadmin-safemode $value来操作安全模式,参数$value的说明如下:
enter – 进入安全模式 leave – 强制NameNode离开安全模式 get – 返回安全模式是否开启的信息 wait – 等待,一直到安全模式结束。
1. 測試環境:
機器名 | IP | 作用 |
master | 192.168.25.130 | Namenode、master、jobtracker |
slave1 | 192.168.25.131 | Datanode、slave、tasktracker |
slave2 | 192.168.25.132 | Datanode、slave、tasktracker |
2. 修改三台虛擬幾的/etc/hosts文件
添加如下內容:
3. 在三台虛擬機上分別新建一個名字為hadoop的用戶:
第一步:創建用戶:
第二步:創建該用戶密碼:
第三步:創建hadoop 用戶組:
第四步:分配hadoop到hadoop組中
4. 创建 hadoop 代码目录结构
mkdir-p /opt/modules/hadoop/
创建 hadoop 数据目录结构
mkdir -p /opt/data/hadoop/
修改 目录结构权限为为hadoop
chown -R hadoop:hadoop /opt/modules/hadoop/
chown -R hadoop:hadoop /opt/data/hadoop/
5.分別配置ssh無密碼登錄:(以hadoop登錄)
第一步:開啟ssh服務(一般情況下,在安裝linux系統的時候ssh已經安裝)
第二步:創建密鑰路勁
第三步:生成密鑰:
//這個命令將為master 上的hadoop用戶生成密鑰對,生成的密鑰對id_dsa,id_dsa.pub,默認存儲在/home/hadoop/.ssh下,如下所示:
第四步:把id_rsa.pub(公鑰)追加到授權的key里面
注意點:用root用户登录修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。
检查下面几行前面”#”注释是否取消掉:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes# 启用公钥私钥配对认证方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公钥文件路径
查看下authorized_keys的权限,如果权限不对则利用如下命令设置该文件的权限:chmod 600 authorized_keys
chmod700~/.ssh/
chmod700/home/userName
chmod600~/.ssh/authorized_keys
设置完之后记得重启SSH服务,才能使刚才设置有效。
至此無密碼登錄到本機已經配置好了,可以使用$ssh localhost 命令測試一下,
注意:第一次登錄時需要輸入yes,之後就不用了。
第五步:將id_dsa.pub 文件分別傳送到slave1,slave2這兩台虛擬機的相對應的路勁下//我這裡是直接將master上的authorized_key複製過去
6.在三台虛擬機上分別安裝jdk
第一步:將jdk-6u45-linux-x64.bin copy到/usr/java目錄下
第二步:將bin文件修改成可執行文件。
第三步:運行安裝文件
第四步:vi /etc/profile.d/java.sh 添加如下內容:
第五步:使配置生效
第六步:驗證安裝成功
至此jdk已經安裝成功,可以在slave1和slave2 上執行同樣的操作,也可以使用scp –r 將jdk1.6.0_45 文件拷貝到其他兩台上,注意不要忘了編輯/etc/profile.d/java.sh
7.在三台虛擬機上安裝hadoop
第一步:將hadoop-0.20.2.tar.gz 文件copy 到/opt/modules/hadoop/目錄下
第二步:將文件解壓:
第三步:將文件所有者改成hadoop
第四步:修改/etc/profile.d/java.sh
第五步:更改conf目录下的conf/core-site.xml,conf/hdfs-site.xml,conf/mapred-site.xml,conf/hadoop-env.sh,conf/masters,conf/slaves 文件
配置core-site.xml文件
修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS master(即namenode)的地址和端口号。
添加如下內容:
备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删掉,必须重新执行format才行,否则会出错。
配置hdfs-site.xml文件
修改Hadoop中HDFS的配置,配置的备份方式默认为3。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
(备注:replication 是数据副本数量,默认为3,salve少于3台就会报错)
</property>
<configuration>
配置mapred-site.xml文件
修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.25.130:9001</value>
</property>
</configuration>
配置hadoop-env.sh
该"hadoop-env.sh"文件位于"/usr/hadoop/conf"目录下。
在文件中修改下面内容:
exportJAVA_HOME=/usr/java/jdk1.6.0_45/
配置masters文件
配置slaves文件(Master主机特有)
第六步:將hadoop-0.20.2拷貝到其他兩台虛擬幾上,將相應的地方改一下,就可以了
8.運行hadoop 自帶的例程 wordcount.
第一步:格式化HDFS文件系统
在"Master.Hadoop"上使用普通用户hadoop进行操作。(备注:只需一次,下次启动不再需要格式化,只需start-all.sh)
hadoop namenode -format
第二步:啟動所有的守護進程
如果出現如下的情況
則需要stop相應的進程:
可以用stop-all.sh 用jps驗證hadoop
然後在執行:start-all.sh
第三步:驗證hadoop
(1)验证方法一:用"jps"命令
在Master上用 java自带的小工具jps查看进程。
如果在查看Slave机器中发现"DataNode"和"TaskTracker"没有起来时,先查看一下日志的,如果是"namespaceID"不一致问题,采用"常见问题FAQ6.2"进行解决,如果是"No route to host"问题,采用"常见问题FAQ6.3"进行解决。
(2)验证方式二:用"hadoop dfsadmin -report"
用这个命令可以查看Hadoop集群的状态
在slave1和slave2上執行:jps
第四步:在master 建立兩個輸入文件file01和file02:
第五步;將下面的語句分別加到file01和file02文件里
第六步:在hdfs中建立一個input目錄:
第七步:將file01和file02拷貝到hdfs中
第八步:執行wordcount
第九步:完成之後,查看結果:
在运行完一次例子程序后,需要进去删除到input 和 output
要执行
Hadoop fs–rmr /user/wy/input
Hadoopfs –rmr /user/wy/output
来清除掉上一次例子程序产生的运行目录。
不仅如此还要把各个节点的tmp删除,log删除 就可以了
每天机器上都要配置hadoop_home path
防火墙问题 sudo ufw disable
磁盘问题
安全模式问题 hadoopdfsadmin -safemode leave
Stop-all.sh
網頁查看集群:
(1) 訪問
(2) 訪問
知識補充:
1. Hadoop是Apache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(HadoopDistributed Filesystem)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。
对于Hadoop的集群来讲,可以分成两大类角色:Master和Salve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任 务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。
从上面的介绍可以看出,HDFS和MapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作和存储等支持,MapReduce在HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。
2.1 SSH基本原理和用法
1)SSH基本原理
SSH之所以能够保证安全,原因在于它采用了公钥加密。过程如下:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
2)SSH基本用法
假如用户名为java,登录远程主机名为linux,如下命令即可:
$ sshjava@linux
SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口,例如修改为88端口,命令如下:
$ ssh -p88 java@linux
注意:如果出现错误提示:ssh: Could not resolve hostname linux:Name or service not known,则是因为linux主机未添加进本主机的NameService中,故不能识别,需要在/etc/hosts里添加进该主机及对应的IP即可:
linux 192.168.1.107
5、常见问题FAQ
5.1 关于 Warning: $HADOOP_HOME is deprecated.
hadoop安装完之后敲入hadoop命令时,老是提示这个警告:
Warning:$HADOOP_HOME is deprecated.
经查hadoop-1.1.2/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,其实根本不需要设置HADOOP_HOME环境变量。
解决方案一:编辑"/etc/profile"文件,去掉HADOOP_HOME的变量设定,重新输入hadoop fs命令,警告消失。
解决方案二:编辑"/etc/profile"文件,添加一个环境变量,之后警告消失:
exportHADOOP_HOME_WARN_SUPPRESS=1
5.2 解决"no datanode to stop"问题
当我停止Hadoop时发现如下信息:
nodatanode to stop
原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,有两种解决方案:
第一种解决方案如下:
1)先删除"/usr/hadoop/tmp"
rm -rf/usr/hadoop/tmp
2)创建"/usr/hadoop/tmp"文件夹
mkdir/usr/hadoop/tmp
3)删除"/tmp"下以"hadoop"开头文件
rm -rf/tmp/hadoop*
4)重新格式化hadoop
hadoopnamenode -format
5)启动hadoop
start-all.sh
使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说Hadoop集群已经运行了一段时间。建议采用第二种。
第二种方案如下:
1)修改每个Slave的namespaceID使其与Master的namespaceID一致。
或者
2)修改Master的namespaceID使其与Slave的namespaceID一致。
该"namespaceID"位于"/usr/hadoop/tmp/dfs/name/current/VERSION"文件中,前面蓝色的可能根据实际情况变化,但后面红色一般是不变的。
例如:查看"Master"下的"VERSION"文件
本人建议采用第二种,这样方便快捷,而且还能防止误删。
5.3 Slave服务器中datanode启动后又自动关闭
查看日志发下如下错误。
ERROR org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException: Call to ... failed on local exception:java.net.NoRouteToHostException: No route to host
解决方案是:关闭防火墙
5.4 从本地往hdfs文件系统上传文件
出现如下错误:
INFOhdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink
INFOhdfs.DFSClient: Abandoning block blk_-1300529705803292651_37023
WARNhdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.
解决方案是:
1)关闭防火墙
2)禁用selinux
编辑 "/etc/selinux/config"文件,设置"SELINUX=disabled"
5.5 安全模式导致的错误
出现如下错误:
org.apache.hadoop.dfs.SafeModeException: Cannot delete ..., Name node is insafe mode
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
解决方案是:关闭安全模式
hadoopdfsadmin -safemode leave
5.6 解决Exceeded MAX_FAILED_UNIQUE_FETCHES
出现错误如下:
ShuffleError: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。
解决方案是:修改2个文件。
1)"/etc/security/limits.conf"
vi/etc/security/limits.conf
加上:
softnofile 102400
hardnofile 409600
2)"/etc/pam.d/login"
vim/etc/pam.d/login
添加:
sessionrequired /lib/security/pam_limits.so
针对第一个问题我纠正下答案:
这是reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。通常框架内网络情况较好是不会出现此错误的。
5.7 解决"Too many fetch-failures"
出现这个问题主要是结点间的连通不够全面。
解决方案是:
1)检查"/etc/hosts"
要求本机ip 对应服务器名
要求要包含所有的服务器ip +服务器名
2)检查".ssh/authorized_keys"
要求包含所有服务器(包括其自身)的public key
5.8 处理速度特别的慢
出现map很快,但是reduce很慢,而且反复出现"reduce=0%"。
解决方案如下:
结合解决方案5.7,然后修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"
5.9 解决hadoop OutOfMemoryError问题
出现这种异常,明显是jvm内存不够得原因。
解决方案如下:要修改所有的datanode的jvm内存大小。
Java–Xms 1024m -Xmx 4096m
一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。
转载地址:http://dkhji.baihongyu.com/