hadoop

Hadoop生态圈

HDFS:分布式文件系统
YARN:分布式资源调度系统
MAPREDUCE:分布式计算框架

HIVE:数据仓库工具 
HBASE:分布式海量数据库

ZOOKEEPER:分布式协调服务基础组件
MAHOUT:基于mapredue、spark、flink等分布式计算框架的机器学习算法库
OOZIE/AZKABAN:工作流调度平台
SQOOP:数据导入导出工具
FLUME:分布式日志采集框架
spark
storm

hadoop单机版的安装:

参考官网

运行实例:
mkdir input
cp $HADOOP_HOME/etc/hadoop/*.xml ./input
hadoop jar hadoop-mapreduce-examples-2.7.1.jar wordcount /root/input /root/output/00

2、pi
hadoop jar hadoop-mapreduce-examples-2.7.1.jar pi 5 5
3\九宫格
hadoop jar hadoop-mapreduce-examples-2.7.1.jar sudoku /sudoku/sudo.txt

SecondarySort  二次排序
hadoop jar hadoop-mapreduce-examples-2.7.1.jar secondarysort /root/input/ /root/output/out13

hadoop集群的安装步骤

1542762991153


jdk
修改hosts文件
ssh免密
防火墙关闭

hdfs集群的配置:
3、创建hadoop用户(sudo权限)
4、tar -zxvf 
mv 
vi /etc/profile

5、vi etc/hadoop/hadoop-env.sh
export JAVA_HOME=
6、配置hadoop集群的核心配置文件
vi etc/hadoop/core-site.xml
<configuration>
	<!--hdfs集群对外服务的端口-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://gp181602:9000</value>
    </property>
	
	<!--配置读写缓存的大小-->
	<property>
        <name>io.file.buffer.size</name>
        <value>4096</value>
    </property>
	
	<!--配置集群运行时的临时文件的存储路径-->
	<property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoopdata/tmp</value>
    </property>
</configuration>

7、配置hdfs的配置文件
vi etc/hadoop/hdfs-site.xml
<!--配置hdfs的副本数量-->
<property>
<name>dfs.replication</name>
<value>5</value>
</property>

<!--指定hdfs的块大小-->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>

<!--指定hdfs的namenode的元数据的存储路径-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoopdata/dfs/name</value>
</property>

<!--指定hdfs的datanode的数据的存储路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoopdata/dfs/data</value>
</property>

<!--文件系统检测目录-->
<property>
	<name>fs.checkpoint.dir</name>
	<value>file:///usr/local/hadoopdata/checkpoint/dfs/cname</value>
</property>

<!--edits的检测路径-->
<property>
	<name>fs.checkpoint.edits.dir</name>
	<value>file:///usr/local/hadoopdata/checkpoint/dfs/cname</value>
</property>

<!--配置namenode的web ui的监控地址-->
<property>
   <name>dfs.http.address</name>
   <value>gp181602:50070</value>
</property>

<!--配置secondary namenode的web ui的监控地址-->
<property>
   <name>dfs.secondary.http.address</name>
   <value>gp181602:50090</value>
</property>

<!--开始web hdfs api的开关-->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

<!--是否开启系统权限-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

8、配置小弟文件slaves
vi etc/hadoop/slaves

8、分发程序
scp -r hadoop-2.7.1 root@gp181603:$PWD
scp -r hadoop-2.7.1 root@gp181604:$PWD

9、格式化namnode
hdfs namenode -format

10、启动hdfs
start-dfs.sh
stop-dfs.sh

NamdNode启动过程

1、Name启动的时候首先将fsimage(镜像)载入内存,并执行(replay)编辑日志editlog的的各项操作;
2、一旦在内存中建立文件系统元数据映射,则创建一个新的fsimage文件(这个过程不需SecondaryNameNode) 和一个空的editlog;
3、在安全模式下,各个datanode会向namenode发送块列表的最新情况;
4、此刻 namenode 运行在安全模式。即NameNode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败);
 5、NameNode开始监听RPC和HTTP请求
	 解释RPC:RPC(Remote Procedure Call Protocol)——远程过程通过协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;
6、系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中;
7、在系统的正常操作期间,namenode会在内存中保留所有块信息的映射信息。

YARN

ResourceManager(RM):主要接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。
NodeManager:主要是节点上的资源管理,启动Container运行task计算,上报资源、container情况给RM和任务处理情况给AM。
ApplicationMaster:主要是单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launch Container指令,接收NM的task处理状态信息。

下面简单介绍一下提交一个job的处理过程,
1、client submit一个job到RM,进入RM中的Scheduler队列供调度
2、RM根据NM汇报的资源情况(NM会定时汇报资源和container使用情况),请求一个合适的NM launch container,以启动运行AM
3、AM启动后,注册到RM上,以使client可以查到AM的信息,便于client直接和AM通信
4、AM启动后,根据Job 相关的split的task情况,会和RM协商申请container资源
5、RM分配给AM container资源后,根据container的信息,向对应的NM 请求launch container
6、NM启动container运行task,运行过程中向AM汇报进度状态信息,类似于MRv1中 task的汇报;同时NM也会定时的向RM汇报container的使用情况。
7、在application(job)执行过程中,client可以和AM通信,获取application相关的进度和状态信息。
8、在application(job)完成后,AM通知RM clear自己的相关信息,并关闭,释放自己占用的container。

YAERN架构图

Hadoop全分布式安装

修改hadoop-env.sh文件
    将hadoop-env.sh文件中的
    export JAVA_HOME=${JAVA_HOME}
    export JAVA_HOME="/home/bigdata/jdk"

修改core-site.xml文件
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:8020</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/bigdata/tmp</value>
    </property>

修改hdfs-site.xml文件
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    <property>
    <name>dfs.block.size</name>
    <value>134217728</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///home/hadoopdata/dfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///home/hadoopdata/dfs/data</value>
    </property>
    <property>
        <name>fs.checkpoint.dir</name>
        <value>file:///home/hadoopdata/checkpoint/dfs/cname</value>
    </property>
    <property>
        <name>fs.checkpoint.edits.dir</name>
        <value>file:///home/hadoopdata/checkpoint/dfs/cname</value>
    </property>
    <property>
       <name>dfs.http.address</name>
       <value>master:50070</value>
    </property>
    <property>
       <name>dfs.secondary.http.address</name>
       <value>slave1:50090</value>
    </property>
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>

修改mapred-site.xml文件
命令如下:
    # mv mapred-site.xml.template mapred-site.xml
    #vi mapred-site.xml
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <final>true</final>
    </property>
    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master:10020</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master:19888</value>
    </property>

修改yarn-site.xml
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master </value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.address</name>
    <value>master:8032</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>master:8030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>master:8031</value>
    </property>
    <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>master:8033</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>master:8088</value>
    </property>

#vi etc/hadoop/slaves
将所有需要配置成slave类型的机器的机器名写在其内部即可.
注意:每个机器名占一行。
    master
    slave1
    slave2

#vi /etc/hadoop/master
    Master文件存的是的secondarynamenode列表
    slave1

//将配置好的jdk文件夹和Hadoop文件夹发送给slave1和slave2机子
    # scp -r jdk/ slave1:/home/bigdata/jdk
    # scp -r jdk/ slave2:/home/bigdata/jdk
    # scp -r /home/bigdata/hadoop slave1:/home/bigdata/
    # scp -r /home/bigdata/hadoop slave2:/home/bigdata/

//启动Hadoop集群
//启动之前先格式化,只需要一次即可
		#hadoop namenode -format
//启动namenode、datanode、ResourceManager、NodeManager节点
	# start-dfs.sh
	# start-yarn.sh 

配置yarn集群

cp mapred-site.xml
vi mapred-site.xml
<!--指定mapreduce程序的运行框架名称-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>

<!--指定历史作业的内部通信地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>gp181602:10020</value>
</property>

<!--历史作业的web ui通讯地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>gp181602:19888</value>
</property>

vi yarn-site.xml
<!------指定yarn的resourcemanager所在的主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>gp181602</value>
</property>

<!--指定mapreduce使用shuffle过程-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!--指定rm的内部通讯地址-->
<property>
<name>yarn.resourcemanager.address</name>
<value>gp181602:8032</value>
</property>

<!--指定rm的调度器的内部通讯地址-->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>gp181602:8030</value>
</property>

<!--指定rm的资源调度的内部通讯地址-->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>gp181602:8031</value>
</property>

<!--指定rm的管理员的内部通讯地址-->
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>gp181602:8033</value>
</property>

<!--指定rm的web ui的通讯地址-->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>gp181602:8088</value>
</property>

hdfs的shell命令

Hadoop fs -ls /		# hdfs dfs -ls 
copyFromLocal		# put		拷贝文件到	

format的格式

%b:打印文件大小
%n:打印文件名
%o:打印block size的大小
%r:打印备份数
%y:打印UTC日期 yyyy-MM-dd HH:mm:ss
%Y:打印自1970-1-1以来的UTC的微秒数
%F:目录打印directory,如果是文件,regular file


不使用format时,默认返回的是 使用%y时的值

test:
测试检查目录或者而文件是否存在

distcp:
HDFS数据迁移解决方案,利用distcp在hdfs之间传送数据

回收站

hadoop回收站trash:
hadoop的回收站默认是关闭的,建议最好是打开,否则如果出现误操作,就将丢失数据
修改core-site.xml文件
加入以下的配置项:
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>

删除文件


expunge:
清空回收站

集群时间同步的方法

1、date -s 
hwclock -w
2、配置时间服务器
检查ntpd服务是否已安装
rpm -qa | grep ntp
service ntpd status 
which ntpd

安装:
yum -y install ntp.x86_64

配置时间服务器
vi /etc/ntp.conf
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.137.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0


安装ntp的客户端
yum -y install ntpdate.x86_64

时间一分钟同步一次
crontab -e
*/1 * * * * /usr/sbin/ntpdate gp181602 >> /dev/null

