카테고리 보관물: Apache Project/Cassandra

카산드라 완벽 가이드 예제 소스..

카산드라 완벽 가이드 번역판의 예제 소스이다. 한빛미디어 사이트에서 소스를 배포하고 있기 때문에 http://www.hanb.co.kr/exam/1852/ 에서 다운로드 받을 수 있지만, 책 예제는 아래의 예제를 다운로드 해 주세요.

책 예제

블로그 예제

Cassandra Valueless Column(값이 없는 컬럼) Pattern에 대해..

카산드라(Cassandra)의 값이 없는(Valueless Column) 패턴은 어렵진 않지만, 처음 보면 잘 이해가 안 갈 수도 있다. 현재 1.0.8 버전의 카산드라가 배포되는 시점에서 과연 이 패턴을 사용할까에 대한 의문(?)은 사용하고 있지 않을 것으로 확신할 수 있다. 이미 0.7 버전부터 보조 인덱스를 지원하기 시작했으니, 현 시점에서 이 패턴은 쓸모(?)가 없어 보인다.

그래도, 0.6 버전을 사용하는 곳이 있을 수도 있으니, 한번 알아나 보자. 값이 없는 컬럼에 대한 설명은 “카산드라 완벽가이드 번역서“에서 설명하고 있다.

역서의 100페이지에서 7번째 줄을 설명을 보자..

“User/UserCity 예제를 빌드해 보자. User..


..”

위의 내용은 번역서를 참고하시고, 아래에 설명을 하면

– USER 컬럼 패밀리

<<cf>>USER
Key: UserID
Cols: username, email, birth date, city, state

– USERCITY 컬럼 패밀리

<<cf>>USERCITY
Key: city
Cols: IDs of the users in that city.

위에 2개(USER, USERCITY)의 컬럼 패밀리가 있다는 것을 가정하면..


USER는 Key(고유키)를 가지고 있고, USERCITY의 Cols 컬럼 이름으로 USER의 Key를 가지는 형태가 바로 “값이 없는 컬럼” 패턴이다.

따라서, 위의 컬럼 패밀리에서 USERCITY 컬럼패밀리에 ‘Seoul’이라는 key가 있으면, Cols의 값이 없는 컬럼 이름들이, ‘Seoul’이라는 도시에 살고 있는 사람들이라는 내용이 되겠다.

Cassandra에서 설정으로 사용하는 YAML 포맷에 대해서..

카산드라는 0.7 버전부터인가? 기본 설정 파일 포맷으로 YAML 포맷을 사용하기 시작했다. YAML 파일은 위키의 YAML 포맷에 대한 정의를 살펴보면, 사람이 쉽게 읽을 수 있는 데이터 직렬화 양식이라고 한다. 흠 그래.. 쪼매 쉽게 읽히긴 한다.

아래에서 0.6 버전에서 사용했던 XML 포맷과 현재(1.0.2)에서 사용하고 있는 YAML 포맷을 살펴보자. 어떤 설정이 더 가독성이 있을까? 라는 질문에 나는 XML 포맷이라고 답하겠다.

단순히 포맷만 보면, XML이 YAML 포맷에 비해서 비 효율적이고 파싱에 대한 비용도 많이 들겠다. 하지만, 카산드라에서 아래의 용도는 클러스터/머신의 상황에 맞게 카산드라가 잘 돌게 하기 위한 설정이다. 설정이라고 하면, 포맷에 맞춰서 설정한 값의 가독성이 매우 중요한 포인트라고 생각한다. 그런 면에서 나는 꼭 설정에 XML을 사용할 필요는 없겠지만, 가급적이면 YAML보다 쉽고(비교적 쉽게 느껴지는 주관) 가독성이 좋은 XML을 사용해 줬으면 하지만, 지금은 YAML이 기본 포맷이다. YAML 포맷을 숙지하고 사용해야 겠지만, 아쉬운 느낌이다.. 아.. XML 포맷이 좋아지다니..

– XML 포맷

