安装HADOOP先决条件
SHH安装,并且有公用ssh无密码跳转账号:admin(机器默认会安装SSH)
在namenode和各个slave上用机器名互相ping,ping不通的话,无法进行
JAVA环境安装(JDK1.6即可兼容HADOOP0.20.2版本)
安装路径:/home/admin/deploy/java6
安装HADOOP
安装HADOOP版本为0.20.2
安装路径:/home/admin/deploy/hadoop-0.20.2
首先格式化hdfs:执行hadoop namenode -format命令,如果不执行此命令在每次重启hadoop会进入安全模式
核心配置文件
JAVA与HADOOP环境变量的设置(如果在~/.bash_profile中设置了环境变量,这里可以不进行配置)
export JAVA_HOME=/home/admin/deploy/java6
export HADOOP_HOME=/home/admin/deploy/hadoop-0.20.2
JAVA虚拟机性能调优(省略不用修改的内容)
HADOOP_NAMENODE_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
HADOOP_DATANODE_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
HADOOP_JOBTRACKER_OPTS="-Xmx2048m–Xms1024m -Xmn1024m
补充解释: 这里的XMS与XMX指的是JAVA虚拟机内存分配策略中的最大可用内存和最小内存设置。 不建议将XMS与XMX设置成一样。因为java的垃圾回收器在内存使用达到XMS值的时候才会开始回收,如果2个值一样,那么JAVA会在使用完所有内存时才会回收垃圾,导致内存LOAD一直很高。 关于XMN这个参数是JAVA内存机制中的年轻代。 整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。 持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。这里为了便于计算,取整个堆的一半。 另外:如果JAVA内存设置过大,HADOOP启动会报错 Error occurred during initialization of VM,Could not reserve enough space for object heap
|
core-site.xml:核心代码配置文件,需要修改的参数如下,其余可以先采用默认配置
<property>
<name>fs.default.name</name>
<value>hdfs://xxxxxxxxxx:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/admin/deploy/hdfs</value>
</property>
内容说明: hadoop.tmp.dir: 这是hdfs存放namenode名空间和datanode数据块的地方,可以设置为任意存在的目录,默认在/tmp/Hadoop-username目录下,建议重定向目录 如果遇到namenode启动失败,很可能是这个配置文件的问题。 如果遇到datanode启动失败,一般是没有成功格式化hdfs,实在无法解决的话,可以尝试将{Hadoop.tmp.dir}清空,重新格式化hdfs。 fs.default.name 顾名思义,这个配置是HDFS的NAMENODE的地址与端口号
|
hdfs-site.xml:节点的hdfs配置文件,需要修改的参数如下:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
内容说明: dfs.replication: HDFS的文件块备份。测试环境一般不用备份块,设置为1。 |
mapred-site.xml:mapreduce配置文件,重要参数如下:
<property>
<name>io.sort.mb</name>
<value>200</value>
<description>The total amount of buffer memory to use whilesorting
files, inmegabytes. By default, gives each mergestream 1MB, which
shouldminimize seeks.</description>
</property>
在map排序时buffer的内存大小,如果过小,map会将一部分结果写到磁盘上。 以MB为单位,默认100M 这个选项定义了map输出结果在内存占用buffer的大小,当buffer达到一定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件) 根据map输出数据量的大小,可以适当的调整buffer的大小,但不是越大越好。 假设内存无限大,io.sort.mb=1024(1G), 和io.sort.mb=300 (300M),前者未必比后者快,因为1G的数据排序一次和排序3次,每次300MB。(分治算法) 扩展:分治算法: 分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题; (2)求解,当子问题划分得足够小时,用较简单的方法解决; (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。 |
<property>
<name>mapred.job.tracker</name>
<value> xxxxxxxxxx:9001</value>
</property>
jobtracker的地址 ,指定端口号 |
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>5</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>5</value>
</property>
每个tasktracker上最大map和reduce的数量,如果已经跑满,JobTracker(JT)就不会再分配task到这台TT上。 |
<property>
<name>mapred.system.dir</name>
<value>/mapred/system</value>
<description>The shared directory where MapReduce stores controlfiles.
</description>
</property>
<property>
<name>mapred.temp.dir</name>
<value>/mapred/temp</value>
<description>A shared directory for temporary files.
</description>
</property>
MAP与reduce处理过程中产生的临时文件,2个文件路径需要完全独立,且不能与data存放的路径重合。 |
启动与停止
启动脚本:start-all.sh(返回内容如下):
starting namenode, logging to /home/hadoop/hadoop-0.20.2-cdh3u1/logs/hadoop-admin-namenode-xxxxxxxxxx.out xxxxxxxxxx: starting datanode, logging to /home/admin/deploy/hadoop-0.20.2-cdh3u1/bin/../logs/hadoop-admin-datanode-xxxxxxxxxx.out xxxxxxxxxx: starting secondarynamenode, logging to /home/admin/deploy/hadoop-0.20.2-cdh3u1/bin/../logs/hadoop-admin-secondarynamenode- xxxxxxxxxx.out starting jobtracker, logging to /home/hadoop/hadoop-0.20.2-cdh3u1/logs/hadoop-admin-jobtracker-xxxxxxxxxx.out xxxxxxxxxx: starting tasktracker, logging to /home/admin/deploy/hadoop-0.20.2-cdh3u1/bin/../logs/hadoop-admin-tasktracker-xxxxxxxxxx.out |
停止脚本:stop-all.sh(返回内容如下):
stopping jobtracker xxxxxxxxxx: stopping tasktracker stopping namenode xxxxxxxxxx: stopping datanode xxxxxxxxxx: stopping secondarynamenode |
一些潜规则(权限切换)
在admin账号下使用hadoop,需要更改hadoop上的目录的权限,此时需要在hadoop账号下执行以下两条命令:
hadoopfs -chown -R admin:admin /
hadoop fs -chown -R hadoop:hadoop /user/hadoop/mapred/system