404频道

学习笔记

Linux系统中提供了两个在堆中分配空间的底层函数,函数原型如下:

void *sbrk(intptr_t increment);
int brk(void *end_data_segment);

两个函数的作用均为从堆中分配空间,并且在内部维护一个指针,指针的值默认为NULL。如果内部指针为NULL,则得到一页的空闲地址,系统默认为4K字节。指针向后移动即为分配空间,指针向前移动为释放空间。当内部指针的位置移动到一个页的开始位置时,整个页会被操作系统回收。brk为绝对改变位置,sbrk为相对改变位置。

sbrk函数

在sbrk函数中,参数increment为要增加的字节数,increment可以为负数。当increment为负数时表示释放空间。当increment==0时,内部指针位置不动。函数调用成功返回内部指针改变前的值,失败返回(void *)-1。
函数使用举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <unistd.h>

int main()
{
int *p0 = sbrk(0);
// 打印堆地址
printf("this site of p0 is : %d\n", p0);

int *p1 = sbrk(1000);
// 这里仍然打印的是第一次的堆地址
printf("this site of p1 is : %d\n", p1);

int *p2 = sbrk(1);
// 打印第一次堆地址+1000后的地址
printf("this site of p2 is : %d\n", p2);

// 回到初始堆地址,释放空间
sbrk(-1001);

int *p3 = sbrk(0);
// 检查是否回到初始地址
printf("this site of p3 is : %d\n", p3);
}

输出如下内容:
this site of p0 is : 264622080
this site of p1 is : 264622080
this site of p2 is : 264623080
this site of p3 is : 264622080

brk函数

在brk函数中,函数作用为将当前的内部指针移动到end_data_segment位置。成功返回0,失败返回-1。
函数使用举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <unistd.h>

int main()
{
int *p0 = sbrk(0);
printf("this site of p0 is : %d\n", p0);

brk(p0 + 1000);
printf("this site is : %d\n", sbrk(0));

brk(p0 + 1001);
printf("this site is : %d\n", sbrk(0));

brk(p0);
printf("this site is : %d\n", sbrk(0));
}

函数输出如下:
this site of p0 is : 206979072
this site is : 206983072
this site is : 206983076
this site is : 206979072

适用场景:

内存的管理方式比malloc和free更加灵活,适合申请不确定的内存空间的情况,特别适合同类型的大块数据。如果用malloc则可能存在申请内存空间过多浪费的情况,过少时需要重新调用realloc来重新申请内存的情况。速度比malloc快。

前端时间折腾了一段时间的Github博客,终于搞明白了jekyll,开始写了一篇博客发现问题比较多。比如中文编码问题,Github对makedown的支持问题,Github的文章同步问题,网速问题。总体而言,感觉用Github来写博客还不是非常满意。

今天下午偶然想起了前段时间看过faxbox的一篇文章,今天下载下来尝试,果然非常酷。优点如下:

  • 博客放在了Dropbox不会丢失。当然没有Github酷,Github可以通过版本管理来查看历史版本。貌似Dropbox本身有版本管理的功能。
  • 写博客的方式简捷。Github的jekyll还需要利用rake命令来创建文章,这样才能保证文章的头部含有YAML标签。而faxbox直接编辑文本文件即可。
  • 文本编辑器给力。可以通过实时预览功能查看makedown的解析情况,当然也可以通过在线的makedown编辑器stackedit来编写makedown。
  • 网速比Github快。测试一下感觉网速还比较快。
  • 可以修改模板,fork模板的方式简捷更酷。
  • 对中文的支持好。因为本来就是本土化的软件当然对中文全力支持。
  • 代码语法高亮。测试了一下默认的模板支持语法高亮。
  • 自带的模板更漂亮。自带的模版虽然不多,但是有说明是适合博客还是相册。
  • 网站自带网站分析工具。可以通过简单的浏览网页就可以知道网站的访问情况,虽然farbox在访问量达到1W之后要收费,按照目前的价格,但是我个人觉得比较值,希望farbox能够一直坚持做下去。做的好我愿意付费。

缺点:

  • 经过一下午的了解,暂时没有发现博客可以分类的功能,不过这个功能我暂时可以不需要。以后准备先写些博客在Github和Faxbox上同步更新,以便多比较比较这两种Geek的写博客方式。后来发现是有文章分类功能的,具体操作为将文章放入不同的文件夹中,文件夹的名字即为分类的名字,这种方式比jekyll的YAML语法方式要好用。
  • 感觉评论功能有点鸡肋。博客还没写完有事工作,准备续写时发现有人留言指正错误,想回复谢谢,发现无法直接回复。用多说代替之,方法为直接将多说的js脚本存入新建的comment_js.md文件中即可,非常简洁。
  • Linux下的用户不太方便。由于farbox软件仅有windows版和mac版,dropbox在linux有相应版本,在linux下的用户不能享受到farbox编辑工具带来的方便。相反在linux下结合git和vim来编写博客却比较方便。

PS:
Github博客地址:kuring.github.com
Fixbox博客地址:kuring.faxbox.com

本文是在安装完成Hadoop的基础之上进行的,Hadoop的安装戳这里
本文采用的Hadoop版本为0.20.2,HBase版本为0.90.6,ZooKeeper的版本为3.3.2(stable版)。
本文仍然采用了Hadoop安装的环境,机器如下:

机器名 IP地址 用途 Hadoop模块 HBase模块 ZooKeeper模块
server206 192.168.20.6 Master NameNode、JobTracker、SecondaryNameNode HMaster QuorumPeerMain
ap1 192.168.20.36 Slave DataNode、TaskTracker HRegionServer QuorumPeerMain
ap2 192.168.20.38 Slave DataNode、TaskTracker HRegionServer QuorumPeerMain