<Storage>
<ClusterName>Test Cluster</ClusterName>
<AutoBootstrap>false</AutoBootstrap>
<Keyspaces>
<Keyspace Name=”Keyspace1″>
<ColumnFamily CompareWith=”BytesType” Name=”Standard1″ RowsCached=”10%” KeysCachedFraction=”0″/>
<ColumnFamily CompareWith=”UTF8Type” Name=”Standard2″/>
<ColumnFamily CompareWith=”TimeUUIDType” Name=”StandardByUUID1″/>
<ColumnFamily ColumnType=”Super”
CompareWith=”UTF8Type”
CompareSubcolumnsWith=”UTF8Type”
Name=”Super1″
RowsCached=”1000″
KeysCachedFraction=”0″
Comment=”A column family with supercolumns, whose column and subcolumn names are UTF8 strings”/>
<ReplicaPlacementStrategy>org.apache.cassandra.locator.RackUnawareStrategy</ReplicaPlacementStrategy>
<ReplicationFactor>1</ReplicationFactor>
<EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>
</Keyspace>
</Keyspaces>  <Authenticator>org.apache.cassandra.auth.AllowAllAuthenticator</Authenticator>
<Partitioner>org.apache.cassandra.dht.RandomPartitioner</Partitioner>
<InitialToken></InitialToken>
<CommitLogDirectory>/var/lib/cassandra/commitlog</CommitLogDirectory>
<DataFileDirectories>
<DataFileDirectory>/var/lib/cassandra/data</DataFileDirectory>
</DataFileDirectories>
<CalloutLocation>/var/lib/cassandra/callouts</CalloutLocation>
<StagingFileDirectory>/var/lib/cassandra/staging</StagingFileDirectory>
<Seeds>
<Seed>127.0.0.1</Seed>
</Seeds>
<RpcTimeoutInMillis>5000</RpcTimeoutInMillis>
<CommitLogRotationThresholdInMB>128</CommitLogRotationThresholdInMB>
<ListenAddress>localhost</ListenAddress>
<StoragePort>7000</StoragePort>
<ThriftAddress>localhost</ThriftAddress>
<ThriftPort>9160</ThriftPort>
<ThriftFramedTransport>false</ThriftFramedTransport>
<DiskAccessMode>auto</DiskAccessMode>
<SlicedBufferSizeInKB>64</SlicedBufferSizeInKB>
<FlushDataBufferSizeInMB>32</FlushDataBufferSizeInMB>
<FlushIndexBufferSizeInMB>8</FlushIndexBufferSizeInMB>
<ColumnIndexSizeInKB>64</ColumnIndexSizeInKB>
<MemtableThroughputInMB>64</MemtableThroughputInMB>
<BinaryMemtableThroughputInMB>256</BinaryMemtableThroughputInMB>
<MemtableOperationsInMillions>0.3</MemtableOperationsInMillions>
<MemtableFlushAfterMinutes>60</MemtableFlushAfterMinutes>
<ConcurrentReads>8</ConcurrentReads>
<ConcurrentWrites>32</ConcurrentWrites>
<CommitLogSync>periodic</CommitLogSync>
<CommitLogSyncPeriodInMS>10000</CommitLogSyncPeriodInMS>
<GCGraceSeconds>864000</GCGraceSeconds>
</Storage>

– YAML 포맷

cluster_name: ‘Test Cluster’
initial_token:
hinted_handoff_enabled: true
max_hint_window_in_ms: 3600000 # one hour
hinted_handoff_throttle_delay_in_ms: 50
authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
authority: org.apache.cassandra.auth.AllowAllAuthority
partitioner: org.apache.cassandra.dht.RandomPartitioner
data_file_directories:
– /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000

seed_provider:
– class_name: org.apache.cassandra.locator.SimpleSeedProvider

parameters:
– seeds: “127.0.0.1”

