启动hadoop
start-all.sh 相当于 start-dfs.sh 和 start-yarn.sh。
start-dfs.sh: 主要是启动NameNode进程和DataNode进程。
start-yarn.sh: 启动ResourceManager进程和NodeManager进程。可用命令jps查看是否启动成功。
注:第一次运行hadoop之前需要执行hadoop namenode -format,之后不需要再执行这个动作,否则会丢失原有hdfs上的数据。
名词概念
metadata在集群启动的时候加载到内存,各个DataNode上报节点信息。
DataNode:数据节点。存储文件内容,保存在各个磁盘中,一个集群中可以有多个DataNode。
SecondaryNameNode:hadoop1中的名词。主要做部分NameNode的备份。把NameNode中fsimage和edits拷贝,并合并。将合并后的fsimage返回给NameNode。由于合并的时候NameNode还是在工作,所以只能做部分的备份,不是热备。NameNode宕机的时候会丢失一部分数据,原因是edits在内存中。
fsimage:元数据镜像文件(文件系统的目录树。)
edits:元数据的操作日志(针对文件系统做的修改操作记录)
HDFS优缺点
优点:高容错性,每个block默认三个副本。适合批处理数据,并且集群构建在廉价的机器上。
缺点:低延迟的数据访问不强,对于大量的小文件的存取不适合(存在大量小文件的时候NameNode需要管理每个文件的信息,占用NameNode大量的内存,有可能发生内存泄露),并发读写不强,文件无法随机修改。
HDFS机制
数据复制(冗余机制),机架感知,故障检测:心跳,块报告等。
部分配置文件(基于单机伪分布式)
core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.222.100:9000</value>
<final>true</final>
</property>
<property>
hadoop-env.sh 配置java环境变量
hdfs-site.xml NameNode和DataNode的信息
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/ob/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/ob/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
注:org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/user":ob:supergroup:drwxr-xr-x
解决方法是,在conf/hdfs-site.xml中设置dfs.permissions的值为false。
slaves: 从节点地址 单机为localhost
yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>shuffle service that needs to be set for Map Reduce to run</description>
</property>
<property>
<name>
yarn.resourcenamager.hostname
</name>
<value>
192.168.222.100
</value>
<description>hostname of Resource Manager
</description>
</property>
Hadoop2中的HA
添加了Standby NameNode来和Active NameNode保持一致,通过JournalNode守护进程进行通信,运行在zookeeper之上。DataNode上报信息的时候同时上报给Active NameNode和StandBy NameNode,但是只有在Active NameNode不工作的时候,StandBy NameNode节点才回接手。StandBy NameNode是Active NameNode的热备。
HDFS文件系统
访问hdfs文件系统:hadoop fs -ls /
上传文件到hdfs:hadoop fs -put 本地文件路径 hdfs文件路径(/)
删除文件:hadoop fs -rmr 路径
...
打包到hadoop中运行:hadoop jar ***.jar ***.java
端口
namenode的webUI端口:50070
yarn的web端口:8088
序列化和反序列化
序列化是指将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过程。
反序列化指的是将字节流转为结构化对象的过程。 在
为了能够读取或者存储 Java 对象, MapReduce 编程模型要求用户输入和输出数据中的
MapReduce工作流程
在map端工作的时候,可以设置分区规则,排序规则,如何map等。先是作用于每个partition。partition中是map好的数据。
Reduce端从每个分区fetch数据,从map到reduce一般会经过shuffle。流程中默认的Reduce的个数为1,可以自定义Reduce的个数。Reduce根据自定义的排序规则或者默认的排序规则将取到的数据排序,并且根据分区规则分区。分区规则一般是molpartition的个数取hash。
job.setSortComparatorClass(TextIntComparator.class);定义map端的排序规则 ,同时也作用于reduce端。
job.setGroupingComparatorClass(TextComparator.class);定义reduce端的排序规则 。对key相同的value进行定义排序规则。
job.setCombinerClass()作用于map和reduce之间。减少map的输出,减轻带宽的压力。比如计数,可以先在map端执行计数,shuffle到reduce端的数据量就变少了。
当提交一个app到集群中的时候,客户端首先请求NameNode节点,NameNode节点返回其他节点的信息给客户端,然后客户端再与DataNode节点交互,这个时候和NameNode无关。
Reduce端
如果进入一个reduce的key是排好序的:
如果连续的两个<key,value>满足分组条件,即使他们的key不相同,但是他们还是会进入同一个value,而这个value的key将是最后一个满足该同组条件的key。
相反,就算他们的key相同,但是不符合分组条件,他们的value也不会进入一个reduce。
Reduce端遍历Iterable的时候注意点:
1.不能重复遍历。
2.虽然reduce方法会执行多次,但是key和value相关的对象只有一个,reduce会重用这两个对象。所以如果要保存key或者value的结果,需要将取到的对象保存起来,例如:Text t = new Text(value) 或者 String val = value.toString();String对象不可变,final。Text需要重新new一个。如果不保存直接使用的话,那么他的引用始终指向最后一个对象。得到错误的结果。
数据倾斜
重新定义分区规则(...)
可能遇到的问题
DataNode节点没启动:需要配置DataNode节点VERSION下的clusterID和NameNode下的clustID一致,不一致的原因之一是多次format。
其他用户启动hadoop集群:需要修改某些文件的权限,忘记是哪个了。
未完,想到再补充。