2012-07-31 16 views
5

Trong quá trình phát triển các công việc giảm bản đồ, mã MR của chúng tôi tạo ra các cấu trúc dữ liệu chẩn đoán hữu ích độc lập với dữ liệu được giảm bản đồ. Có cách nào dễ dàng để đưa những dữ liệu này ra mã được gọi là mapReduce hoặc để tồn tại chúng trong Mongo không? Chỉ cần ghi vào tệp nhật ký hóa ra là rất tối ưu vì (a) có rất nhiều dữ liệu đã có và (b) thông tin chẩn đoán của chúng tôi được cấu trúc cao và trên thực tế, chúng tôi muốn chạy truy vấn nó. Điều tra của tôi cho đến nay cho thấy rằng cấu trúc dữ liệu MR được truyền theo giá trị (thông qua serialization) vì vậy bất kỳ cấu trúc dữ liệu trong bộ nhớ bị mất, bao gồm cả những kết nối với phạm vi "toàn cầu". Các không gian tên được phân lập từ không gian tên phía máy chủ JS chính do đó, dbeval dường như không thể tiếp cận chúng (hoặc, ít nhất, tôi không biết phải tìm đâu). Cuối cùng nhưng không kém phần quan trọng, mặc dù tất cả các đối tượng và chức năng cơ sở dữ liệu đều có mặt, nhưng 10gen đang tạo ra các thông báo lỗi (khó hiểu) để ngăn chặn việc sử dụng chúng, ví dụ: về coll.insert không phải là một hàm trong khi typeof coll.insert === 'function'true.MongoDB: mapReduce tác dụng phụ

Để rõ ràng, tôi quan tâm đến việc này để phát triển trong một nút duy nhất, bởi vì hỗ trợ ghi/gỡ lỗi trong MongoDB là khá hạn chế. Loại tác dụng phụ này không tốt trong môi trường sản xuất.

+0

Chính xác loại dữ liệu nào đang tạo? Đầu ra của MR có thể được lưu giữ trong bộ sưu tập .. Trong C#, tôi chỉ định nó như sau: MyInputCollection.MapReduce (map, reduce, MapReduceOptions.SetOutput ("MyOutputCollection")); Sau đó bạn đọc từ bộ sưu tập liên tục 'MyOutputCollection'. –

+0

Tôi muốn lưu thông tin độc lập với đầu ra MR. Hãy suy nghĩ về nó như là sự cạn kiệt dữ liệu, ví dụ: để biết thông tin ghi nhật ký/đánh giá cấu trúc chi tiết mà tôi muốn xử lý bằng mã, vì vậy tôi không muốn nó kết thúc trong các tệp nhật ký. – Sim

+0

Bạn đã thử sử dụng một bộ sưu tập giới hạn để đăng nhập .. Tôi không hiểu tại sao coll.insert sẽ thất bại .. –

Trả lời

2

Khi được phỏng đoán, không thể (như tại MongoDB 2.2) truy cập một DB khác từ bên trong các hàm Map/Reduce. Bên cạnh tác động hiệu suất tiềm năng, cũng có khả năng tạo ra các bế tắc và các tác dụng phụ không mong muốn khác.

Thật không may là lá print() vào nhật ký mongo là tùy chọn đầu ra "ngoài băng" duy nhất.

Tùy thuộc vào sản lượng chẩn đoán của bạn, một cách tiếp cận để thử sẽ là:

  • thêm một dấu hiệu duy nhất mà sẽ cho phép bạn xác định các đầu ra (hoặc thậm chí chạy ra) trong dữ liệu ghi nhận

  • serialize đầu ra của bạn sử dụng tojson() vì vậy nó được đăng nhập với một số cấu trúc parseable và lý tưởng phát ra trên một dòng duy nhất khi bạn print()

  • viết một kịch bản để tail các mongod.log đăng nhập cho các dây chuyền phù hợp với điểm đánh dấu duy nhất của bạn và chèn những thành bộ sưu tập khác để báo cáo

Ví dụ về code mà sẽ chạy từ bên trong một hàm M/R:

var diag = { 
    'run' : diagrun, 
    'phase': 'map', 
    'key' : z 
} 
print("MAPDIAG:" + tojson(diag)); 

Ví dụ đầu ra:

$ tail -f mongo.log | grep "^MAPDIAG" 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "mouse" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } 
MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "cat", "total" : 3 } 
MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "dog", "total" : 2 } 
+0

đây là nhiều hơn hoặc ít hơn những gì chúng tôi đã kết thúc làm.Tôi đã xây dựng một lớp logger đăng nhập vào một bộ sưu tập và sử dụng print(). Trong MR, bộ sưu tập nhật ký chèn tạo ra ngoại lệ được nuốt. Tôi muốn 10gen chú ý nhiều hơn đến sự hỗ trợ phát triển/gỡ lỗi. – Sim

+0

@Sim: sẽ hữu ích nếu bạn có thể tạo [vấn đề Jira] (https://jira.mongodb.org/browse/SERVER) trong trình theo dõi MongoDB (hàng đợi SERVER, thành phần 'MapReduce/Distinct/Group') với một số thêm thông tin về những gì cần thiết/hữu ích để gỡ lỗi. Có lẽ một cái gì đó tương tự như Hadoop [MapReduce Counters] (http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/), với một cuộc gọi lại đầu ra khai thác tùy chọn vào cuối chạy . – Stennie