记HADOOP的学习
Hadoop起源
2004年,开发一款搜索引擎,nutch。nutch基于Lucence实现的搜索引擎,能够从互联网上抓取网页数据。抓取来的海量数据的存储问题。但是,这些海量数据都是非结构化数据,不能存在关系型数据库里。如果连数据的存储和管理都解决不了化,就谈不上后续为用户提供搜索服务,包括通过算法去优化检索速度。
正好那时候,Google发表了两篇论文《Google File System》 《Google MapReduce》
《Google File System》简称GFS,是Google公司用于解决海量数据存储的文件系统。
《Google MapReduce》简称MapReduce,是Google的计算框架,基于GFS。
2006年cutting根据《Google File System》设计了Nutch的HDFS,hadoop distributed file system。
Hadoop最开始是nutch的子项目,目的是解决nutch的海量数据存储问题。在nutch 0.8版本之后,Hadoop独立处理,成为一个独立的项目。后来,又根据《Google MapReduce》设计了基于HDFS的uMapRedce计算框架。
2006年之后,cutting带着Hadoop去了雅虎,当时有100多人的团队共同帮cutting完善hadoop。后来yahoo把Hadoop贡献了Apache。所以,现在Hadoop是Apache的顶级项目。
大数据的特点
- TB,PB级别的数据
- 非结构化数据
- 快速增长,每天都会有大量数据产生。
大数据带来的变化
- 大数据没有产生之前,数据分析,主要要依靠比较精良的算法。算法越严密,结果越精确。但是有了大数据之后,当数据量达到一定规模的时候,数据本身就可以说话了。所以就不需要太依靠算法去分析结果。
- 当数据量达到一定程度后,不需要考虑因果关系,就能得到结果。
所以,大数据是一种新的生产力。
Hadoop在MAC上的搭建
hadoop有三种安装模式
- 单机模式
只支持MapReduce,不支持HDFS。这种模式一般用于调试MapReduce任务用的。
- 单机的伪分布式模式
这种模式即支持MR,也支持HDFS
- 完全分布式模式
用多个机器或多台虚拟机去搭建
安装方式
单机版
用于本地调试mapreduce使用,可直接在工程中引用hadoop的相关jar包,就可以使用到hadoop的mapreduce功能
单机的伪分布式模式
- 方式一、直接使用命令
brew install hadoop
但是这样可能会存在使用时找不到HADOOP_CONF_DIR所在路径,造成无法正常运行的问题
- 方式二、下载hadoop安装包,手动配置
步骤如下:
- 1.解压hadoop压缩包,在
~/.bash_profile
中配置hadoop的相关路径
HADOOP_HOME=/Users/caojinlin/opt/hadoop-2.8.2
PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_HOME
export PATH
-
2.配置相关文件
配置hadoop安装目录下etc/hadoop下的配置文件hadoop-env.sh
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home export HADOOP_CONF_DIR=/Users/caojinlin/opt/hadoop-2.8.2/etc/hadoop export HADOOP_OPTS="-Djava.library.path=/Users/caojinlin/opt/hadoop-2.8.2/lib/native"
core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <!--用来指定hadoop运行时产生文件的存放目录 自己创建--> <property> <name>hadoop.tmp.dir</name> <value>/Users/caojinlin/opt/hadoop-2.8.2/tmp</value> </property> </configuration>
hafs-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <!--用来指定hadoop运行时产生文件的存放目录 自己创建--> <property> <name>hadoop.tmp.dir</name> <value>/Users/caojinlin/opt/hadoop-2.8.2/tmp</value> </property> </configuration>
mapred-site.xml
<configuration> <property> <!--指定mapreduce运行在yarn上--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
yarn.site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <property> <!--NodeManager获取数据的方式--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
-
3.配置免密码登录
运行如下的命令
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 4.格式化namenode
执行hadoop namenode -format
当窗口出现时则代表成功。此时,创建了初始化的fsimage文件后edits文件。
- 5.启动hadoop
在hadoop的安装目录下的sbin中找到start-all.sh,启动这个命令,则可以启动hadoop
启动后可以运行jps
查看运行的进程,如果其中有DataNode
,NameNode
,NodeManager
,SecondaryNameNode
,ResourceManager
这五个进程,则说明hadoop成功启动了
HDFS学习
运行成功hadoop后可以在浏览器的localhost:50070
页面查看HDFS系统
也可以通过命令行进行操作HDFS
HDFS的常用相关命令
命令 | 说明 |
---|---|
hadoop fs -mkdir /park | 在hdfs 的根目录下,创建 park目录 |
hadoop fs -ls / | 查看hdfs根目录 |
hadoop fs -put /Users/caojinlin/1.txt /park | 将/Users/caojinlin目录下的1.txt放在hdfs的park目录下 |
hadoop fs -get /park/jdk /home | 把hdfs文件系统下park目录的文件下载到/Users/caojinlin目录下 |
hadoop fs -rm /park/文件名 | 删除hdfs 的park目录的指定文件 |
hadoop fs -rmdir /park | 删除park目录,但是前提目录里没有文件 |
hadoop fs -rmr /park | 删除park目录,即使目录里有文件 |
hadoop fs -cat /park/a.txt | 查看park目录下的a.txt文件 |
haddop jar xxx.jar | 执行jar包 |
hadoop fs -getmerge /park /root/tmp | 将park目录下的所有文件合并成一个文件,并下载到/Users/caojinlin目录下 |
hadoop dfsadmin -safemode leave | 离开安全模式 |
hadoop dfsadmin -safemode enter | 进入安全模式 |
hadoop dfsadmin -report | 查看存活的datanode节点信息 |
hadoop fsck /park/1.txt -files -blocks -locations -racks | 查看1.txt 这个文件block信息以及机架信息 |
HDFS相关知识
HDFS中文件是按块进行存储的,hadoop1.X是按64MB切文件,hadoop2.X是按128MB切文件。
启动的进程中
namenode: 管理元数据信息,文件名,文件大小,文件块等信息,但是不存储具体数据。
datanode:用于负责存储块数据
Secondarynamenode: 负责定期的合并fsimage和edits文件,将合并后的元数据文件fsimage传给namenode,是namenode的辅助节点。
在格式化namenode时生成的fsimage和edits文件用来记录元数据信息
edits文件:记录元数据信息的改动,只要元数据发生变化,edits文件就产生记录
fsimage和edits文件会定期合并,这个周期默认事3600s,fsimage根据edits里的改动记录进行元数据的更新。
每次进行namenode格式化的时候都需要删除原来的edits文件和fsimage文件,不然会因为namenode对应不上相关的记录无法启动。