领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!

作者 郭鹏 发布于 2011年11月14日
HDFS全称是Hadoop Distributed System。HDFS是为以流的方式存取大文件而设计的。适用于几百MB,GB以及TB,并写一次读多次的场合。
构成HDFS主要是Namenode(master)和一系列的Datanode(workers)。Namenode负责管理HDFS的目录树和相关的文件元数据,Datanode则是存取文件实际内容的节点,Datanodes会定时地将block的列表汇报给Namenode。
如果Namenode出现了故障,整个HDFS集群将不可用,除非Namenode机器重启,并且需要等待一定时间的回复初始化之后,才能正常提供服务。除此之外,Namenode还存在内存的瓶颈,当整个HDFS集群当中文件的数据达到一定的上限之后,Namenode将出现一系列与内存相关的问题。
MapReduce是Hadoop中处理海量计算的编程模型。在这种编程模型下,用户通过定义一个map函数和一个reduce函数来解决问题。构成Map Reduce只要是JobTracker(master)和一系列的TaskTraker(workers)。
JobTracker负责管理,分配和监控所有的计算任务,TaskTraker则是实际执行任务的节点,TaskTraker会将任务的执行情况都汇报给JobTracker。
如果JobTracker出现了故障,集群中所有正在执行的计算任务都会失败,并且在重启JobTracker之前,无法在提交任何计算任务。
Hive是基于Hadoop的一种数据查询工具,它可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,能够将SQL语句转换为MapReduce任务进行运行。
Cassandra是一款面向列的NoSQL数据库,和Google的BitTable数据库属于同一类。此数据库比一个类似Dynamo的Key Value数据库功能更多,但相比面向文档的数据库(例如MongoDB),它所支持的查询类型要少。
Cassandra结合了Dynamo的Key Value与Bigtable的面向列的特点:
Brisk是由DataStax开发的一款基于Apache Cassandra的开源产品,它提供了HadoopMapReduce,HDFS和Hive所包含的相关功能。Brisk中包含了一个与HDFS接口兼容的CassandraFS 。 与HDFS相比,CassandraFS没有单点故障,整个文件系统所能承载的文件上限也不会受机器内存上限的影响。
用户如果希望使用Brisk来替代整个Hadoop系统,整个系统的部署图如下:

整个系统只需要三类角色即可:
其中Cassandra Node负责实时数据读写和海量文件的存储(HDFS),TaskTracker和JobTracker负责海量计算(MapReduce)。
每个模块的功能图示如下:

下载brisk-1.0~beta2-bin.tar.gz,jdk6并解压。
配置环境变量
export JAVA_HOME=/home/aaron/jdk1.6.0_25 export BRISK_HOME=/home/aaron/brisk-1.0~beta2 export PATH=$JAVA_HOME/bin::$BRISK_HOME/bin:$PATH
修改Cassandra中数据存放的目录配置参数文件:$BRISK_HOME /resources/cassandra/conf/cassandra.yaml
# directories where Cassandra should store data on disk. data_file_directories: - /var/lib/cassandra/data # commit log commitlog_directory: /var/lib/cassandra/commitlog # saved caches saved_caches_directory: /var/lib/cassandra/saved_caches
将上面的路径修改为合适的路径,如:
# directories where Cassandra should store data on disk. data_file_directories: - /home/aaron/brisk-1.0~beta2/resources/cassandra/data # commit log commitlog_directory: /home/aaron/brisk-1.0~beta2/resources/cassandra/commitlog # saved caches saved_caches_directory: /home/aaron/brisk-1.0~beta2/resources/cassandra/saved_caches
修改Cassandra中日志存放的目录配置参数文件:$BRISK_HOME/resources/cassandra/conf/log4j-server.properties
# Edit the next line to point to your logs directory
log4j.appender.R.File=/var/log/cassandra/system.log
将上面的路径修改为合适的路径,如:
# Edit the next line to point to your logs directory log4j.appender.R.File=/home/aaron/brisk-1.0~beta2/resources/cassandra/system.log
安装JNA(可选)
下载jna.jar,并放到$BRISK_HOME/resources/cassandra/lib目录中。
修改/etc/security/limits.conf,加入如下内容:
$USER soft memlockunlimited $USER hard memlock unlimited
其中$USER为实际运行Brisk的用户名称。
在命令行中执行如下命令即可:
briskcassandra -t
CassandraFS的使用与HDFS一致,唯一的区别在于命令行多了一个brisk的前缀。
如创建一个文件夹/test。
在HDFS中的命令为:
hadoopfs –mkdir /test在CassandraFS中执行的命令为:
briskhadoopfs –mkdir /test
本文将配置3台服务器进行说明示例:
每台服务器在单机部署的基础之上,还需要修改Cassandra的配置文件resources/cassandra/conf/cassandra.yaml
cluster_name: 'BriskTest' initial_token: seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "192.168.104.139,192.168.104.142,192.168.104.143" #每台服务器需要填写实际的ip地址 listen_address: 192.168.104.139
在每台服务器的命令行中执行如下命令即可:
briskcassandra–t
在启动之后,可以通过下面的命令查看到集群的状态,如果所有的服务器节点都加入到环中,并且状态为Up,说明所有的服务器都正常启动了:
aaron@t01:~/brisk-1.0~beta2/resources/cassandra$ sh bin/nodetool -h 192.168.104.139 -p 7199 ring Address DC Rack Status State Load Owns Token 98783511047116141127937631965326696126 192.168.104.142 Brisk rack1 Up Normal 76.4 KB 80.25% 65174827350587778232091121501149362614 192.168.104.139 Brisk rack1 Up Normal 66.2 KB 13.78% 88615937102692658579489875256308528421 192.168.104.143 Brisk rack1 Up Normal 66.2 KB 5.98% 98783511047116141127937631965326696126
CassandraFS的实现非常精简巧妙,是基于Cassandra0.8.1和Hadoop 0.20.203的实现,并在此之上做了简单的扩展实现的。。
为了让Cassandra能够支持文件存储的功能,Brisk在thrift接口文件($BRISK_HOME/interface/brisk.thrift)中定义了支持类似HDFS中分块存储文件的基本功能接口:
LocalOrRemoteBlockget_cfs_sblock(
1:required string caller_host_name,
2:required binary block_id,
3:required binary sblock_id,
4:i32 offset=0,
5:required StorageTypestorageType)
throws (
1:InvalidRequestException ire,
2:UnavailableException ue,
3:TimedOutException te,
4:NotFoundException nfe)
为了能够实现这个接口,Brisk又修改Cassandra的启动脚本($BRISK_HOME/resources/cassandra/bin/Cassandra)逻辑:
将默认的启动主类:
classname="org.apache.cassandra.thrift.CassandraDaemon"
修改为:
classname="com.datastax.brisk.BriskDaemon"
新的启动主类com.datastax.brisk.BriskDaemon在实现原有接口(cassandra.thrift)的基础之上,而外实现了brisk.thrift中定义的get_cfs_sblock接口。
Cassadnra中定义了新的keyspace存储文件的元数据信息和数据块信息:
Keyspace: cfs: Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy Durable Writes: true Options: [Brisk:1, Cassandra:0]
其中存储文件的元数据信息ColumnFamily的定义如下:
ColumnFamily: inode "Stores file meta data" Key Validation Class: org.apache.cassandra.db.marshal.BytesType Default column value validator: org.apache.cassandra.db.marshal.BytesType Columns sorted by: org.apache.cassandra.db.marshal.BytesType Row cache size / save period in seconds: 0.0/0 Key cache size / save period in seconds: 1000000.0/14400 Memtable thresholds: 0.103125/128/1 (millions of ops/MB/minutes) GC grace seconds: 60 Compaction min/max thresholds: 4/32 Read repair chance: 1.0 Replicate on write: false Built indexes: [inode.parent_path, inode.path, inode.sentinel] Column Metadata: Column Name: parent_path (706172656e745f70617468) Validation Class: org.apache.cassandra.db.marshal.BytesType Index Name: parent_path Index Type: KEYS Column Name: path (70617468) Validation Class: org.apache.cassandra.db.marshal.BytesType Index Name: path Index Type: KEYS Column Name: sentinel (73656e74696e656c) Validation Class: org.apache.cassandra.db.marshal.BytesType Index Name: sentinel Index Type: KEYS
其中存储文件的数据块信息ColumnFamily的定义如下:
ColumnFamily: sblocks "Stores blocks of information associated with a inode" Key Validation Class: org.apache.cassandra.db.marshal.BytesType Default column value validator: org.apache.cassandra.db.marshal.BytesType Columns sorted by: org.apache.cassandra.db.marshal.BytesType Row cache size / save period in seconds: 0.0/0 Key cache size / save period in seconds: 1000000.0/14400 Memtable thresholds: 0.103125/128/1 (millions of ops/MB/minutes) GC grace seconds: 60 Compaction min/max thresholds: 16/64 Read repair chance: 1.0 Replicate on write: false Built indexes: []
在Hadoop的默认配置(core-default.xml)中,定义了hdfs文件类型的实现:
<property>
<name>fs.hdfs.impl</name>
<value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
<description>The FileSystem for hdfs: uris.</description>
</property>
为了能够提供Cassandra特有的文件系统实现,Brisk将hadoop默认的hdfs文件类型修改为了cfs文件类型,其在core-site.xml文件中的配置重置了默认配置:
<property>
<name>fs.cfs.impl</name>
<value>org.apache.cassandra.hadoop.fs.CassandraFileSystem</value>
</property>
<property>
<name>fs.cfs-archive.impl</name>
<value>org.apache.cassandra.hadoop.fs.CassandraFileSystem</value>
</property>
其中org.apache.cassandra.hadoop.fs.CassandraFileSystem与HDFS中默认的实现org.apache.hadoop.hdfs.DistributedFileSystem一样,都继承于Hadoop通用的文件接口基类org.apache.hadoop.fs.FileSystem,所有能够保证接口的兼容性。
此外,Brisk还修改了HDFS中默认使用的文件类型:
<property>
<name>fs.default.name</name>
<value>cfs:///</value>
</property>
所以在当我们在Brisk环境中调用HDFS的操作时,都将定向到cfs的实现,如:
briskhadoopfs -ls /test
将相应地转化为:
briskhadoopfs -ls cfs:///test
org.apache.cassandra.hadoop.fs.CassandraFileSystem中所有文件的操作都是通过调用Brisk中提供的get_cfs_sblock接口服务来实现读写操作的,通过整合这些模块,从而完成了利用Cassandra替换HDFS的需求。
不过目前CassandraFS实现和HDFS的实现还是有一些区别的,比如不支持权限,不支持追加写入等等。
郭鹏,《Cassandra实战》作者,爱好NoSQL以及Hadoop相关的开源产品。
感谢张凯峰对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家加入到InfoQ中文站用户讨论组中与我们的编辑和其他读者朋友交流。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
1 条回复
关注此讨论 回复