设置时间服务器开机自启
chkconfig ntpd on

namenode 的安全模式修复问题:


1、暴力解决。从新格式化整个hdfs系统。hdfs namenode -format
注意点:
需要先将设置的数据存储目录删除,在初始化namenode
2、将其控制安全模式的阈值调小:
<property>
  <name>dfs.namenode.safemode.threshold-pct</name>
  <value>0.999f</value>
  <description>
    Specifies the percentage of blocks that should satisfy 
    the minimal replication requirement defined by dfs.namenode.replication.min.
    Values less than or equal to 0 mean not to wait for any particular
    percentage of blocks before exiting safemode.
    Values greater than 1 will make safe mode permanent.
  </description>
</property>

3、手动退出安全模式:
hdfs的管理员可以操作的命令:
hdfs dfsadmin -

hdfs dfsadmin -safemode enter  手动进入安全模式
hdfs dfsadmin -safemode leave  强制离开安全模式


hdfs fsck  / -delete
静态增删节点
1、先停止集群
2、slaves里加入需要增加的节点
3、将hadoop的安装包分发到新增加的节点上
4、start-dfs.sh

2、不停止集群
1、slaves里加入需要增加的节点
2、将hadoop的安装包分发到新增加的节点上
4、在需要新增的节点上单机启动datanode
hadoop-daemon.sh start datanode

