2012-12-04 5 views
5

Nếu môi trường của tôi thiết lập như sau:
-64MB HDFS chặn
-5 máy chủ tablet
-10 tablet kích thước 1GB mỗi mỗi viên thuốc máy chủKhi nói đến MapReduce như thế nào là viên Accumulo ánh xạ tới một HDFS chặn

Nếu tôi có một bảng như sau:
rowA | f1 | q1 | v1
rowA | f1 | q2 | v2

rowB | f1 | q1 | v3

rowC | f1 | q1 | v4
rowC | f2 | q1 | v5
rowC | f3 | q3 | v6

Từ tài liệu nhỏ, tôi biết tất cả dữ liệu về rowA sẽ chuyển một máy tính bảng có thể có hoặc không chứa dữ liệu về các hàng khác tức là tất cả hoặc không có hàng nào. Vì vậy, câu hỏi của tôi là:

Các máy tính bảng được ánh xạ tới khối Datanode hoặc HDFS như thế nào? Rõ ràng, một máy tính bảng được chia thành nhiều khối HDFS (8 trong trường hợp này) vì vậy chúng sẽ được lưu trữ trên cùng một hoặc datanode khác nhau (s) hay không nó không quan trọng?

Trong ví dụ trên, tất cả dữ liệu về RowC (hoặc A hoặc B) có đi cùng khối HDFS hoặc các khối HDFS khác không?

Khi thực hiện một bản đồ giảm công việc tôi sẽ nhận được bao nhiêu người lập bản đồ? (một cho mỗi khối hdfs? hoặc mỗi máy tính bảng? hoặc mỗi máy chủ?)

Cảm ơn bạn trước cho bất kỳ và tất cả các đề xuất.

+0

Không chắc chắn. Trong sự tò mò, tại sao bạn quan tâm đến số lượng người lập bản đồ? Nói chung, bạn sẽ khởi động máy quét Accumulo để truy cập dữ liệu trong các hàng. Các máy quét cung cấp một mức trừu tượng, do đó bạn không cần phải tự mình thực hiện các công việc MapReduce. – 10flow

+0

Tôi đang viết công việc Mapreduce mà đọc từ và viết để tích lũy bảng. Trong ví dụ trên, hãy để tôi gọi tất cả dữ liệu từ một hàng, một "bản ghi". Vì vậy, tôi đang cố gắng tìm ra thứ tự các hồ sơ này sẽ đi vào. Điều này tất nhiên phụ thuộc vào sự lây lan của chúng. – chapstick

Trả lời

1

Để ghi vào Accumulo (nhập dữ liệu), bạn nên chạy các công việc MapReduce, trong đó đầu vào của trình ánh xạ là các tệp đầu vào của bạn trên HDFS. Về cơ bản bạn sẽ làm theo ví dụ này từ tài liệu Accumulo:

http://accumulo.apache.org/1.4/examples/mapred.html

