hadoop面试题和资料详解:
hadoop的背景?
apache发行版本大致:1.x 和 2.x 和 3.x
提公司:
apache : 原生
cloudar公司 : cdh
hortworks公司提供 : hdp
mapR
华为
星环
海量数据诞生、同时没有海量数据的存储、和处理
goole:GFS、mapreduce、bigtable
hadoop创始人Doug cutting:
hadoop起源,
起源思想:google
起源代码:luence ---> nutch(mapreduce、ndfs) ---> hadoop
hadoop的核心思想:
hadoop1.x 和 2.x 、 3.x的区别?
1.x和2.x最大的区别是,2.x将资源管理单独提取出来使用yarn模块来管理。
namenode角色能启动的个数:
块大小:
大数据的应用:
hadoop到底是一个什么?
The Apache? Hadoop? project develops open-source software for reliable, scalable, distributed computing.
open-source:
reliable:
scalable:
distributed computing:
hadoop框架允许使用简单模型来分布式处理集群中海量数据集
hadoop框架设计从单台服务器扩展成千上万台服务器,每一个都能提供本地的存储和计算。
hadoop框架设计本身就可以检测和处理应用层的失败(容错),而不是依赖硬件,因为集群中每一个都有可能失败。
hadoop包括四个模块:
common : 通用工具类支持其他hadoop的模块
hdfs (hadoop distribut file system): hadoop分布式文件系统,提供高吞吐来处理应用数据
yarn : 作业调度和资源管理的框架
mapredcue : 基于yarn来并行处理海量数据集的系统
Local (Standalone) Mode:单机版
Pseudo-Distributed Mode:伪分布式
Fully-Distributed Mode:全分布式
单机版的安装:运行在单个jvm中,经常用于debug
安装步骤:
下载hadoop二进制包
解压并配置hadoop的环境变量
配置hadoop的配置文件:etc/hadoop/hadoop-env.sh
测试
tar -zxvf /home/hadoop-2.9.1.tar.gz -C /usr/local/ : 解压到/usr/local目录
hadoop安装目录介绍:
bin : 操作hdfs和mapreduce的可执行命令
sbin : 启停hadoop相关服务的可执行命令
etc : hadoop相关配置文件目录
lib、libexec :相管扩展或者扩展库
share : 源码、文档和测试案例等。
vi /etc/profile 配置hadoop的环境变量
export HADOOP_HOME=/usr/local/hadoop-2.9.1/
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
source /etc/profile : 是配置生效
vi ./etc/hadoop/hadoop-env.sh 告诉hadoop的jdk目录
export JAVA_HOME=/usr/local/jdk1.8.0_152/
测试:
hdfs dfs -ls /
yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /home/words /home/out/00
words是已存在的文件 后面/home/out/00是自己创建的
执行第二个作业:
mkdir /home/input
cp ./etc/hadoop/*.xml /home/input/
yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /home/words /home/out/00
三大核心:
hdfs的设计目标??
hdfs的优缺点??
hdfs的三个服务:
hdfs的架构成主从架构master/slave.
namenode(master):接收来自client端的i/o请求;记录操作元素据;获取来自小弟的汇报信息(心跳、块报告等);
datenode(slaves): clinet请求小弟真正读写数据内容;接受老大命令读写数据;
secondarynamenode(小秘): 协同老大管理元数据(合并元数据)
metastore: 元数据。描述hdfs块数据的数据的数据(块的地址、块id、块大小、块的创建人、创建时间等);
client : 客户端(发送读写数据请求)
hdfs的工作机制:
clinet请求namenode,然后namenode处理请求,返回信息;如果信息中有地址列表,客户端就需要和对应的地址上的datanode服务进行沟通。
机架:
数据块:文件局部或者全部数据内容。文件以块的形式进行存储,块又以文件的形式存储到磁盘。
1.x : 64M
2.x : 128M
3.x : 256M
默认每一个块3个副本,默认最小的副本数是1个。
多个副本不能同时存储在一台服务器中。理由如下:
如果存储到一台服务器中,多个副本路径将会重复,
降低服务器坏丢所有块。
副本数是小于等于datanode服务数量的。
hdfs中的写流程:
伪分布式:将所有的服务运行在一台节点上,就称之为伪分布式。伪分布式模型中,每一个服务使用一个jvm。
1、解压并配置环境变量
tar -zxvf /home/hadoop-2.9.1.tar.gz -C /usr/local/
vi /etc/profile
export HADOOP_HOME=/usr/local/hadoop-2.9.1/
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
source /etc/profile : 是环境变量生效
hadoop version : 检测hadoop版本信息
2、配置配置文件
etc/hadoop/hadoop-env.sh :指定JAVA_HOME的路径
etc/hadoop/core-site.xml : 配置核心配置文件
/*下面的hadoop01是自己的主机名,修改的话/etc/sysconfig/network */
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
etc/hadoop/hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
etc/hadoop/slaves
hadoop01 #主机名
到此,hdfs的伪分布式配置完毕。
hdfs namenode -format : 格式化hdfs文件系统
/tmp/hadoop-root/dfs/name has been successfully formatted
ll /tmp/hadoop-root/dfs/name : 元数据存储目录
start-dfs.sh : 启动hdfs相关的进程(服务)
测试:
jsp 检测进程是否符合
http://hadoop01:50070 : 检测hdfs web监控 //需要在自己电脑下的C:\Windows\System32\drivers\etc的hosts下添加hadoop01 以及对应的ip地址
对hdfs文件系统进行读写: 能正常读写浏览则ok
hdfs dfs -ls / : 查看hdfs文件系统中的根目录
hdfs dfs -put /home/words / :上传/home/words 到hdfs中的根目录
hdfs dfs -cat /words :读hdfs中/words文件
服务启动不起来,查看对应的日志。hadoop-root-datanode-hadoop01.log
访问不到50070,检测防火墙,检测映射,检测namenode是否启动。
操作hdfs中的文件不行,connection异常,优先检测防火墙
ssh 免登陆流程:
hadoop01 ---> hadoop02
1、在hadoop01上生成公司密钥对().
ssh-keygen -t rsa
2、将hadoop01的公钥拷贝到想免登陆的服务器中(hadoop02).
ssh-copy-id hadoop02
3、hadoop01给hadoop02发出请求信息,hadoop02接到去authorithd_keys找对应的ip和用户名,
能找到则用其对应公钥加密一个随机字符串(找不到则输入密码),然后将加密的随机字符串返回给hadoop01,hadoop01
接到加密后的字符然后用自己的私钥解密,然后再发给HAdoop02,hadoop02判断和加密之前的是否一样,
一样则通过登录,不一样则拒绝。
4、如果window中用私钥登录。需要从登录服务器中拉去对应用户的私钥(服务器中用户的家目录下的.ssh下的id_rsa)
放到windon中的某个目录,然后使用xshell进行私钥登录。
启动命令:
start-all.sh : 全启动(启动hdfs和yarn的模块的所有服务)
stop-all.sh : 全停止(停止hdfs和yarn的模块的所有服务)
模块启动:
start-dfs.sh : hdfs的模块启动
stop-dfs.sh : hdfs的模块停止
start-yarn.sh : yarn的模块启动
stop-yarn.sh : yarn的模块停止
单个启动:
hadoop-daemon.sh start/stop namenode :启动单个namenode
hadoop-daemons.sh start/stop namenode :启动多个namenode
hadoop-daemon.sh start/stop datanode :启动单个datanode
hadoop-daemons.sh start/stop datanode :启动多个datanode
hadoop-daemon.sh start/stop secondarynamenode :启动单个secondarynamenode
hadoop-daemons.sh start/stop secondarynamenode :启动多个secondarynamenode
yarn-daemon.sh start/stop resourcemanager
自动化脚本?测试
全分布式搭建
hdfs和yarn的架构官方文档阅读?
hdfs的shell命令使用?
hadoop的核心模块之一hdfs??
全分布式配置:
全分布式:将某些服务分别启动在多台服务器中,可以用于生产。
步骤:
规划集群:
192.168.216.111 hadoop01 namenode,datanode,nodemanager
192.168.216.112 hadoop02 datanode,resourcemamnager,nodemanager,secondarynamenode
192.168.216.113 hadoop03 datanode,nodemanager,jobhistroyserver
准备工作:
需要安装集群的服务器必须安装jdk
需要安装ssh,并且需要做好ssh免登陆(老大需要免登陆小弟)
hadoop01 hadoop01,hadoop02,hadoop03
hadoop02 hadoop01,hadoop02,hadoop03
解压配置环境变量
配置配置文件
vi ./etc/hadoop/hadoop-env.sh
hadoop-env.sh.note
vi ./etc/hadoop/core-site.xml
core-site.xml.note
vi ./etc/hadoop/hdfs-site.xml
hdfs-site.xml.note
vi ./etc/hadoop/slaves
添加三台主机名
mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
template是模版 给他重命名
vi ./etc/hadoop/mapred-site.xml
mapred-site.xml.note
vi ./etc/hadoop/yarn-site.xml
yarn-site.xml.note
发送配置好的hadoop到每一台服务器中:
scp -r ../hadoop-2.9.1/ hadoop02:/usr/local/
scp -r ../hadoop-2.9.1/ root@hadoop02:/usr/local/
hdfs的格式化:
在namenode的服务器上执行格式化命令:
hdfs namenode -format
启动服务测试:
start-all.sh
mr-jobhistory-daemon.sh start historyserver(3号机)
start-yarn.sh(2号机)
检查是否按照规划启动进程(如没有可以尝试当个启动)
查看web:
http://hadoop01:50070 namenode的web
http://hadoop02:50090 secondarynamenode的web
http://hadoop02:8088 resourcemanager的web
http://hadoop03:19888 jobhistroyserver的web
hdfs的读写数据:
hdfs dfs -put /home/words /
hdfs dfs -put /home/words hdfs://hadoop01:9000/
hdfs dfs -cat hdfs://hadoop01:9000/words
yarn的job的测试:
yarn jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar wordcount /words /out/00