yarn集群节点的单击启动命令
yarn-daemon.sh start nodemanager
动态删节点

增加:
slaves:
<property>
  <name>dfs.hosts</name>
  <value></value>
  <description>Names a file that contains a list of hosts that are
  permitted to connect to the namenode. The full pathname of the file
  must be specified.  If the value is empty, all hosts are
  permitted.</description>
</property>

删除:
<property>
  <name>dfs.hosts.exclude</name>
  <value></value>
  <description>Names a file that contains a list of hosts that are
  not permitted to connect to the namenode.  The full pathname of the
  file must be specified.  If the value is empty, no hosts are
  excluded.</description>
</property> 

hdfs dfsadmin -refreshNodes

sbin/start-balancer.sh 增删节点后可以进行数据块负载均衡(谨慎使用)

maven

maven的查找网址:
https://mvnrepository.com/

解决权限问题

1、设置java的运行参数
设置VM-options:
-DHADOOP_USER_NAME=root

2、在代码中设置系统环境变量
System.setProperty("HADOOP_USER_NAME","root");

3、在获取文件系统客户端时直接传入用户参数
FileSystem fs = FileSystem.get(new URI("hdfs://gp181602:9000"),conf,"root");

查看日志文件的命令:

http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsEditsViewer.html

datanode的超时时限:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

hdfs

特性

- 分块存储,块的大小可以通过配置参数规定,默认大小Hadoop2x中是128M,老版本是64M
- 文件系统会给客户提供一个统一的抽象目录数,客户端通过路径访问文件
- 目录结构及分块信息的管理由namenode节点承担————namenode是HDFS集群主节点,赋值维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息
- 文件的各个block的存储管理由datanode节点承担————datanode是HDFS集群从节点,每一个blck都可以在多个datanode上存储多个副本
- HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改

1、HDFS集群分为两大角色:Name Node、Data Node
2、NameNode ---------------------------元数据
负责客户端请求的响应
元数据的管理(查询,修改)
管理datanode的状态

3、DataNode ---------------------------数据块
4、文件会按照固定大小切成若干块后分布式存储在若干datanode上
5、每一个文件块可以有多个副本,并存放在不同的datanode上
6、Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
7、HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过想namenode申请进行