安装ZooKeeper

由于HBase默认集成了ZooKeeper,可以不用单独安装ZooKeeper。本文采用独立安装ZooKeeper的方式。
1. 将zookeeper解压到/home/hadoop目录下。
2. 将/home/hadoop/zookeeper-3.3.2/conf目录下的zoo_sample.cfg文件拷贝一份,命名为为“zoo.cfg”。
3. 修改zoo.cfg文件,修改后内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/home/hadoop/zookeeper-3.3.2/zookeeper_data
# the port at which the clients will connect
clientPort=2181
dataLogDir=/home/hadoop/zookeeper-3.3.2/logs
server.1=192.168.20.6:2888:3888
server.2=192.168.20.36:2888:3888
server.3=192.168.20.38:2888:3888

其中,2888端口号是zookeeper服务之间通信的端口,而3888是zookeeper与其他应用程序通信的端口。
这里修改了dataDir和dataLogDir的值。
需要特别注意的是:如果要修改dataDir的值不能将原来的行在前面加个“#”注释掉后在后面再增加一行,这样是不起作用的。可以参考bin目录下的zkServer.sh文件中的72行,内容如下:

1
ZOOPIDFILE=$(grep dataDir "$ZOOCFG" | sed -e 's/.*=//')/zookeeper_server.pid

这里通过grep和sed命令来获取dataDir的值,对于行前面添加“#”注释是不起作用的。
4. 创建zoo.cfg文件中的dataDir和dataLogDir所指定的目录。
5. 在dataDir目录下创建文件myid
6. 通过scp命令将zookeeper-3.3.2目录拷贝到其他节点机上。
7. 修改myid文件,在对应的IP的机器上输入对应的编号,该编号要和zoo.cfg中的一致。本例中在192.168.20.6上文件内容为1;在192.168.20.36上文件内容为2;在192.168.20.38上文件内容为3。至此ZooKeeper的安装已经完成。

运行ZooKeeper

1. 在节点机上依次执行/home/hadoop/zookeeper-3.3.2/bin/zkServer.sh start脚本。运行第一个ZooKeeper的时候会因等待其他节点而出现刷屏现象,等启动起第二个节点上的ZooKeeper后就正常了。运行完成之后该脚本会出现刷屏现象,我这里没有理会。
2. 通过jps命令来查看各节点机上是否含有QuorumPeerMain进程。
3. 通过/home/hadoop/zookeeper-3.3.2/bin/zkServer.sh status命令来查看状态。本例中有三个节点机,其中必有一个leader,两个follower存在。
4. 在各节点机上依次执行/home/hadoop/zookeeper-3.3.2/bin/zkServer.sh stop来停止ZooKeeper服务。

配置时间同步ntp服务

HBase在运行的时候各个节点之间时间不同步会存在莫名其妙的问题,这里选择以192.168.20.36机器作为时间同步服务器,其他机器从该机器同步时间。
在192.168.20.36上通过service ntpd start命令来启动ntp服务。
在其他机器上配置crontab命令,增加下面一行:

1
0 */1 * * * /usr/sbin/ntpdate 192.168.20.36 && /sbin/hwclock -w

这里采用一个小时同步一次时间的方式。

安装HBase

1. 在HMaster机器上将HBase解压到/home/hadoop目录下。
2. 修改配置文件hbase-env.sh,使export HBASE_MANAGES_ZK=false。如果想要HBase使用自带的ZooKeeper则使用设置为true。使export JAVA_HOME=/usr/java/jdk1.6.0_10来指定java的安装路径。
3. 修改配置文件hbase-site.xml如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://server206:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>server206,ap1,ap2</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper-3.3.2/zookeeper_data</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>100</value>
</property>
</configuration>

4. 修改regionservers,添加HRegionServer模块所运行机器的主机名。在本例中内容如下:

1
2
ap1
ap2

5. 为了确保HBase和Hadoop的兼容性,这里将/home/hadoop/hadoop-0.20.2/hadoop-0.20.2-core.jar文件复制到/home/hadoop/hbase-0.90.6/lib目录下,并将原先的Hadoop的jar文件删掉或重命名为其他后缀的文件。
6. 将hbase-0.90.6文件夹通过scp命令复制到其他节点机上。

HBase的启动

  1. 在Hadoop的NameNode所在的机器上使用start-all.sh脚本来启动Hadoop集群。
  2. 在各个节点机上调用zkServer.sh脚本来启动ZooKeeper。
  3. 在HMaster所在的机器上使用start-hbase.sh脚本来启动HBase集群。

HBase启动后会在HDFS自动创建/hbase的文件夹,可以通过hadoop fs -ls /hbase命令来查看,该目录不需要自动创建。如果在安装HBase的过程中失败需要重新启动,最好将此目录从集群中删除,通过命令hadoop fs -rmr /hbase来删除。

需要特别注意的是在hadoop集群中hadoop fs -ls /hbase目录和hadoop fs -ls hbase目录并非一个目录,通过hadoop fs -ls hbase查看到的目录实际上为/user/hadoop/hbase目录。

HBase管理界面

Master的界面:http://192.168.20.6:60010/master.jsp
RegionServer的界面:http://192.168.20.36:60030/regionserver.jsp和http://192.168.20.38:60030/regionserver.jsp

参考资料

下载链接

http://pan.baidu.com/share/link?shareid=1235031445&uk=3506813023 提取码:v8ok

0%