hadoop的各类安装和部署文档布满整个网络,安装配置也很容易,感觉对整个过程以及各配置文档理解才是最重要的。本次在操作pezy的一体机时,结合实际使用整理hadoop的一些知识供日后使用(当然多是理解之后直接引入网络上的资料)。
一、网络名词copy
NameNode:
-
NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到 DataNode 上的复制块上。对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。实际的 I/O事务并没有经过 NameNode,只有表示 DataNode 和块的文件映射的元数据经过 NameNode。当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。
-
NameNode 在一个称为 FsImage 的文件中存储所有关于文件系统名称空间的信息。这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode 的本地文件系统上,也就是配置的namenode dir下面。FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。
-
namendoe的元数据切记做好多处备份,包括热备和冷备,否则元数据一丢,整个集群的数据都无法恢复了。热备:namenode的元数据配置写两份,一分写本地,另一份写远程nfs。冷备:定时拷贝namenode的元数据到远程的nfs,保留十天甚至更长。NameNode本身不可避免地具有SPOF(Single Point Of Failure)单点失效的风险,主备模式并不能解决这个问题,通过Hadoop Non-stop namenode才能实现100% uptime可用时间。
DataNode:
-
DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
-
DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。
-
如果datanode对应的机器上有多块磁盘,例如/disk1-/disk3,dfs.data.dir可以配置为”/disk1/data,/disk2/data,/disk3/data”,datanode会在写数据时,以轮询的方式选择一个目录写入数据,一般这些目录是不同的块设备,不存在的目录会被忽略掉。如果有多个磁盘不建议做raid,因为做raid会有性能损失,还会导致一个磁盘坏了,整个硬盘也不能用了,而hadoop可以规避这个问题。
文件操作:
-
HDFS 并不是一个万能的文件系统。它的主要目的是支持以流的形式访问写入的大型文件。
-
如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)。
二、配置文件理解说明
1、hadoop-env.sh:环境配置文件,以支撑hadoop运行
- export JAVA_HOME=/home/Java/jdk1.6 #主要是增加这个jdk设置,注意千万别写成/home/Java/jdk1.6/,这样是无法运行hadoop命令的;
2、conf/core-site.xml:hadoop core的配置项
- <property>
- <name>fs.default.name</name>
- <value>hdfs://arm2:9000</value> #arm2为namenode的主机名,9000为端口,这里都写主机名不写Ip
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/opt/hadooptmp/</value>
- </property>
-
fs.default.name-这是一个描述集群中NameNode结点的URI(包括协议、主机名称、端口号),集群里面的每一台机器都需要知道NameNode的地址。DataNode结点会先在NameNode上注册,这样它们的数据才可以被使用。独立的客户端程序通过这个URI跟DataNode交互,以取得文件的块列表。
-
hadoop.tmp.dir 是hadoop文件系统依赖的基础配置,也就是临时文件存放目录,很多路径都依赖它。如果hdfs-site.xml中不配置namenode和datanode的存放位置,默认就放在这个路径中;非root用户时注意文件夹的权限问题。
3、hdfs-site.xml: hadoop守护进程的配置项,包括namenode、辅助namenode和datanode
- <property>
- <name>dfs.replication</name>
- <value>3</value>
- </property>
- <property>
- <name>dfs.name.dir</name>
- <value>/mnt/sda2/namenode</value>
- </property>
- <property>
- <name>dfs.data.dir</name>
- <value>/mnt/sda2/data,/mnt/sdb/data,/mnt/sdc/data,/mnt/sdd/data</value>
- </property>
- <property>
- <name>dfs.datanode.max.xcievers</name>
- <value>4096</value>
- </property>
- <property>
- <name>dfs.permissions</name>
- <value>false</value>
- </property>
-
dfs.replication -它决定着 系统里面的文件块的数据备份个数。对于一个实际的应用,它 应该被设为3(这个 数字并没有上限,但更多的备份可能并没有作用,而且会占用更多的空间)。少于三个的备份,可能会影响到数据的 可靠性(系统故障时,也许会造成数据丢失)
-
dfs.data.dir-这是DataNode结点被指定要存储数据的本地文件系统路径。DataNode结点上 的这个路径没有必要完全相同,因为每台机器的环境很可能是不一样的。但如果每台机器上的这 个路径都是统一配置的话,会使工作变得简单一些。默认的情况下,它的值为hadoop.tmp.dir。如上面可以为每个机器配置多个,用逗号隔开,不存在的在操作时会被忽略;
-
dfs.name.dir-这是NameNode结点存储hadoop文件系统信息的本地系统路径。这个值只对NameNode有效,DataNode并不需要使用到它。
-
dfs.datanode.max.xcievers 配置项:填写 HDFS 同时能打开文件的个数
-
dfs.permissions:默认关闭在hdfs上的权限检查,设置成false就行;
4、mapred-site.xml :mapreduce守护进程的配置项,包括jobtracker和tasktracker
- <span style="font-size:12px;"> <property>
- <name>mapred.job.tracker</name>
- <value>arm2:9001</value> #还是namenode那台机器的主机名
- </property>
- <property>
- <name>mapred.tasktracker.map.tasks.maximum</name>
- <value>2</value>
- </property>
- <property>
- <name>mapred.tasktracker.reduce.tasks.maximum</name>
- <value>2</value>
- </property>
- <property>
- <name>mapred.local.dir</name>
- <value>/mnt/sda2/mapred_tmp,/mnt/sdb/mapred_tmp,/mnt/sdc/mapred_tmp,/mnt/sdd/mapred_tmp</value>
- </property>
- <property>
- <name>mapred.child.java.opts</name>
- <value>-Xmx256m</value>
- </property>
- </span>
-
mapred.job.tracker:JobTracker的主机和端口
-
mapred.local.dir:Tasktracker的中间输出目录,MapReduce产生的中间数据会特别多,为了减少磁盘压力,如果机器有多个磁盘,也可以像datanode的数据目录设为“/mnt/sdb/mapred_tmp,/mnt/sdc/mapred_tmp,/mnt/sdd/mapred_tmp”。
-
map和reduce任务的JVM选项:mapred.child.java.opts配置map和reduce子进程的JVM属性,如果内存充裕,可以改为 -Xmx2400m.
-
mapred.tasktracker.reduce/map.tasks.maximum:Tasktracker的map和reducer数量配置: 属性mapred.tasktracker.map.tasks.maximum配置这个tasktracker同时可以最多跑多少个map task,要根据tracker的内存和磁盘情况规划。还有属性mapred.tasktracker.reduce.tasks.maximum配置这个tasktracker同时可以最多跑多少个reduce task.同理也是要根据tracker的内存和磁盘情况规划。例如8核的机器,8个map和8个reducer。map中间结果开启压缩操作(尤其是snappy和LZO)的时候,cpu的负载会比较高,map和reducer的数量可以根据自己的业务情况灵活调节。
5、配置masters和slaves文件,masters里面需要配置namenode的主机名,slaves里面需要配置datanode的主机名,当然你也可以把namenode也当成一个datanode节点。
6、在每台机器的/etc/hosts文件中都加上对应的主机名和IP地址的映射。
三、配置shh免密码登陆
hadoop启动只需要在namenode节点进行启动,需要namenode节点可以通过ssh方式免密码登陆自己和其它datanode节点,需要按下面步骤配置ssh免密码登陆(假设是用root用户安装);
1、登陆到namenode和datanode节点,进入到用户目录下,如root目录,使用ssh-keygen生成公匙文件id_rsa.pub和私匙id_rsa文件
- cd /root
- ssh-keygen #这时候在该目录生成一个.ssh的隐藏文件夹,然后会有id_rsa,id_rsa.pub
2、登陆到namenode节点,使用下面命令把namenode节点的公匙拷贝到所有节点上的authorized_keys文件,包括namenode本身。
- cd /root/.ssh
- scp ./id_rsa.pub <a target=_blank href="mailto:root@192.168.1.181:/root/.ssh/authorized_keys" target="_blank">root@192.168.1.181:/root/.ssh/authorized_keys</a>#依次使用该命令进行操作,修改IP地址即可
3.然后手动把datanode节点上的公匙文件的内容拷贝追加到nodename节点的authorized_keys中;
4.然后使用ssh 192.168.1.181这样就发现不需要密码就可以直接登陆了;
四、简单操作说明
- <strong>#创建文件操作</strong> cd /opt/hadoop/ #假设hadoop是安装在opt/hadoop下面
#创建文件目录 bin/hadoop fs -mkdir /test/nko001 #创建/test/nko001这样的目录 bin/hadoop fs -ls / #查看根目录下的所有目录,检查test目录是否创建成功 bin/hadoop fs -ls /test#查看test目录下的目录,检查nko001目录是否创建成功
- <strong>#上传文件 ,上传一个本机/opt/test/test1.txt的文件到hdfs中/test/test001目录下</strong>
- bin/hadoop fs –put /opt/test/test1.txt /test/test001 #上传文件
- bin/hadoop fs -ls /test/nko001#检查文件是否上传成功
- <strong>#下载文件,下载hdfs中/test/test001目录下的test1.txt文件到本机/opt/test中</strong>
- bin/hadoop fs -get /test/nko001/test1.txt /opt/test/test1.txt#下载文件
- bin/hadoop fs -get /test/nko001/test1.txt /opt/test/
- bin/hadoop fs -get /test/nko001/* /opt/test/#下载全部文件到本地test目录
- <strong>#查看文件操作</strong>
- bin/hadoop fs -ls#ls后面可以接具体的文件夹
- <strong>#删除文件和文件夹</strong>
- bin/hadoop fs -rm /test/nko001/test1.txt #删除hdfs中/test/nko001目录下一个名叫test1.txt的文件
- bin/hadoop fs -ls /test/nko001#验证是否删除成功
- bin/hadoop fs -rmr /test/nko001#删除hdfs中//test/nko001目录以及该目录下的所有文件
- bin/hadoop fs -ls /test#验证是否删除成功
- #如果要学习更多的操作,请果断bin/hadoop查看帮助信息吧