(Mục IV của bài viết này cung cấp một số nền thêm về kỹ thuật để nuốt dữ liệu vào Accumulo: http://ieee-hpec.org/2012/index_htm_files/byun.pdf)

Đối với đọc từ Accumulo (truy vấn dữ liệu), Tôi sẽ không sử dụng MapReduce. Accumulo/Zookeeper sẽ tự động phân phối truy vấn của bạn trên các máy chủ bảng. Nếu bạn đang sử dụng các hàng làm bản ghi nguyên tử, hãy sử dụng (hoặc mở rộng) trình WholeRowIterator và khởi chạy Máy quét (hoặc BatchScanner) trên phạm vi các hàng bạn quan tâm. Máy quét sẽ chạy song song trên các máy chủ bảng của bạn. Bạn không thực sự muốn truy cập dữ liệu Accumulo trực tiếp từ HDFS hoặc MapReduce.

Dưới đây là một số mã ví dụ để giúp bạn bắt đầu:

//some of the classes you'll need (in no particular order)... 

import org.apache.accumulo.core.client.Connector; 
import org.apache.accumulo.core.client.Instance; 
import org.apache.accumulo.core.client.ZooKeeperInstance; 
import org.apache.accumulo.core.Constants; 
import org.apache.accumulo.core.client.Scanner; 
import org.apache.accumulo.core.client.IteratorSetting; 
import org.apache.accumulo.core.data.Key; 
import org.apache.accumulo.core.data.Range; 
import org.apache.accumulo.core.data.Value; 
import org.apache.hadoop.io.Text; 

//Accumulo client code... 

//Accumulo connection 
Instance instance = new ZooKeeperInstance(/* put your installation info here */); 
Connector connector = instance.getConnector(username, password); 

//setup a Scanner or BatchScanner 
Scanner scanner = connector.createScanner(tableName, Constants.NO_AUTHS); 
Range range = new Range(new Text("rowA"), new Text("rowB")); 
scanner.setRange(range); 

//use a WholeRowIterator to keep rows atomic 
IteratorSetting itSettings = new IteratorSetting(1, WholeRowIterator.class); 
scanner.addScanIterator(itSettings); 

//now read some data! 
for (Entry<Key, Value> entry : scanner) { 
    SortedMap<Key,Value> wholeRow = WholeRowIterator.decodeRow(entry.getKey(), entry.getValue()); 

    //do something with your data! 

} 
+0

Cảm ơn Scott. Tôi là một newbie để tích lũy và bản đồ giảm. Bạn có bất kỳ ví dụ cho sau này tôi có thể làm theo? – chapstick

+0

Tôi vừa chỉnh sửa câu trả lời để bao gồm một ví dụ về cách thiết lập Máy quét để đọc dữ liệu từ Accumulo. – 10flow

+0

Cảm ơn bạn đã làm ví dụ. Bạn đã nói không sử dụng MapReduce để truy cập Accumulo. Có thể tôi không rõ ràng. Tôi thực sự đang cố gắng thực hiện một số công việc tạo bản đồ cần truy cập dữ liệu được lưu trữ trong thể hiện tích lũy của tôi và sau đó là bản đồ sau khi viết lại ghi lại một bảng khác trong tích lũy. Đây là lý do tại sao tôi đã hỏi có bao nhiêu người lập bản đồ sẽ có và theo thứ tự các cặp giá trị chính sẽ được truyền trực tiếp. bạn có bất kì gợi ý nào không? – chapstick

3

Để trả lời câu hỏi của bạn trực tiếp:

thế nào là máy tính bảng ánh xạ tới một khối Datanode hoặc HDFS? Rõ ràng, một máy tính bảng được chia thành nhiều khối HDFS (8 trong trường hợp này) vì vậy chúng sẽ được lưu trữ trên cùng một hoặc datanode khác nhau (s) hay không nó không quan trọng?

Máy tính bảng được lưu trữ trong các khối như tất cả các tệp khác trong HDFS.Bạn thường sẽ thấy tất cả các khối cho một tệp trên ít nhất một nút dữ liệu (không phải lúc nào cũng như vậy, nhưng dường như chủ yếu là đúng khi tôi đã xem các vị trí khối cho các tệp lớn hơn)

In ví dụ trên, tất cả dữ liệu về RowC (hoặc A hoặc B) có đi cùng khối HDFS hoặc các khối HDFS khác không?

Phụ thuộc vào kích thước khối cho máy tính bảng của bạn (dfs.block.size hoặc nếu được định cấu hình thuộc tính Accumulo table.file.blocksize). Nếu kích thước khối có cùng kích thước với kích thước của máy tính bảng, thì rõ ràng là chúng sẽ nằm trong cùng một khối HDFS. Nếu không, nếu kích thước khối nhỏ hơn kích thước của máy tính bảng, thì đó là may mắn về việc liệu chúng có nằm trong cùng một khối hay không.

Khi thực hiện bản đồ giảm công việc tôi sẽ nhận được bao nhiêu người lập bản đồ? (một cho mỗi khối hdfs? hoặc mỗi máy tính bảng? hoặc mỗi máy chủ?)

Điều này tùy thuộc vào phạm vi bạn cung cấp cho InputFormatBase.setRanges(Configuration, Collection<Ranges>).

Nếu bạn quét toàn bộ bảng (-inf -> + inf), khi đó bạn sẽ nhận được một số người lập bản đồ bằng số lượng máy tính bảng (bị vô hiệu hóa bởi disableAutoAdjustRanges). Nếu bạn xác định phạm vi cụ thể, bạn sẽ nhận được một hành vi khác nhau tùy thuộc vào việc bạn đã gọi là InputFormatBase.disableAutoAdjustRanges(Configuration) hay không:

  1. Nếu bạn đã gọi phương pháp này thì bạn sẽ nhận được một trình ánh xạ cho mỗi dải ô được xác định. Quan trọng hơn, nếu bạn có phạm vi bắt đầu trong một máy tính bảng và kết thúc bằng một máy tính bảng khác, bạn sẽ nhận được một trình ánh xạ để xử lý toàn bộ dải đó
  2. Nếu bạn không gọi phương pháp này và bạn có phạm vi trải rộng trên máy tính bảng, sau đó bạn sẽ nhận được một bản đồ cho mỗi máy tính bảng phạm vi bao gồm