HDFS写数据流程

在这里插入图片描述

1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。
核心问题
传输的过程中如果node3挂了怎么处理?如果node3又启动了,怎么处理?
	1>不处理 等到发送报告时再加一台机器		2>在下一次报告时删除
如果在建立连接通道的时候,node挂了,怎么处理?
	1>会连接4次(4次连不上)客户端会重新申请机器
传输过程中,某一个包出错了,怎么处理?
	包重传,重传的次数有限,如果一直失败,则可以判断本次传世失败
如果blk1、blk2都传输成功了,单数blk3传输失败,怎么办?
传输的过程中node1挂了怎么办?
	namenode会标记该文件为无效状态,下次datanode向namenode发送报告时删除	1、2、3
HDFS读数据流程

在这里插入图片描述

1、跟namenode通信查询元数据,找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
4、客户端以packet为单位接收,先在本地缓存,然后写入目标文件
NAMENODE工作机制

在这里插入图片描述

问题
Namenode服务器的磁盘故障导致namenode宕机,如何挽救集群及数据?
	使用好几个镜像备份
Namenode是否可以有多个?namenode内存要配置多大?namenode跟集群数据存储能力有关系吗?
	活跃的只能有一个,内存按块来订,有关系
文件的blocksize究竟调大好还是调小好?
	根据实际情况订

namenode元数据

手动查看

可以通过hdfs的一个工具来查看edits中的信息
bin/hdfs oev -i edits -o edits.xml
bin/hdfs oiv -i fsimage_0000000000000000087 -p XML -o fsimage.xml

元数据的checkpoint

每隔一段时间,会由secondary namenode将namenode上积累的所有edits(日志)和一个最新的fsimage(镜像)下载到本地,并加载到内存进行merge(整合)(这个过程称为checkpoint)

checkpoint的详细过程

配置
dfs.namenode.checkpoint.check.period=60  #检查触发条件是否满足的频率,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
#以上两个参数做checkpoint操作时,secondary namenode的本地工作目录
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}

dfs.namenode.checkpoint.max-retries=3  #最大重试次数
dfs.namenode.checkpoint.period=3600  #两次checkpoint之间的时间间隔3600秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

datanode

存储管理用户的文件块数据
定期向namenode汇报自身所持有的block信息(通过心跳信息上报)
(这点很重要,因为,当集群中发生某些block副本失效时,集群如何恢复block初始副本数量的问题)
<property>
	<name>dfs.blockreport.intervalMsec</name>
	<value>3600000</value>
	<description>Determines block reporting interval in milliseconds.</description>
</property>

当datanode超时则判断死亡,超时计算公式: timeout =2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval (而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。 )

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。所以,举个例子,如果heartbeat.recheck.interval设置为5000(毫秒),dfs.heartbeat.interval设置为3(秒,默认),则总的超时时间为40秒
<property>
        <name>heartbeat.recheck.interval</name>
        <value>2000</value>   ## 单位毫秒
</property>
<property>
        <name>dfs.heartbeat.interval</name>
        <value>1</value>   ##单位 秒
</property>

shell采集脚本

一般上传文件都是在凌晨24点操作

HDFS SHELL:  hadoop fs  –put   xxxx.tar  /data    还可以使用 Java Api
	 		满足上传一个文件,不能满足定时、周期性传入。
	 定时调度器:
		Linux crontab
		crontab -e
*/5 * * * * $home/bin/command.sh   //五分钟执行一次
系统会自动执行脚本,每5分钟一次,执行时判断文件是否符合上传规则,符合则上传

​ 日志生成的逻辑由业务系统决定,比如在log4j配置文件中配置生成规则,如:当xxxx.log 等于10G时,滚动生成新日志

log4j.logger.msg=info,msg
log4j.appender.msg=cn.maoxiangyi.MyRollingFileAppender
log4j.appender.msg.layout=org.apache.log4j.PatternLayout
log4j.appender.msg.layout.ConversionPattern=%m%n
log4j.appender.msg.datePattern='.'yyyy-MM-dd
log4j.appender.msg.Threshold=info
log4j.appender.msg.append=true
log4j.appender.msg.encoding=UTF-8
log4j.appender.msg.MaxBackupIndex=100
log4j.appender.msg.MaxFileSize=10GB
log4j.appender.msg.File=/home/hadoop/logs/log/access.log

使用ls命令读取指定路径下的所有文件信息,
ls | while read line
//判断line这个文件名称是否符合规则
if line=access.log.* (
将文件移动到待上传的工作区间
)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值