分类 Hadoop 下的文章

一致性hash在分布式系统中的应用

场景

如果要设计一套KV存储的系统,用户PUT一个key和value,存储到系统中,并且提供用户根据key来GET对应的value。要求随着用户规模变大,系统是可以水平扩展的,主要要解决以下几个问题。

  1. 系统是一个集群,包含很多节点,如何解决用户数据的存储问题?保证用户的数据尽可能平均分散到各个节点上。
  2. 如果用户量增长,需要对集群进行扩容,扩容完成后如何解决数据重新分布?保证不会出现热点数据节点。

- 阅读剩余部分 -

Hadoop HDFS Quota配置

hadoop HDFS有以下两种Quota

Name Quotas : 限制某个目录下的文件数量
Space Quotas : 设置某个目录的空间大小

$hadoop fs -count -q /user/hadoop
QUOTA       REMAINING_QUOTA  SPACE_QUOTA  REMAINING_SPACE_QUOTA  DIR_COUNT   FILE_COUNT CONTENT_SIZE FILE_NAME
none        inf               none        inf           		  2            1          180         /user/hadoop

- 阅读剩余部分 -

Hadoop HDFS 心跳时间

datenode以固定周期向namenode发送心跳,namenode如果在一段时间内没有收到心跳,就会标记datenode为宕机。 此段时间的计算公式是:

timeout  = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

默认 heartbeat.recheck.interval 是5分钟,dfs.heartbeat.interval是3秒,所以DN挂了后,NN要确定DN为DEAR需要10min30s,也就是630S自动标识为dead。

<property>
<name>dfs.heartbeat.interval</name>
<value>3</value> 
<description>Determines datanode heartbeat interval in seconds.</description> 
</property>

<property>
<name>dfs.heartbeat.recheck.interval</name>
<value>20000</value>
<description>Determines when machines are marked dead 单位:毫秒!!!</description> 
</property>

- 阅读剩余部分 -

Hadoop Volume 配置

volume的配置就是在 hdfs-site.xml 下

<property>
    <name>dfs.datanode.data.dir</name>
    <value>/sda1,/sda/disk1</value>
</property>

我今早是新加了一个volume,就是(所有机器都是)

drwx------ 4 hadoop hadoop  4096 Apr  2 13:33 /sda1
drwx------ 4 admin admin  4096 Apr  2 13:33 /sda/disk1

- 阅读剩余部分 -

Hadoop slaves文件解析

slaves文件里面记录的是集群里所有DataNode的主机名,到底它是怎么作用的呢?slaves文件只作用在NameNode上面,比如我在slaves里面配置了

host1
host2
host3 

三台机器,这时候如果突然间新增了一台机器,比如是host4,会发现在NN上host4也自动加入到集群里面了,HDFS的磁盘容量上来了,这下子不是出问题了?假如host4不是集群的机器,是别人的机器,然后配置的时候指向了NN,这时候NN没有做判断岂不是把数据也有可能写到host4上面?这对数据安全性影响很大。所以可以在hdfs-site.xml里面加限制。

<property>
    <name>dfs.hosts</name>
    <value>/home/hadoop-2.0.0-cdh4.5.0/etc/hadoop/slaves</value>
</property> 

这相当于是一份对于DN的白名单,只有在白名单里面的主机才能被NN识别。配置了这个之后,就能排除阿猫阿狗的DN了。其实slaves文件里不一定要写主机名,最终的都是通过IP来判断,完全可以写一个IP就行。 我还尝试了配置了上面的dfs.hosts项之后,然后在slaves删除一个节点,然后 $ hadoop-daemon.sh stop namenode $ hadoop-daemon.sh start namenode 这时候NN就拒绝了那个被删除了的DN数据,而NN会自动把DN上丢失的数据重新备份,通过其他的备份来copy,这里是很智能的过程。

Ganglia监控Hadoop

$ vim hadoop-metrics2.properties

#*.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink
# default sampling period, in seconds
#*.period=10

*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31  
*.sink.ganglia.period=10  
  
*.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both  
*.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40  
  
namenode.sink.ganglia.servers=hadoop_master_ip:8649  
resourcemanager.sink.ganglia.servers=hadoop_master_ip:8649  
  
datanode.sink.ganglia.servers=hadoop_master_ip:8649    
nodemanager.sink.ganglia.servers=hadoop_master_ip:8649    

maptask.sink.ganglia.servers=hadoop_master_ip:8649    
reducetask.sink.ganglia.servers=hadoop_master_ip:8649 

然后分发配置文件,接可以ganglia监控HDFS等基本情况
ganglia2hadoop

Hadoop invalid shuffle port number

Hadoop2,yarn-site.xml 配置过程中,yarn.nodemanager.aux-services这一项值配置的时候配得不对,结果每次在reducer的时候就挂了,提示错误都是"ContainerLauncherImpl"失败,提示:

* java.lang.IllegalStateException: Invalid shuffle port number -1 returned fo
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

Hadoop HDFS和MapReduce测试

Hadoop的MapReduce应该是属于核心的编程框架,到目前为止我还不是特别懂,只能按照网上的步骤一点实践,就和学一门新语言第一个程序是HelloWorld一样。前文已经介绍了Hadoop的安装,这里就HDFS和MapReduce的测试。

HDFS测试


在HDFS中新建一个文件夹,并把本地文件copy到HDFS新建的文件夹
cd hadoop路径
bin/hadoop dfs -mkdir /tmp/firefoxbug
bin/hadoop dfs -put /opt/run.log /tmp/firefoxbug
bin/hadoop dfs -ls /tmp/firefoxbug

- 阅读剩余部分 -

Hadoop安装

听了这么久的Hadoop,终于要开始玩了,好幸福的说。不水了,Hadoop到底能怎么用我还没研究,只是安装了下。这里大概介绍下Hadoop,它是一组项目,在下面有好多个开源的牛逼组件。HDFS是下面的一个分布式存储项目,主要是文件存储,它设计就是来存储大文件,整个HDFS就是一套文件系统,但是它的Block特别大,默认是64M,HDFS会有自己的Backup。HDFS主要分成两部分,一部分是管理中心,叫做NameData,这类似linux文件系统的super blocks,用来管理所有的DataNode,DataNode就是真正用来存储实际的数据内容的。而NameData会管理好文件的索引,存储,还有backup。

- 阅读剩余部分 -