flush_largest_memtables_at: 0.75
reduce_cache_sizes_at: 0.85
reduce_cache_capacity_to: 0.6
concurrent_reads: 32
concurrent_writes: 32
memtable_flush_queue_size: 4
sliced_buffer_size_in_kb: 64
storage_port: 7000
ssl_storage_port: 7001
listen_address: localhost
rpc_address: localhost
rpc_port: 9160
rpc_keepalive: true
rpc_server_type: sync
thrift_framed_transport_size_in_mb: 15
thrift_max_message_length_in_mb: 16
incremental_backups: false
snapshot_before_compaction: false
column_index_size_in_kb: 64
in_memory_compaction_limit_in_mb: 64
multithreaded_compaction: false
compaction_throughput_mb_per_sec: 16
compaction_preheat_key_cache: true
rpc_timeout_in_ms: 10000
endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
dynamic_snitch_update_interval_in_ms: 100
dynamic_snitch_reset_interval_in_ms: 600000
dynamic_snitch_badness_threshold: 0.1
request_scheduler: org.apache.cassandra.scheduler.NoScheduler
index_interval: 128
encryption_options:
internode_encryption: none
keystore: conf/.keystore
keystore_password: cassandra
truststore: conf/.truststore
truststore_password: cassandra

Cassandra와 Hadoop, HBase, MongoDB와의 차이점..

아래는 http://www.datastax.com/faq#intro-3에 있는 내용이다. 설명이 간단 명료해서 쉽게 차이점을 이해할 수 있다. ^^

How does Cassandra differ from Hadoop?

The primary difference between Cassandra and Hadoop is that Cassandra targets real-time/operational data, while Hadoop has been designed for batch-based analytic work.

There are many different technical differences between Cassandra and Hadoop, including Cassandra’s underlying data structure (based on Google’s Bigtable), its fault-tolerant, peer-to-peer architecture, multi-data center capabilities, tunable data consistency, all nodes being the same (no concept of a namenode, etc.) and much more.

How does Cassandra differ from HBase?

HBase is an open-source, column-oriented data store modeled after Google Bigtable, and is designed to offer Bigtable-like capabilities on top of data stored in Hadoop. However, while HBase shared the Bigtable design with Cassandra, its foundational architecture is much different.

A Cassandra cluster is much easier to setup and configure than a comparable HBase cluster. HBase’s reliance on the Hadoop namenode equates to there being a single point of failure in HBase, whereas with Cassandra, because all nodes are the same, there is no such issue.

In internal performance tests conducted at DataStax (using the Yahoo Cloud Serving Benchmark – YCSB), Cassandra offered literally 5X better performance in writes and 4X better performance on reads than HBase.

How does Cassandra differ from MongoDB?

MongoDB is a document-oriented database that is built upon a master-slave/sharding architecture. MongoDB is designed to store/manage collections of JSON-styled documents.

By contrast, Cassandra uses a peer-to-peer, write/read-anywhere styled architecture that is based on a combination of Google BigTable and Amazon Dynamo. This allows Cassandra to avoid the various complications and pitfalls of master/slave and sharding architectures.
Moreover, Cassandra offers linear performance increases as new nodes are added to a cluster, scales to terabyte-petabyte data volumes, and has no single point of failure.

카산드라(Cassandra)를 사용하기 전에 보면 도움이 되는 파일들..

카산드라(Cassandra)를 사용하거나 사용을 고려하는 분이라면 읽어보면 좋을 2개의 파일이 있는데, 아래의 파일들은 카산드라의 압축을 풀면 최상단에 위치하는 파일들이다. 하나는 README.txt 이고, 다른 하나는 NEWS.txt 이다.

– README.txt는 카산드라에 대한 개략적인 내용과 설치에 대한 내용이 있다.
– NEWS.txt는 카산드라가 버전업이 되면서, 바뀌는 내용을 개략적으로 기술한 파일이다.

좀 더 자세히 살펴보실 분은 NOTICE.txtCHANGES.txt 를 읽어보길 권한다.

– NOTICE.txt 파일에는 카산드라가 사용하고 있는 Dependency Library에 대한 내용을 포함하고 있다.
– CHANGES.txt 파일에는 카산드라 버전이 업데이트 되면서, 새롭게 추가되거나 수정된 내용을 이슈트래킹 번호와 같이 알려주고 있다. 따라서, 자세한 내용은 CHANGES.txt 파일의 이슈트래킹 번호를 따라 들어가게 되면, 버전 업에 따른 좀 더 세부적인 내용을 살펴볼 수 있다.