Hadoop对于海量数据的操作:
1)存储:分布式,集群的概念,管理(主节点,从节点),HDFS(Hadoop Distributed FileSystem )
2)分析:分布式,并行,离线计算框架。管理(主节点,从节点),MapReduce
HDFS + MR 思想
尽可能移动计算到数据端,而非移动数据到计算端。(图中上面是将数据移动到计算端,下面是将计算移动到数据端 )
硬件和组件的故障是一种常态
HDFS思想
文件单次写入,并多次读取,文件副本分片保存
顺序写入,流式顺序读取,面向大文件存储
MR思想
分而治之,化整为零。
排序优化(MapReduce核心),降低内存
Apache Hadoop五大守护进程的作用
NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在DataNode等。
DataNode在本地文件系统存储文件块数据,以及块数据的校验和。
Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。
JobTracker负责接收用户提交的作业。负责启动,跟踪任务执行。
TaskTracker负责执行由JobTracker分配的任务,管理各个任务在每个节点上的执行情况。
Apache Hadoop的版本
经典版本:0.20.0——〉1.0.0(第一个正式版本)
1.0.3或者1.0.4(使用最多的版本)——〉1.1.2 1.2.1(目前最新的版本)
0.23.0(跨越版本,YARN框架,第二代MapReduce 框架,资源管理和任务调动的框架)
2.x版本
1)2.0.x版本:属于2.x系列版本的 alpha 版本
2)2.1.x版本:属于2.x系列版本的 beta版本
3)2.2.0 2.3.0 2.4.0 正式版本,可用于实际生产环境中
(1.0与2.0区别就是2.0比1.0多了一个YARN)
Apache Hadoop 内核
Hadoop 1.0(最新稳定版1.2.1)
Hadoop Common
Hadoop Distributed File System(HDFS)
Hadoop MapReduce
Hadoop 2.0(最新稳定版2.2.0)
Hadoop Distributed File System(HDFS)
Hadoop MapReduce
Hadoop YARN
Apache Hadoop安装部署模式
单机(本地安装)模式(Standlong Mode)
只有一个JVM进程,没有分布式,没有HDFS,通常用于调试
伪分布模式(Pseudo-Distributed Mode)
一台机器上运行所有的Hadoop服务(五个守护进程)
只有一台机器,每个Hadoop守护进程都是一个独立的JVM进程,通常用于调试
(课程基本使用伪分布式)
完全分布模式(Fully Distributed Mode)
运行于多台机器上,真实环境
我的Hadoop安装规则
/Hadoop——〉父目录
|——->/Hadoop/modules —>存放软件的安装目录(hadoop-1.2.1)
|——->/Hadoop/softwares —>存放软件包(tar包,bin包,zip文件等)
|——->/Hadoop/tools —–>存储工具目录(Eclipse等)
|——->/Hadoop/data —–>存储一些测试数据
|——->/Hadoop/Java —–>存储java
Hadoop安装部署——单机模式
Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统。而且也不会启动任何Hadoop守护进程,Map和Reduce任务都作为同一进程的不同部分来执行。因此,本地模式下的Hadoop仅运行于本机。此种模式仅用于开发或者调试MapReduce应用程序。
当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守的选择了最小配置,在这种默认模式下所有3个XML文件均为空,当配置文件为空时,Hadoop会完全运行在本地。
安装JDK
1)解压
tar -zxvf 文件名
2)移动
mv 文件夹 目的文件夹
3)配置环境变量
vim /etc/profile 文件,添加以下内容
以root用户登录,执行以下命令,是配置生效 # source /etc/profile
4)测试
安装Hadoop1.2.1
第一步:解压
tar -zxvf hadoop-1.2.1.tar.gz
第二步:移动hadoop到modules文件夹
第三步:配置环境变量
vim /etc/profile
添加如下代码:
以root用户登录,执行以下命令,是配置生效 # source /etc/profile
第四步:测试
输入hadoop
第五步:配置Hadoop中的JDK安装路径
进入hadoop-1.2.1中的conf文件夹下的hadoop-env.sh中修改jdk安装路径
出来以后:
[root@H01 conf]# pwd
/home/hadoop1/Hadoop/modules/hadoop-1.2.1/conf
这样是正确的
第六步:测试MapReduce程序
输入:
[root@H01 hadoop-1.2.1]# hadoop jar hadoop-examples-1.2.1.jar grep /home/hadoop1/Hadoop/data/input/ /home/hadoop1/Hadoop/data/output 'dfs[a-z.]+'
测试成功表现:
警告:
在测试MapReduce程序时出现了一行警告
Warning: $HADOOP_HOME is deprecated.
shell代码
if [ "$HADOOP_HOME_WARN_SUPPRESS" = "" ] && [ "$HADOOP_HOME" != "" ]; then
echo "Warning: \$HADOOP_HOME is deprecated." 1>&2
echo 1>&2
fi
对于这个警告问题,解决方法如下:
1.注释掉hadoop-config.sh里的上面给出的这段if fi配置(不推荐)
2.在当前用户home/.bash_profile里增加一个环境变量:
[root@H01 hadoop1]# vim .bash_profile
export HADOOP_HOME_WARN_SUPPRESS=1
注:修改完.bash_profile后需要执行source操作使其生效
Hadoop安装部署——伪分布式
Hadoop将所有进程运行于同一台主机上。但此时Hadoop将使用分布式文件系统。而且各jobs也是由JobTracker服务管理的独立进程 。
伪分布式的Hadoop集群只有一个节点。 因此HDFS的块复制将限制为单个副本。其second-master和slaves也都将运行于本地主机。
此种模式除了并非真正意义的分布式之外,其程序执行逻辑完全类似于完全分布式。因此,常应用于开发人员测试程序执行。
该模式在单机模式上添加了代码调试功能。允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。
伪分布式组件依赖关系
第一步:查看防火墙状态
切换到root用户,输入:service iptables status
[root@H01 hadoop1]# service iptables status
iptables:未运行防火墙。
[root@H01 hadoop1]#
发现没有运行防火墙,再看selinux
发现SELINUX没有被禁闭,将如下代码
SELINUX=enforcing
改变成
SELINUX=disabled
第二步:设置静态IP地址
查看静态IP地址
查看设置主机名
查看主机名与IP是否绑定
[root@H01 hadoop1]# more /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.108.101 H01
第三步设置SSH自动登录
SSH是一个网络协议,配置之后可以在传输数据时不用验证密钥,因为文件中会带着密钥自行认证。
配置过程跳出root回到普通用户,输入ssh-keygen -t rsa
一路Enter点过去
[hadoop1@H01 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop1/.ssh/id_rsa.
Your public key has been saved in /home/hadoop1/.ssh/id_rsa.pub.
The key fingerprint is:
e2:e1:be:ff:27:07:b0:dd:27:f1:c1:8f:3f:50:d4:e1 hadoop1@H01
The key's randomart image is:
+--[ RSA 2048]----+
| .o|
| ...|
| ..E |
| . . o. |
| o S+ . o.+ |
| o o. o o.+ .|
| o . o.. |
| . . o ..|
| oo...+ .|
+-----------------+
[hadoop1@H01 ~]$
查看全部文件
[hadoop1@H01 ~]$ ls -al
总用量 139204
drwx------. 27 hadoop1 hadoop1 4096 10月 14 15:13 .
drwxr-xr-x. 3 root root 4096 10月 14 09:08 ..
-rw-------. 1 hadoop1 hadoop1 3864 10月 14 09:18 .bash_history
-rw-r--r--. 1 hadoop1 500 18 7月 24 02:55 .bash_logout
-rw-r--r--. 1 hadoop1 500 211 10月 14 09:11 .bash_profile
-rw-r--r--. 1 hadoop1 500 124 7月 24 02:55 .bashrc
drwxr-xr-x. 6 hadoop1 hadoop1 4096 10月 12 23:53 .cache
drwxr-xr-x. 6 hadoop1 hadoop1 4096 10月 12 22:00 .config
drwx------. 3 hadoop1 hadoop1 4096 10月 9 10:19 .dbus
-rw-r--r--. 1 hadoop1 hadoop1 32 10月 14 13:16 .dmrc
-rw-------. 1 hadoop1 hadoop1 16 10月 9 10:19 .esd_auth
drwx------. 4 hadoop1 hadoop1 4096 10月 14 13:16 .gconf
drwx------. 2 hadoop1 hadoop1 4096 10月 14 13:36 .gconfd
drwxr-xr-x. 7 hadoop1 500 4096 10月 12 23:50 .gnome2
drwx------. 2 hadoop1 hadoop1 4096 10月 9 10:19 .gnome2_private
-rw-rw-r--. 1 hadoop1 hadoop1 200 10月 14 13:16 .gtk-bookmarks
drwx------. 2 hadoop1 hadoop1 4096 10月 9 10:19 .gvfs
drwxr-xr-x. 7 root root 4096 10月 13 19:13 Hadoop
-rw-------. 1 hadoop1 hadoop1 6510 10月 14 13:16 .ICEauthority
drwxrwxr-x. 2 hadoop1 hadoop1 4096 10月 12 21:57 .icons
-rwxrw-rw-. 1 hadoop1 hadoop1 142376665 10月 9 14:49 jdk-7u67-linux-x64.tar.gz
drwxr-xr-x. 3 hadoop1 hadoop1 4096 10月 9 10:19 .local
drwxr-xr-x. 5 hadoop1 500 4096 10月 9 11:02 .mozilla
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 9 10:19 .nautilus
drwx------. 2 hadoop1 hadoop1 4096 10月 9 10:19 .pulse
-rw-------. 1 hadoop1 hadoop1 256 10月 9 10:19 .pulse-cookie
drwx------. 2 hadoop1 hadoop1 4096 10月 14 15:14 .ssh
drwxrwxr-x. 2 hadoop1 hadoop1 4096 10月 12 21:57 .themes
drwx------. 4 hadoop1 hadoop1 4096 10月 9 19:34 .thumbnails
-rw-------. 1 hadoop1 hadoop1 5820 10月 13 23:27 .viminfo
-rw-------. 1 hadoop1 hadoop1 923 10月 14 13:16 .xsession-errors
-rw-------. 1 hadoop1 hadoop1 747 10月 14 09:19 .xsession-errors.old
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 9 10:19 公共的
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 9 10:19 模板
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 9 10:19 视频
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 12 22:03 图片
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 12 17:40 文档
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 12 18:04 下载
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 9 10:19 音乐
drwxr-xr-x. 2 hadoop1 hadoop1 4096 10月 13 19:15 桌面
进入.ssh文件,查看里面的文件
[hadoop1@H01 ~]$ cd .ssh/
[hadoop1@H01 .ssh]$ ls
id_rsa id_rsa.pub
[hadoop1@H01 .ssh]$ ll
总用量 8
-rw-------. 1 hadoop1 hadoop1 1675 10月 14 15:15 id_rsa
-rw-r--r--. 1 hadoop1 hadoop1 393 10月 14 15:15 id_rsa.pub
[hadoop1@H01 .ssh]$
将id_rsa.pub复制一份,将公钥变成私钥
[hadoop1@H01 .ssh]$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
[hadoop1@H01 .ssh]$ ll
总用量 12
-rw-r--r--. 1 hadoop1 hadoop1 393 10月 14 15:30 authorized_keys
-rw-------. 1 hadoop1 hadoop1 1675 10月 14 15:15 id_rsa
-rw-r--r--. 1 hadoop1 hadoop1 393 10月 14 15:15 id_rsa.pub
此时就相当于配置好了,但是还要做一个操作,测试一下。
第一次连接本地localhost
[hadoop1@H01 .ssh]$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is a5:06:76:07:02:d8:1f:b3:bd:f9:1e:bb:6d:43:99:52.
Are you sure you want to continue connecting (yes/no)?
此时输入yes,连接以前在.ssh目录,连接之后跳转到home,所以先退出
再次查看生成了想要的文件:know_hosts(已知道的主机)
查看文件(know_hosts)
[hadoop1@H01 .ssh]$ more known_hosts
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwQiB2XS0TZ80zIiUJkM3q0L9zC0zwl1Yp6H4N4P0EEoQo3fgOcIDiVAAWpR+JrP4AGinF6NloChP77YsQtd4ATg
g0eyxceS0qVpdg/RxmvSnqQrJ5uobQN6GfqDzXRIaVKMa6XO9AjF+ETLYqZZHQ40j8nHDfsXb8f1/F8D3aHsGdWr4uplB98tsMssoMwvy/bycxeb+0IdRXtR7nKYevhwmBU/o
IzPc44WAliRGkkE2WQ+WWuY2190BGink75Dfm2SfpDJT0RbMsGnmavKfoDImp77iKFGSONw5bannu5FPkYf8sn2LOp2lxOUozSUEZw8sdYU+/NE++Ual+yEOtQ==
[hadoop1@H01 .ssh]$
再次连接就不需要输入密码或者yes了:
然后再连接一次H01
第二次连接
再次查看文件(known_hosts )
[hadoop1@H01 .ssh]$ ll
总用量 16
-rw-r--r--. 1 hadoop1 hadoop1 393 10月 14 15:30 authorized_keys
-rw-------. 1 hadoop1 hadoop1 1675 10月 14 15:15 id_rsa
-rw-r--r--. 1 hadoop1 hadoop1 393 10月 14 15:15 id_rsa.pub
-rw-r--r--. 1 hadoop1 hadoop1 792 10月 14 15:52 known_hosts
[hadoop1@H01 .ssh]$ more known_hosts
localhost ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwQiB2XS0TZ80zIiUJkM3q0L9zC0zwl1Yp6H4N4P0EEoQo3fgOcIDiVAAWpR+JrP4AGinF6NloChP77YsQtd4ATg
g0eyxceS0qVpdg/RxmvSnqQrJ5uobQN6GfqDzXRIaVKMa6XO9AjF+ETLYqZZHQ40j8nHDfsXb8f1/F8D3aHsGdWr4uplB98tsMssoMwvy/bycxeb+0IdRXtR7nKYevhwmBU/o
IzPc44WAliRGkkE2WQ+WWuY2190BGink75Dfm2SfpDJT0RbMsGnmavKfoDImp77iKFGSONw5bannu5FPkYf8sn2LOp2lxOUozSUEZw8sdYU+/NE++Ual+yEOtQ==
h01,192.168.108.101 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwQiB2XS0TZ80zIiUJkM3q0L9zC0zwl1Yp6H4N4P0EEoQo3fgOcIDiVAAWpR+JrP4AGinF6NloChP7
7YsQtd4ATgg0eyxceS0qVpdg/RxmvSnqQrJ5uobQN6GfqDzXRIaVKMa6XO9AjF+ETLYqZZHQ40j8nHDfsXb8f1/F8D3aHsGdWr4uplB98tsMssoMwvy/bycxeb+0IdRXtR7nK
YevhwmBU/oIzPc44WAliRGkkE2WQ+WWuY2190BGink75Dfm2SfpDJT0RbMsGnmavKfoDImp77iKFGSONw5bannu5FPkYf8sn2LOp2lxOUozSUEZw8sdYU+/NE++Ual+yEOtQ=
=
[hadoop1@H01 .ssh]$
配置core-site.xml
指定NameNode主机名与端口号
配置Hadoop Common Project 相关的属性配置,Hadoop 1.x 框架的基础属性配置
[root@H01 conf]# pwd
/home/hadoop1/Hadoop/modules/hadoop-1.2.1/conf
[root@H01 conf]# vim core-site.xml
配置hdfs-site.xml
设置HDFS副本数
配置HDFS Project 文件系统的相关属性
[root@H01 conf]# vim hdfs-site.xml
配置mapred-site.xml
指定JobTracker的主机与端口号
[root@H01 conf]# vim mapred-site.xml
配置文件masters
指定SecondaryNameNode的位置
配置与MapReduce 框架相关的属性
[root@H01 conf]# vim masters
配置文件slaves
指定DataNode和TaskTracker的位置
[root@H01 conf]# vim slaves
格式化
[hadoop1@H01 bin]$./hadoop namenode -format
错误
15/10/16 13:34:00 ERROR namenode.NameNode: java.io.IOException: Cannot create directory /home/hadoop1/Hadoop/data/tmp/dfs/name/current
在格式化过程中出现了一个错误
其实并不是环境变量配置错误,文件路径也是正确的
只不过权限没有设定好。
[hadoop1@H01 bin]$./hadoop namenode -format
改成root权限这个问题就解决了。
[root@H01 bin]# ./hadoop namenode -format
15/10/16 13:36:37 INFO common.Storage: Image file /home/hadoop1/Hadoop/data/tmp/dfs/name/current/fsimage of size 110 bytes saved in 0 seconds.
启动进程
[root@H01 bin]# start-dfs.sh //启动hdfs
[root@H01 bin]# start-mapred.sh //启动mapreduce
[root@H01 bin]# start-all.sh //启动全部
查看当前进程
[root@H01 bin]# jps
4035 TaskTracker
3854 SecondaryNameNode
4100 Jps
3595 NameNode
3726 DataNode
3926 JobTracker
权限问题:还是要修改,待定
查看Hadoop日志以及日志的格式和命名组成
有两种日志:分别以log和out结尾
1)以log结尾的日志:
通过log4j日志记录格式进行记录的日志。采用的是日常滚动文件后缀策略来命名文件的方式
内容比较全面。
2)以out结尾的日志:
记录标准输出和标准错误的日志。内容比较少。默认的情况系统保留最新的5个日志文件。
日志放在哪里是可以配置的,默认放在这个目录下:
[root@H01 logs]# pwd
/home/hadoop1/Hadoop/modules/hadoop-1.2.1/logs
那么在哪里配置日志存放位置呢?
[root@H01 conf]# pwd
/home/hadoop1/Hadoop/modules/hadoop-1.2.1/conf
在这个目录下的 hadoop-env.sh 文件中配置。
这两行代码就控制日志的存储位置。
# Where log files are stored. $HADOOP_HOME/logs by default.
# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
日志的命名:
Hadoop启动停止的三种方式:
1)第一种方式
分别启动HDFS和MapReduce,命令:
[root@H01 bin]# start-dfs.sh //启动hdfs
[root@H01 bin]# stop-dfs.sh //停止hdfs
[root@H01 bin]# start-mapred.sh //启动mapreduce
[root@H01 bin]# stop-mapred.sh //停止mapreduce
2)第二种方式
全部启动或全部停止
[root@H01 bin]# start-all.sh //启动全部
启动顺序:NameNode,DataNode,SecondaryNameNode,JobTracker,TaskTracker
[root@H01 bin]# stop-all.sh //停止全部
停止顺序:JobTracker,TaskTracker,NameNode,DataNode,SecondaryNameNode
3)第三种方式
每个守护进程逐一进行启动,启动顺序如下:
NameNode,DataNode,SecondaryNameNode,JobTracker,TaskTracker
命令如下:
启动:
[root@H01 bin]# ./hadoop-daemon.sh
Usage: hadoop-daemon.sh [--config <conf-dir>] [--hosts hostlistfile] (start|stop) <hadoop-command> <args...>
[root@H01 bin]# ./hadoop-daemon.sh start namenode
starting namenode, logging to /home/hadoop1/Hadoop/modules/hadoop-1.2.1/libexec/../logs/hadoop-hadoop1-namenode-H01.out
[root@H01 bin]# jps
6403 NameNode
6443 Jps
[root@H01 bin]#
这片代码是启动namenode的方式,其他进程的启动方式与此相同。
./hadoop-daemon.sh start 进程名称
停止:
把上面代码里的start变成stop就可以了。注意关闭的顺序。
先关jobtracker,后关tasktracker,namenode,datanode,secondarynamenode
小笔记
hadoop-daemons.sh 表示启动多个守护进程。在这五个进程中只有data和task用到了多个机器的进程。在伪分布式中因为只有一台机器启动,所以不需要。当分布式启动时会用到,因为分布式需要启动多台机器。