Hadoop
Hadoop是一个由apache基金会所开发的分布系统基础架构。
Hadoop实现一个分布式文件系统Hadoop Distributed file System 简称HDFS
核心设计HDFS(提供文件操作和数据存储)和MapReduce(实现任务的分发、跟踪、执行、收集结果)
对于hadoop的集群来讲,可分成2类:master和salve,是由一个NameNode和若干个DataNode组成。
NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataDode管理存储的数据。
MapReduce框架是由一个单独运行在主节点的JobTracker和运行在每个集群从节点的TaskTracker共同组成。主节点负责调度构成一个作业的所有任务,这些任务分布在不通的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个job被提交时,JobTracker接到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行
目前发行的稳定版本共2个
http://archive.apache.org/dist/hadoop/core/hadoop-1.2.1/hadoop-1.2.1.tar.gz
http://archive.apache.org/dist/hadoop/core/hadoop-2.7.2/hadoop-2.7.2.tar.gz
首先为hadoop-1.2.1版本
确保在你集群中的每个节点上都安装了所有必须软件:sun-JDK ssh Hadoop gcc,必须安装,建议选择sun公司发行的java版本
ssh必须安装并且保证sshd一直运行,以便用hadoop脚本管理远端hadoop守护进程
实验环境
操作平台:hyper-v
操作系统:2.6.32-220.el6.x86_64 (centos6.2)
软件版本:hadoop-1.2.1 jdk-6u45-linux-x64
集群架构:包括4个节点:1个master,3个salve,节点之间局域网连接,可以互相ping通
主机名 IP 系统版本 Hadoop node hadoop进程名
Master 172.20.38.100 centos6.2 Master namenode,jobtracker
Slave1 172.20.38.101 centos 6.2 Slave datanode,tasktracker
Slave2 172.20.38.102 centos 6.2 Slave datanode,tasktracker
Slave3 172.20.38.103 centos 6.2 Slave datanode,tasktracker
安装步骤
下载:jdk-6u45-linux-x64 hadoop-1.2.1.tar.gz
配置网络和主机名及用户
配置主机名,以master为例,slave1 slave2slave3,改完后重启生效
[hadoop@master hadoop-1.1.2]$ cat/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=master
在master上配置hosts解析,slave上相同配置
172.20.38.100 master
172.20.38.101 slave1
172.20.38.102 slave2
172.20.38.103 slave3
在所有服务器上建立相同的用户hadoop,将主目录做为安装目录:/home/hadoop/
Jdk安装(root安装,其他slave机器也必须都安装)
[root@master soft]# /bin/bash jdk-6u45-linux-x64.bin
[root@master soft]# mv jdk1.6.0_45/ /usr/local/jdk6
添加java环境变量
[root@master soft]# vim /etc/profile
在文件最后面加上如下内容
export PATH=/usr/local/jdk6/bin:/usr/local/jdk6/jre/lib:/usr/local/jdk6/jdk/lib:$PATH
使环境变量生效:
[root@master soft]# source /etc/profile
将java环境复制到slave上,并是配置生效
[root@master ~]# scp -r /usr/local/jdk6 root@172.20.38.101:/usr/local/
[root@master ~]# scp -r/etc/profile root@172.20.38.101:/etc/profile
验证java
[root@master ~]# java-version
java version"1.6.0_45"
Java(TM) SE RuntimeEnvironment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-BitServer VM (build 20.45-b01, mixed mode)
[root@master ~]# javac-version
javac 1.6.0_45
Ssh配置
在hadoop启动以后,namenode是通过ssh来启动和停止各个datanode上的各种守护进程,这就必须要在节点之间执行指令的时候是不需要输入密码的形式,故需要配置ssh运用无密码弓腰认证的形式。
本例中,master是主节点,须要连接slave1、slave2、slave3.
在master主机生成密钥对(全部默认,回车)
[root@localhost hadoop]# su hadoop
[hadoop@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key(/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in/home/hadoop/.ssh/id_rsa.
Your public key has been saved in/home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
66:af:37:80:3a:ba:28:8b:5a:ff:33:ab:39:77:c4:afhadoop@localhost
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| |
| oS |
| .o+. |
| . . . o. |
|oo .+.+ ..+ |
|B.oo+*o=Eo . |
+-----------------+
[hadoop@localhost ~]$ cat ~/.ssh/id_rsa.pub
ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAu4mpWdP8ylXdM9KuWtzf0avxXt+2xnegHlCZaZdV+DNgtGSvpCU5pFKzjR9qvRH8epAf1usc2+KfMo6w5LpDK9wQ+dRhGoHTW0x1KN66KI6VniVV/kZqsy12K0nmBW1SMnNhBXudH9e4adkhLwkSFKpFsxYtrO7TvsuxbgeuwGk7hTXEQfPk0Zs6ZmlQILlL1BYP2sHl9BM/MD5KN2ERCq2YcyRVCCOxeQcP/HIqFWZOF4vLLts5TOJlGWdmPFRHwCRcFsOSCdXajJRHfYura1M9tWd3up/xI68710RouUoGuYikWHB3+Znw2hcYK2RI3SxdNaC4t/lt9JJ/0InJEw==hadoop@localhost
将master公钥添加到远程slave主机上
[hadoop@localhost ~]$ cp ~/.ssh/id_rsa.pub~/.ssh/authorized_keys
[hadoop@localhost ~]$ chmod 600 ~/.ssh/authorized_keys
[hadoop@localhost ~]$ scp -r ~/.ssh hadoop@172.20.38.101:/home/hadoop/
注:authorized_keys权限设置为600,否则会出问题
测试登陆
[hadoop@localhost ~]$ ssh slave3
The authenticity of host 'slave3 (172.20.38.103)'can't be established.
RSA key fingerprint is9a:31:73:88:08:85:ae:26:56:5f:4c:9f:16:36:b4:a6.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added 'slave3,172.20.38.103'(RSA) to the list of known hosts.
安装hadoop-1.2.1
[hadoop@master soft]$ tar-zxvf hadoop-1.2.1.tar.gz
[hadoop@master soft]$ mvhadoop-1.2.1 /home/hadoop/hadoop-1.2.1
添加环境变量,root用户添加
[root@master ~]# echo 'exportPATH=/home/hadoop/hadoop-1.2.1/bin:$PATH' >> /etc/profile
[root@master ~]# source/etc/profile
集群配置,在所有节点上配置相同(配置完成后scp同步)
配置conf/hadoop-env.sh文件
[hadoop@master ~]$ cd /home/hadoop/hadoop-1.2.1/conf
[hadoop@master conf]$echo 'exportJAVA_HOME=/usr/local/jdk6/' >> hadoop-env.sh
配置文件: core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<!-- Put site-specific property overrides in thisfile. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>fs.checkpoint.period</name>
<value>60</value>
</property>
</configuration>
注释:fs.default.name是NameNode的URI。 hdfs://主机名:端口
hadoop.tmp.dir是hadoop的默认临时路径,最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。需要重新执行NameNode格式化命令
fs.checkpoint.period:snn 检查nn日期的时间周期,文档为66秒,生产环境建议12小时
配置文件: mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<!-- Put site-specific property overrides in thisfile. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
</configuration>
注释:mapredjob.tracker是jobtracker的主机(或ip)和端口。主机:端口
配置文件:hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1, /home/hadoop/name2</value>
<description></description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data1,/home/hadoop/data2</value>
<description></description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
注释:dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。当这个值是一个逗号分隔的目录列表时,nametable数据将会被复制到所有目录中做冗余备份
dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分隔的列表。当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不通设备上
dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。
注意:此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建会有问题
配置文件masters和slaves主从节点,注意最好使用主机名,并且保证机器之间通过主机名可以访问
[hadoop@localhost conf]$ cat masters
master
[hadoop@localhost conf]$ cat slaves
slave1
slave2
slave3
配置结束,把配置好的hadoop文件拷贝到其他集群的机器中,并且保证上面的配置对于其他机器正确,如果其他机器的java安装路径不一样,需要修改conf/hadoop-env.sh
scp -r /home/hadoop/hadoop-1.2.1 slave1:/home/hadoop/
root用户把环境变量同步到slave并使之生效
scp -r /etc/profile root@172.20.38.101:/etc/profile
source /etc/profile
hadoop启动
[hadoop@master conf]$ cd/home/hadoop/hadoop-1.2.1/bin/
[hadoop@master bin]$./start-all.sh
检测
Master
Slave
查看集群状态统计信息
访问master是否正常http://172.20.38.100:50070
常用命令
hadoop dfs -ls #列出HDFS下文件
hadoop dfs -ls in #列出HDFS下某个文档中的文件
hadoop dfs -put test.txt test #上传文件到指定目录并且重新命名,只有所有的DataNode都接收完数据才算成功
hadoop dfs -get in getin #从HDFS获取文件并且重新命名为getin,同put一样可操作文件也可操作目录
hadoop dfs -rmr out #删除HDFS上的out目录
hadoop dfs -cat in/* #查看HDFS上in目录的内容
hadoop dfsadmin -safemode leave #退出安全模式
hadoop dfsadmin -safemode enter #进入安全模式
添加一个新的节点
在新加的节点上安装hadoop
修改hadoop/conf/master文件,加入NmaeNode主机名
在NameNode节点上修改Hadoop/conf/slaves文件,加入新加节点主机名
建立到新加节点无密码的ssh连接
运行启动命令 start-all.sh
主要配置文件配置项整理
Core-site.xml
name | value | description |
fs.default.name | hdfs://hadoopmaster:9000 | 定义hadoopmaster的uri和端口 |
fs.checkpoint.dir | /opt/data/hadoop1/hdfs/namesecondary1 | 定义hadoop的name备份的路径,官方文档说是读取这个,写入dfs.name.dir |
fs.checkpoint.period | 1800 | 定义name备份的备份间隔时间,秒为单位,只对snn生效,默认一小时 |
fs.checkpoint.size | 33554432 | 以日志大小间隔做备份间隔,只对snn生效,默认64m |
io.compression.codecs | org.apache.hadoop.io.compress.defaultcodec, | hadoop所使用的编解码器,gzip和bzip2为自带,lzo需安装hadoopgpl或者kevinweil,逗号分隔,snappy也需要单独安装 |
io.compression.codec.lzo.class | com.hadoop.compression.lzo.lzocodec | lzo所使用的压缩编码器 |
topology.script.file.name | /hadoop/bin/rackaware.py | 机架感知脚本位置 |
topology.script.number.args | 1000 | 机架感知脚本管理的主机数,ip地址 |
fs.trash.interval | 10800 | hdfs垃圾箱设置,可以恢复误删除,分钟数,0为禁用,添加该项无需重启hadoop |
hadoop.http.filter.initializers | org.apache.hadoop.security. | 需要jobtracker,tasktracker |
hadoop.http.authentication.type | simple | kerberos | #authentication_handler_classname# | 验证方式,默认为简单,也可自己定义class,需配置所有节点 |
hadoop.http.authentication. | 36000 | 验证令牌的有效时间,需配置所有节点 |
hadoop.http.authentication. | 默认可不写参数 | 默认不写在hadoop启动时自动生成私密签名,需配置所有节点 |
hadoop.http.authentication.cookie.domain | domian.tld | http验证所使用的cookie的域名,ip地址访问则该项无效,必须给 此文来自: 马开东博客 转载请注明出处网址: http://www.makaidong.com 所有节点都配置域名才可以。 |
hadoop.http.authentication. | true | false | 简单验证专用,默认允许匿名访问,true |
hadoop.http.authentication. | http/localhost@$localhost | kerberos验证专用,参加认证的实体机必须使用http作为k的name |
hadoop.http.authentication. | /home/xianglei/hadoop.keytab | kerberos验证专用,密钥文件存放位置 |
hadoop.security.authorization | true|false | hadoop服务层级验证安全验证,需配合hadoop-policy.xml使用,配置好以后用dfsadmin,mradmin -refreshserviceacl刷新生效 |
io.file.buffer.size | 131072 | 用作序列化文件处理时读写buffer的大小 |
hadoop.security.authentication | simple | kerberos | hadoop本身的权限验证,非http访问,simple或者kerberos |
hadoop.logfile.size | 1000000000 | 设置日志文件大小,超过则滚动新日志 |
hadoop.logfile.count | 20 | 最大日志数 |
io.bytes.per.checksum | 1024 | 每校验码所校验的字节数,不要大于io.file.buffer.size |
io.skip.checksum.errors | true | false | 处理序列化文件时跳过校验码错误,不抛异常。默认false |
io.serializations | org.apache.hadoop.io. (排版需要。实际配置不要回车) | 序列化的编解码器 |
io.seqfile.compress.blocksize | 1024000 | 块压缩的序列化文件的最小块大小,字节 |
webinterface.private.actions | true | false | 设为true,则jt和nn的tracker网页会出现杀任务删文件等操作连接,默认是false |
Mapred-site.xml
name | value | Description |
hadoop.job.history.location | job历史文件保存路径,无可配置参数,也不用写在配置文件里,默认在logs的history文件夹下。 | |
hadoop.job.history.user.location | 用户历史文件存放位置 | |
io.sort.factor | 30 | 这里处理流合并时的文件排序数,我理解为排序时打开的文件数 |
io.sort.mb | 600 | 排序所使用的内存数量,单位兆,默认1,我记得是不能超过HADOOP_HEAPSIZE设置,否则会OOM |
mapred.job.tracker | hadoopmaster:9001 | 连接jobtrack服务器的配置项,默认不写是local,map数1,reduce数1 |
mapred.job.tracker.http.address | 0.0.0.0:50030 | jobtracker的tracker页面服务监听地址 |
mapred.job.tracker.handler.count | 15 | jobtracker服务的线程数 |
mapred.task.tracker.report.address | 127.0.0.1:0 | tasktracker监听的服务器,无需配置,且官方不建议自行修改 |
mapred.local.dir | /data1/hdfs/mapred/local, | mapred做本地计算所使用的文件夹,可以配置多块硬盘,逗号分隔 |
mapred.system.dir | /data1/hdfs/mapred/system, | mapred存放控制文件所使用的文件夹,可配置多块硬盘,逗号分隔。 |
mapred.temp.dir | /data1/hdfs/mapred/temp, | mapred共享的临时文件夹路径,解释同上。 |
mapred.local.dir.minspacestart | 1073741824 | 本地运算文件夹剩余空间低于该值则不在本地做计算。字节配置,默认0 |
mapred.local.dir.minspacekill | 1073741824 | 本地计算文件夹剩余空间低于该值则不再申请新的任务,字节数,默认0 |
mapred.tasktracker.expiry.interval | 60000 | TT在这个时间内没有发送心跳,则认为TT已经挂了。单位毫秒 |
mapred.map.tasks | 2 | 默认每个job所使用的map数,意思是假设设置dfs块大小为64M,需要排序一个60M的文件,也会开启2个map线程,当jobtracker设置为本地是不起作用。 |
mapred.reduce.tasks | 1 | 解释同上 |
mapred.jobtracker.restart.recover | true | false | 重启时开启任务恢复,默认false |
mapred.jobtracker.taskScheduler | org.apache.hadoop.mapred. | 重要的东西,开启任务管理器,不设置的话,hadoop默认是FIFO调度器,其他可以使用公平和计算能力调度器 |
mapred.reduce.parallel.copies | 10 | reduce在shuffle阶段使用的并行复制数,默认5 |
mapred.child.java.opts | -Xmx2048m | 每个TT子进程所使用的虚拟机内存大小 |
tasktracker.http.threads | 50 | TT用来跟踪task任务的http server的线程数 |
mapred.task.tracker.http.address | 0.0.0.0:50060 | TT默认监听的httpIP和端口,默认可以不写。端口写0则随机使用。 |
mapred.output.compress | true | false | 任务结果采用压缩输出,默认false,建议false |
mapred.output.compression.codec | org.apache.hadoop.io. | 输出结果所使用的编解码器,也可以用gz或者bzip2或者lzo或者snappy等 |
mapred.compress.map.output | true | false | map输出结果在进行网络交换前是否以压缩格式输出,默认false,建议true,可以减小带宽占用,代价是会慢一些。 |
mapred.map.output.compression.codec | com.hadoop.compression. | map阶段压缩输出所使用的编解码器 |
map.sort.class | org.apache.hadoop.util. | map输出排序所使用的算法,默认快排。 |
mapred.hosts | conf/mhost.allow | 允许连接JT的TT服务器列表,空值全部允许 |
mapred.hosts.exclude | conf/mhost.deny | 禁止连接JT的TT列表,节点摘除是很有作用。 |
mapred.queue.names | ETL,rush,default | 配合调度器使用的队列名列表,逗号分隔 |
mapred.tasktracker.map. | 12 | 每服务器允许启动的最大map槽位数。 |
mapred.tasktracker.reduce. | 6 | 每服务器允许启动的最大reduce槽位数 |
Hdfs-site.xml
name | value | Description |
dfs.default.chunk.view.size | 32768 | namenode的http访问页面中针对每个文件的内容显示大小,通常无需设置。 |
dfs.datanode.du.reserved | 1073741824 | 每块磁盘所保留的空间大小,需要设置一些,主要是给非hdfs文件使用,默认是不保留,0字节 |
dfs.name.dir | /opt/data1/hdfs/name, | NN所使用的元数据保存,一般建议在nfs上保留一份,作为1.0的HA方案使用,也可以在一台服务器的多块硬盘上使用 |
dfs.web.ugi | nobody,nobody | NN,JT等所使用的web tracker页面服务器所使用的用户和组 |
dfs.permissions | true | false | dfs权限是否打开,我一般设置false,通过开发工具培训别人界面操作避免误操作,设置为true有时候会遇到数据因为权限访问不了。 |
dfs.permissions.supergroup | supergroup | 设置hdfs超级权限的组,默认是supergroup,启动hadoop所使用的用户通常是superuser。 |
dfs.data.dir | /opt/data1/hdfs/data, | 真正的datanode数据保存路径,可以写多块硬盘,逗号分隔 |
dfs.datanode.data.dir.perm | 755 | datanode所使用的本地文件夹的路径权限,默认755 |
dfs.replication | 3 | hdfs数据块的复制份数,默认3,理论上份数越多跑数速度越快,但是需要的存储空间也更多。有钱人可以调5或者6 |
dfs.replication.max | 512 | 有时dn临时故障恢复后会导致数据超过默认备份数。复制份数的最多数,通常没什么用,不用写配置文件里。 |
dfs.replication.min | 1 | 最小份数,作用同上。 |
dfs.block.size | 134217728 | 每个文件块的大小,我们用128M,默认是64M。这个计算需要128*1024^2,我碰上过有人直接写128000000,十分浪漫。 |
dfs.df.interval | 60000 | 磁盘用量统计自动刷新时间,单位是毫秒。 |
dfs.client.block.write.retries | 3 | 数据块写入的最多重试次数,在此次数之前不会捕获失败。 |
dfs.heartbeat.interval | 3 | DN的心跳检测时间间隔。秒 |
dfs.namenode.handler.count | 10 | NN启动后展开的线程数。 |
dfs.balance.bandwidthPerSec | 1048576 | 做balance时所使用的每秒最大带宽,使用字节作为单位,而不是bit |
dfs.hosts | /opt/hadoop/conf/hosts.allow | 一个主机名列表文件,这里的主机是允许连接NN的,必须写绝对路径,文件内容为空则认为全都可以。 |
dfs.hosts.exclude | /opt/hadoop/conf/hosts.deny | 基本原理同上,只不过这里放的是禁止访问NN的主机名称列表。这在从集群中摘除DN会比较有用。 |
dfs.max.objects | 0 | dfs最大并发对象数,HDFS中的文件,目录块都会被认为是一个对象。0表示不限制 |
dfs.replication.interval | 3 | NN计算复制块的内部间隔时间,通常不需写入配置文件。默认就好 |
dfs.support.append | true | false | 新的hadoop支持了文件的APPEND操作,这个就是控制是否允许文件APPEND的,但是默认是false,理由是追加还有bug。 |
dfs.datanode.failed.volumes.tolerated | 0 | 能够导致DN挂掉的坏硬盘最大数,默认0就是只要有1个硬盘坏了,DN就会shutdown。 |
dfs.secondary.http.address | 0.0.0.0:50090 | SNN的tracker页面监听地址和端口 |
dfs.datanode.address | 0.0.0.0:50010 | DN的服务监听端口,端口为0的话会随机监听端口,通过心跳通知NN |
dfs.datanode.http.address | 0.0.0.0:50075 | DN的tracker页面监听地址和端口 |
dfs.datanode.ipc.address | 0.0.0.0:50020 | DN的IPC监听端口,写0的话监听在随机端口通过心跳传输给NN |
dfs.datanode.handler.count | 3 | DN启动的服务线程数 |
dfs.http.address | 0.0.0.0:50070 | NN的tracker页面监听地址和端口 |
dfs.https.enable | true | false | NN的tracker是否监听在HTTPS协议,默认false |
dfs.datanode.https.address | 0.0.0.0:50475 | DN的HTTPS的tracker页面监听地址和端口 |
dfs.https.address | 0.0.0.0:50470 | NN的HTTPS的tracker页面监听地址和端口 |
dfs.datanode.max.xcievers | 2048 | 相当于linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认256 |