Python đặt mã hóa mặc định
Hướng dẫn lập trình Beam dành cho người dùng Beam muốn sử dụng Beam SDK để tạo quy trình xử lý dữ liệu. Nó cung cấp hướng dẫn sử dụng các lớp Beam SDK để xây dựng và kiểm tra quy trình của bạn. Hướng dẫn lập trình không nhằm mục đích tham khảo toàn diện, mà là hướng dẫn cấp cao, không phụ thuộc vào ngôn ngữ để lập trình quy trình Beam của bạn. Khi hướng dẫn lập trình được điền vào, văn bản sẽ bao gồm các mẫu mã bằng nhiều ngôn ngữ để giúp minh họa cách triển khai các khái niệm Beam trong quy trình của bạn Show
Nếu bạn muốn giới thiệu ngắn gọn về các khái niệm cơ bản của Beam trước khi đọc hướng dẫn lập trình, hãy xem trang Khái niệm cơ bản về mô hình Beam Thích ứng cho
SDK Python hỗ trợ Python 3. 7, 3. 8, 3. 9 và 3. 10 Go SDK hỗ trợ Go v1. 18+. Bản phát hành SDK 2. 32. 0 là phiên bản thử nghiệm cuối cùng Typescript SDK hỗ trợ Node v16+ và vẫn đang thử nghiệm 1. Tổng quanĐể sử dụng Beam, trước tiên bạn cần tạo một chương trình trình điều khiển bằng cách sử dụng các lớp trong một trong các Beam SDK. Chương trình trình điều khiển của bạn xác định quy trình của bạn, bao gồm tất cả đầu vào, biến đổi và đầu ra; . Chúng bao gồm Trình chạy đường ống, đến lượt nó, xác định đường ống của bạn sẽ chạy trên back-end nào Beam SDK cung cấp một số khái niệm trừu tượng giúp đơn giản hóa cơ chế xử lý dữ liệu phân tán quy mô lớn. Các bản tóm tắt Beam giống nhau hoạt động với cả nguồn dữ liệu hàng loạt và luồng dữ liệu. Khi bạn tạo quy trình Beam, bạn có thể nghĩ về tác vụ xử lý dữ liệu của mình theo các khái niệm trừu tượng này. Chúng bao gồm
Một chương trình điều khiển Beam điển hình hoạt động như sau
Khi bạn chạy chương trình trình điều khiển Beam, Trình chạy đường ống mà bạn chỉ định sẽ xây dựng biểu đồ quy trình công việc của đường ống của bạn dựa trên các đối tượng 73 mà bạn đã tạo và các biến đổi mà bạn đã áp dụng. Biểu đồ đó sau đó được thực thi bằng cách sử dụng back-end xử lý phân tán phù hợp, trở thành một “công việc” không đồng bộ (hoặc tương đương) trên back-end đó2. Tạo một đường ống dẫnPhần trừu tượng hóa 68 gói gọn tất cả dữ liệu và các bước trong tác vụ xử lý dữ liệu của bạn. Chương trình trình điều khiển Beam của bạn thường bắt đầu bằng cách xây dựng một đối tượng Pipeline Pipeline , sau đó sử dụng đối tượng đó làm cơ sở để tạo . Để sử dụng Beam, trước tiên chương trình trình điều khiển của bạn phải tạo một phiên bản của Beam SDK lớp 68 (thường là trong hàm 909). Khi bạn tạo 68, bạn cũng cần đặt một số tùy chọn cấu hình. Bạn có thể đặt các tùy chọn cấu hình cho đường dẫn của mình theo chương trình, nhưng việc đặt các tùy chọn trước (hoặc đọc chúng từ dòng lệnh) và chuyển chúng đến đối tượng 68 khi bạn tạo đối tượng thường dễ dàng hơnĐường ống trong TypeScript API chỉ đơn giản là một chức năng sẽ được gọi với một đối tượng `root` duy nhất và được truyền cho phương thức `run` của Người chạy 4 5 6
2. 1. Định cấu hình tùy chọn đường ốngSử dụng các tùy chọn đường ống để định cấu hình các khía cạnh khác nhau của đường ống của bạn, chẳng hạn như trình chạy đường ống sẽ thực thi đường ống của bạn và bất kỳ cấu hình cụ thể nào của trình chạy theo yêu cầu của trình chạy đã chọn. Các tùy chọn quy trình của bạn có khả năng sẽ bao gồm thông tin như ID dự án của bạn hoặc vị trí lưu trữ tệp Khi bạn chạy quy trình trên một trình chạy mà bạn chọn, một bản sao của PipelineOptions sẽ có sẵn cho mã của bạn. Ví dụ: nếu bạn thêm tham số PipelineOptions vào phương thức 912 của DoFn, tham số đó sẽ được hệ thống điền vào2. 1. 1. Đặt PipelineOptions từ đối số dòng lệnhMặc dù bạn có thể định cấu hình quy trình của mình bằng cách tạo đối tượng 913 và đặt trường trực tiếp, nhưng Beam SDK bao gồm trình phân tích cú pháp dòng lệnh mà bạn có thể sử dụng để đặt trường trong 913 bằng cách sử dụng đối số dòng lệnhĐể đọc các tùy chọn từ dòng lệnh, hãy xây dựng đối tượng 913 của bạn như minh họa trong mã ví dụ sauSử dụng cờ Go để phân tích các đối số dòng lệnh để định cấu hình đường dẫn của bạn. Cờ phải được phân tích cú pháp trước khi 916 được gọiBất kỳ đối tượng Javascript nào cũng có thể được sử dụng làm tùy chọn đường dẫn. Người ta có thể xây dựng một cách thủ công, nhưng cũng thường truyền một đối tượng được tạo từ các tùy chọn dòng lệnh, chẳng hạn như 917 9 5 6 7Điều này diễn giải các đối số dòng lệnh tuân theo định dạng 8
Xây dựng 913 của bạn theo cách này cho phép bạn chỉ định bất kỳ tùy chọn nào làm đối số dòng lệnhXác định các biến cờ theo cách này cho phép bạn chỉ định bất kỳ tùy chọn nào làm đối số dòng lệnh
2. 1. 2. Tạo tùy chọn tùy chỉnhBạn có thể thêm các tùy chọn tùy chỉnh của riêng mình ngoài 913 tiêu chuẩnĐể thêm các tùy chọn của riêng bạn, hãy xác định giao diện với các phương thức getter và setter cho từng tùy chọn Ví dụ sau đây cho biết cách thêm tùy chọn tùy chỉnh 921 và 922 4 50 51 52Bạn cũng có thể chỉ định mô tả, mô tả này sẽ xuất hiện khi người dùng chuyển 923 làm đối số dòng lệnh và giá trị mặc địnhBạn đặt mô tả và giá trị mặc định bằng chú thích, như sau 53 54 55Đối với Python, bạn cũng có thể chỉ cần phân tích các tùy chọn tùy chỉnh của mình bằng argparse; Bạn nên đăng ký giao diện của mình với 924 và sau đó chuyển giao diện khi tạo đối tượng 913. Khi bạn đăng ký giao diện của mình với 924, 923 có thể tìm thấy giao diện tùy chọn tùy chỉnh của bạn và thêm nó vào đầu ra của lệnh 923. 924 cũng sẽ xác thực rằng các tùy chọn tùy chỉnh của bạn tương thích với tất cả các tùy chọn đã đăng ký khácMã ví dụ sau đây cho biết cách đăng ký giao diện tùy chọn tùy chỉnh của bạn với 924 56Bây giờ quy trình của bạn có thể chấp nhận 931 và 932 làm đối số dòng lệnh3. bộ sưu tậpPhần trừu tượng PCollection 73 là dữ liệu "đường ống dẫn"; . Như vậy, nếu bạn muốn làm việc với dữ liệu trong đường dẫn của mình, dữ liệu đó phải ở dạng 73. Sau khi bạn đã tạo 68 của mình, bạn sẽ cần bắt đầu bằng cách tạo ít nhất một 73 ở dạng nào đó. 73 bạn tạo đóng vai trò là đầu vào cho hoạt động đầu tiên trong quy trình của bạn3. 1. Tạo một PCCollectionBạn tạo một 73 bằng cách đọc dữ liệu từ một nguồn bên ngoài bằng cách sử dụng Beam, hoặc bạn có thể tạo một 73 dữ liệu được lưu trữ trong một lớp bộ sưu tập trong bộ nhớ trong chương trình trình điều khiển của bạn. Cái trước thường là cách một đường ống sản xuất sẽ nhập dữ liệu; . Cái sau chủ yếu hữu ích cho mục đích thử nghiệm và gỡ lỗi3. 1. 1. Đọc từ một nguồn bên ngoàiĐể đọc từ một nguồn bên ngoài, bạn sử dụng một trong các. Các bộ điều hợp khác nhau về cách sử dụng chính xác của chúng, nhưng tất cả chúng đều đọc từ một số nguồn dữ liệu bên ngoài và trả về một 73 có các phần tử đại diện cho các bản ghi dữ liệu trong nguồn đóMỗi bộ điều hợp nguồn dữ liệu có một biến đổi 943; . ______3945 ______3946 947 948 , . Đây là cách bạn sẽ đăng ký ____3945 ______3946 947 948 to your 68 root to create a 73: 57 58 59 60Xem để tìm hiểu thêm về cách đọc từ các nguồn dữ liệu khác nhau được Beam SDK hỗ trợ 3. 1. 2. Tạo PCollection từ dữ liệu trong bộ nhớĐể tạo một 73 từ một Java 959 trong bộ nhớ, bạn sử dụng biến đổi 94 do Beam cung cấp. Giống như 943 của bộ điều hợp dữ liệu, bạn áp dụng trực tiếp 94 cho chính đối tượng 68 của mìnhLà tham số, 94 chấp nhận đối tượng Java 959 và một đối tượng 966. 966 chỉ định cách các phần tử trong 959 nênĐể tạo một 73 từ một 970 trong bộ nhớ, bạn sử dụng biến đổi 94 do Beam cung cấp. Áp dụng biến đổi này trực tiếp cho chính đối tượng 68 của bạnĐể tạo một 73 từ một 974 trong bộ nhớ, bạn sử dụng biến đổi 975 do Beam cung cấp. Vượt qua đường dẫn 976 và 974 để chuyển đổi nàyĐể tạo một 73 từ một 979 trong bộ nhớ, bạn sử dụng biến đổi 94 do Beam cung cấp. Áp dụng biến đổi này trực tiếp cho đối tượng 981 của bạnMã ví dụ sau cho biết cách tạo một 73 từ bộ nhớ trong 983 970 974 . 979: 61 62 63 643. 2. Đặc tính bộ sưu tậpA 73 được sở hữu bởi đối tượng cụ thể 68 mà nó được tạo ra; . Ở một số khía cạnh, chức năng của lớp 73 giống như lớp 959. Tuy nhiên, một 73 có thể khác nhau theo một số cách chính. 3. 2. 1. Loại nguyên tốCác phần tử của 73 có thể thuộc bất kỳ loại nào, nhưng tất cả phải cùng loại. Tuy nhiên, để hỗ trợ xử lý phân tán, Beam cần có khả năng mã hóa từng phần tử riêng lẻ dưới dạng chuỗi byte (để các phần tử có thể được chuyển cho các công nhân phân tán). Beam SDK cung cấp cơ chế mã hóa dữ liệu bao gồm mã hóa tích hợp cho các loại thường được sử dụng cũng như hỗ trợ chỉ định mã hóa tùy chỉnh khi cần3. 2. 2. lược đồ phần tửTrong nhiều trường hợp, loại phần tử trong 73 có cấu trúc có thể xem xét nội tâm. Ví dụ là các bản ghi JSON, Bộ đệm giao thức, Avro và cơ sở dữ liệu. Các lược đồ cung cấp một cách để thể hiện các loại dưới dạng một tập hợp các trường được đặt tên, cho phép các tập hợp biểu cảm hơn3. 2. 3. tính bất biếnMột 73 là bất biến. Sau khi tạo, bạn không thể thêm, xóa hoặc thay đổi các thành phần riêng lẻ. Chuyển đổi Beam có thể xử lý từng thành phần của 73 và tạo dữ liệu đường ống mới (dưới dạng 73 mới), nhưng nó không sử dụng hoặc sửa đổi bộ sưu tập đầu vào ban đầu
3. 2. 4. Truy cập ngẫu nhiênMột 73 không hỗ trợ truy cập ngẫu nhiên vào các phần tử riêng lẻ. Thay vào đó, Beam Transforms xem xét từng phần tử trong một 73 riêng lẻ3. 2. 5. Kích thước và giới hạnMột 73 là một “túi” phần tử lớn, bất biến. Không có giới hạn trên về số lượng phần tử mà một 73 có thể chứa; Một 73 có thể có kích thước giới hạn hoặc không giới hạn. Một 73 có giới hạn biểu thị một tập dữ liệu có kích thước cố định, đã biết, trong khi một 73 không giới hạn biểu thị một tập dữ liệu có kích thước không giới hạn. Việc một 73 có giới hạn hay không giới hạn phụ thuộc vào nguồn của tập dữ liệu mà nó đại diện. Việc đọc từ nguồn dữ liệu lô, chẳng hạn như tệp hoặc cơ sở dữ liệu, sẽ tạo ra một 73 có giới hạn. Việc đọc từ nguồn dữ liệu phát trực tuyến hoặc cập nhật liên tục, chẳng hạn như Pub/Sub hoặc Kafka, sẽ tạo ra một 73 không giới hạn (trừ khi bạn yêu cầu rõ ràng là không làm như vậy)Bản chất bị chặn (hoặc không bị chặn) của 73 của bạn ảnh hưởng đến cách Beam xử lý dữ liệu của bạn. Có thể xử lý một 73 có giới hạn bằng cách sử dụng một công việc hàng loạt, có thể đọc toàn bộ tập dữ liệu một lần và thực hiện xử lý trong một công việc có độ dài hữu hạn. Một 73 không giới hạn phải được xử lý bằng cách sử dụng công việc phát trực tuyến chạy liên tục, vì toàn bộ bộ sưu tập không bao giờ có sẵn để xử lý cùng một lúcBeam sử dụng để phân chia một 73 không giới hạn cập nhật liên tục thành các cửa sổ logic có kích thước hữu hạn. Các cửa sổ logic này được xác định bởi một số đặc điểm được liên kết với một phần tử dữ liệu, chẳng hạn như dấu thời gian. Các biến đổi tổng hợp (chẳng hạn như 514 và 515) hoạt động trên cơ sở mỗi cửa sổ — khi tập dữ liệu được tạo, chúng xử lý từng 73 dưới dạng chuỗi liên tiếp của các cửa sổ hữu hạn này3. 2. 6. dấu thời gian phần tửMỗi phần tử trong một 73 có một dấu thời gian nội tại được liên kết. Dấu thời gian cho mỗi phần tử ban đầu được chỉ định bởi phần tử tạo ra 73. Các nguồn tạo 73 không giới hạn thường gán cho mỗi phần tử mới một dấu thời gian tương ứng với thời điểm phần tử được đọc hoặc thêm vào
Dấu thời gian rất hữu ích cho một 73 chứa các phần tử có khái niệm cố hữu về thời gian. Nếu quy trình bán hàng của bạn đang đọc một luồng sự kiện, chẳng hạn như Tweet hoặc các thông báo trên mạng xã hội khác, thì mỗi phần tử có thể sử dụng thời gian sự kiện được đăng làm dấu thời gian của phần tửBạn có thể tự gán dấu thời gian cho các thành phần của 73 nếu nguồn không làm việc đó cho bạn. Bạn sẽ muốn làm điều này nếu các phần tử có dấu thời gian vốn có, nhưng dấu thời gian nằm ở đâu đó trong cấu trúc của chính phần tử đó (chẳng hạn như trường “thời gian” trong mục nhập nhật ký máy chủ). Beam có đầu vào là 73 và đầu ra là một 73 giống hệt nhau có gắn dấu thời gian; 4. biến đổiChuyển đổi là các hoạt động trong quy trình của bạn và cung cấp khung xử lý chung. Bạn cung cấp logic xử lý dưới dạng một đối tượng chức năng (thường được gọi là “mã người dùng”) và mã người dùng của bạn được áp dụng cho từng thành phần của đầu vào 73 (hoặc nhiều hơn một 73). Tùy thuộc vào trình chạy đường ống và back-end mà bạn chọn, nhiều công nhân khác nhau trong một cụm có thể thực thi song song các phiên bản mã người dùng của bạn. Mã người dùng chạy trên mỗi công nhân tạo ra các phần tử đầu ra cuối cùng được thêm vào đầu ra cuối cùng 73 mà biến đổi tạo ra
Beam SDK chứa một số biến đổi khác nhau mà bạn có thể áp dụng cho các 73 của quy trình bán hàng của mình. Chúng bao gồm các biến đổi cốt lõi có mục đích chung, chẳng hạn như hoặc. Ngoài ra còn có các SDK được viết sẵn, kết hợp một hoặc nhiều biến đổi cốt lõi trong một mẫu xử lý hữu ích, chẳng hạn như đếm hoặc kết hợp các phần tử trong một bộ sưu tập. Bạn cũng có thể xác định các phép biến đổi tổng hợp phức tạp hơn của riêng mình để phù hợp với trường hợp sử dụng chính xác của đường ống dẫn của bạn4. 1. Áp dụng biến đổiĐể gọi một phép biến đổi, bạn phải áp dụng nó cho đầu vào 73. Mỗi biến đổi trong Beam SDK có một phương thức chung 531 (hoặc toán tử đường ống 532) . Gọi nhiều biến đổi Beam tương tự như chuỗi phương thức, nhưng có một chút khác biệt. Bạn áp dụng biến đổi cho đầu vào 73, chuyển chính biến đổi đó làm đối số và thao tác trả về đầu ra 73. Điều này có hình thức chung. 65 66 67 68Vì Beam sử dụng phương thức chung 531 cho 73, nên bạn có thể thực hiện cả hai phép biến đổi chuỗi một cách tuần tự và cũng có thể áp dụng các phép biến đổi có chứa các biến đổi khác được lồng bên trong (được gọi trong SDK Beam)Bạn nên tạo một biến mới cho mỗi 73 mới để chuyển đổi tuần tự dữ liệu đầu vào. Các 84 có thể được sử dụng để tạo các hàm chứa các biến đổi khác (được gọi trong Beam SDK)Cách bạn áp dụng các biến đổi của quy trình xác định cấu trúc quy trình của bạn. Cách tốt nhất để nghĩ về quy trình của bạn là biểu đồ tuần hoàn có hướng, trong đó các nút 78 là các chương trình con chấp nhận các nút ________ 073 làm đầu vào và phát ra các nút ________ 073 làm đầu ra. Ví dụ: bạn có thể xâu chuỗi các biến đổi lại với nhau để tạo một quy trình sửa đổi liên tục dữ liệu đầu vào. Ví dụ: bạn có thể gọi liên tục các biến đổi trên PCCollections để sửa đổi dữ liệu đầu vào. 69 0 1 2Biểu đồ của đường ống này trông giống như sau Hình 1. Một đường ống tuyến tính với ba phép biến đổi tuần tự Tuy nhiên, lưu ý rằng một phép biến đổi không tiêu thụ hoặc thay đổi bộ sưu tập đầu vào — hãy nhớ rằng theo định nghĩa, một 73 là bất biến. Điều này có nghĩa là bạn có thể áp dụng nhiều biến đổi cho cùng một đầu vào 73 để tạo một đường dẫn phân nhánh, như vậy 3 4 5 6Biểu đồ của đường ống phân nhánh này trông giống như sau Hình 2. Một đường ống phân nhánh. Hai biến đổi được áp dụng cho một PCCollection các hàng của bảng cơ sở dữ liệu Bạn cũng có thể xây dựng nhiều biến đổi lồng nhau bên trong một biến đổi đơn lớn hơn của riêng mình. Biến đổi tổng hợp đặc biệt hữu ích để xây dựng một chuỗi các bước đơn giản có thể tái sử dụng được sử dụng ở nhiều nơi khác nhau Cú pháp đường ống cho phép một người áp dụng PTransforms cho 544 và 545 của PCCollections cũng như cho những biến đổi chấp nhận nhiều đầu vào (chẳng hạn như 546 và 547)PTransforms cũng có thể được áp dụng cho bất kỳ 548 nào, bao gồm đối tượng Gốc, PCollections, mảng của 548 và các đối tượng có giá trị 548. Người ta có thể áp dụng các phép biến đổi cho các loại hỗn hợp này bằng cách bọc chúng bằng 551, e. g. 552PTransforms có hai dạng, đồng bộ và không đồng bộ, tùy thuộc vào việc ứng dụng của chúng* có liên quan đến các lệnh gọi không đồng bộ hay không. Một 553 phải được áp dụng với 554 và trả lại một 555 phải được chờ trước khi xây dựng đường ống tiếp theo4. 2. biến đổi Core BeamBeam cung cấp các biến đổi cốt lõi sau đây, mỗi biến đổi này đại diện cho một mô hình xử lý khác nhau
Typescript SDK cung cấp một số biến đổi cơ bản nhất dưới dạng các phương thức trên chính 734. 2. 1. ân xá 556 là một biến đổi Beam để xử lý song song chung. Mô hình xử lý 556 tương tự như giai đoạn “Bản đồ” của thuật toán kiểu Bản đồ/Xáo trộn/Giảm. biến đổi 556 xem xét từng phần tử trong đầu vào 73, thực hiện một số chức năng xử lý (mã người dùng của bạn) trên phần tử đó và phát ra 0, một hoặc nhiều phần tử cho đầu ra 73 556 hữu ích cho nhiều hoạt động xử lý dữ liệu phổ biến, bao gồm
Với những vai trò như vậy, 556 là một bước trung gian phổ biến trong quy trình. Bạn có thể sử dụng nó để trích xuất các trường nhất định từ một tập hợp các bản ghi đầu vào thô hoặc chuyển đổi đầu vào thô sang một định dạng khác; Khi bạn áp dụng biến đổi 556, bạn sẽ cần cung cấp mã người dùng ở dạng đối tượng 583. 583 là lớp Beam SDK xác định chức năng xử lý phân tán
Tất cả các DoFns phải được đăng ký bằng hàm 586 chung. Điều này cho phép Go SDK phỏng đoán mã hóa từ bất kỳ đầu vào/đầu ra nào, đăng ký DoFn để thực thi trên các trình chạy từ xa và tối ưu hóa quá trình thực thi thời gian chạy của DoFns thông qua phản ánh 74. 2. 1. 1. Áp dụng ParDoGiống như tất cả các biến đổi Beam, bạn áp dụng 556 bằng cách gọi phương thức 531 trên đầu vào 73 và chuyển 556 làm đối số, như được hiển thị trong mã ví dụ sau 591 áp dụng đối số được truyền trong 583 cho đầu vào 73, như thể hiện trong mã ví dụ sau 8 9 90 91Trong ví dụ, đầu vào 73 của chúng tôi chứa các giá trị ____3950 ____5596 . Chúng tôi áp dụng một biến đổi 556 chỉ định một hàm ( 598) để tính toán độ dài của mỗi chuỗi và đưa ra kết quả cho một 73 mới của 600 ______5601< . values that stores the length of each word.4. 2. 1. 2. Tạo DoFnĐối tượng 583 mà bạn chuyển đến 556 chứa logic xử lý được áp dụng cho các phần tử trong bộ sưu tập đầu vào. Khi bạn sử dụng Beam, thường thì những đoạn mã quan trọng nhất mà bạn sẽ viết là những 583 này - chúng là thứ xác định các tác vụ xử lý dữ liệu chính xác của quy trình bán hàng của bạn
Một 583 xử lý từng phần tử một từ đầu vào 73. Khi bạn tạo một lớp con của 583, bạn sẽ cần cung cấp các tham số loại phù hợp với các loại phần tử đầu vào và đầu ra. Nếu 583 của bạn xử lý các phần tử 950 đến và tạo ra các phần tử 600 cho tập hợp đầu ra (như ví dụ trước của chúng tôi, 598), khai báo lớp của bạn sẽ như thế nàyMột 583 xử lý từng phần tử một từ đầu vào 73. Khi bạn tạo một cấu trúc 583, bạn sẽ cần cung cấp các tham số loại phù hợp với các loại phần tử đầu vào và đầu ra trong một phương thức ProcessElement. Nếu 583 của bạn xử lý các phần tử 596 đến và tạo các phần tử 601 cho tập hợp đầu ra (như ví dụ trước của chúng tôi, 598), dofn của bạn có thể trông như thế này 92 93Bên trong lớp con 583 của bạn, bạn sẽ viết một phương thức được chú thích bằng 912 nơi bạn cung cấp logic xử lý thực tế. Bạn không cần trích xuất thủ công các phần tử từ bộ sưu tập đầu vào; . Phương thức 912 của bạn phải chấp nhận tham số được gắn thẻ 623, tham số này sẽ được điền bằng phần tử đầu vào. Để xuất các phần tử, phương thức cũng có thể nhận một tham số kiểu 624 cung cấp một phương thức để xuất các phần tử. Các loại tham số phải khớp với các loại đầu vào và đầu ra của 583 của bạn, nếu không khung sẽ phát sinh lỗi. Ghi chú. 623 và 624 đã được giới thiệu trong Beam 2. 5. 0; Bên trong lớp con 583 của bạn, bạn sẽ viết một phương thức 630 nơi bạn cung cấp logic xử lý thực tế. Bạn không cần trích xuất thủ công các phần tử từ bộ sưu tập đầu vào; . Phương thức 630 của bạn phải chấp nhận một đối số 632, là phần tử đầu vào và trả về một lần lặp với các giá trị đầu ra của nó. Bạn có thể thực hiện điều này bằng cách phát ra các phần tử riêng lẻ với các câu lệnh 633. Bạn cũng có thể sử dụng câu lệnh 634 có thể lặp lại, như danh sách hoặc trình tạoĐối với loại 583 của bạn, bạn sẽ viết một phương thức 636 nơi bạn cung cấp logic xử lý thực tế. Bạn không cần trích xuất thủ công các phần tử từ bộ sưu tập đầu vào; . Phương thức 636 của bạn phải chấp nhận tham số 632, là phần tử đầu vào. Để xuất các phần tử, phương thức cũng có thể nhận một tham số chức năng, có thể được gọi để xuất các phần tử. Các loại tham số phải khớp với các loại đầu vào và đầu ra của 583 của bạn, nếu không khung sẽ phát sinh lỗi 94 95 96 97DoFns đơn giản cũng có thể được viết dưới dạng hàm 98
Một phiên bản 583 nhất định thường được gọi một hoặc nhiều lần để xử lý một số gói phần tử tùy ý. Tuy nhiên, Beam không đảm bảo số lần gọi chính xác; . Như vậy, bạn có thể lưu trữ thông tin qua nhiều lệnh gọi đến phương thức xử lý của mình, nhưng nếu bạn làm như vậy, hãy đảm bảo rằng việc triển khai không phụ thuộc vào số lượng lệnh gọiTrong phương thức xử lý của mình, bạn cũng cần phải đáp ứng một số yêu cầu về tính không thay đổi để đảm bảo rằng Beam và back-end xử lý có thể tuần tự hóa và lưu trữ các giá trị trong quy trình của bạn một cách an toàn. Phương pháp của bạn phải đáp ứng các yêu cầu sau
4. 2. 1. 3. DoFns nhẹ và trừu tượng khácNếu chức năng của bạn tương đối đơn giản, bạn có thể đơn giản hóa việc sử dụng 556 của mình bằng cách cung cấp một nội tuyến 583 nhẹ, dưới dạng một thể hiện của lớp bên trong ẩn danh a lambda function an anonymous function a function passed to 660 or 661.Đây là ví dụ trước, 556 với 663, với 583 được chỉ định là thể hiện của lớp bên trong ẩn danh hàm lambda an anonymous function a function: 99 50 51 52Nếu 556 của bạn thực hiện ánh xạ một đối một giữa các phần tử đầu vào với các phần tử đầu ra–nghĩa là đối với mỗi phần tử đầu vào, nó áp dụng một hàm tạo ra chính xác một phần tử đầu ra, you can return that element directly.bạn có thể sử dụng biến đổi 666 667 cấp cao hơn. ______5666 có thể chấp nhận hàm lambda Java 8 ẩn danh để thêm phần ngắn gọn. Đây là ví dụ trước sử dụng 53 54 55 56
4. 2. 1. 4. vòng đời doFnĐây là sơ đồ trình tự hiển thị vòng đời của DoFn trong quá trình thực hiện biến đổi ParDo. Các nhận xét cung cấp thông tin hữu ích cho các nhà phát triển đường ống, chẳng hạn như các ràng buộc áp dụng cho các đối tượng hoặc các trường hợp cụ thể như chuyển đổi dự phòng hoặc tái sử dụng phiên bản. Họ cũng đưa ra các trường hợp sử dụng khởi tạo 4. 2. 2. NhómByKey 514 là một biến đổi Beam để xử lý tập hợp các cặp khóa/giá trị. Đó là một hoạt động giảm song song, tương tự như giai đoạn Xáo trộn của thuật toán kiểu Bản đồ/Xáo trộn/Giảm. Đầu vào của 514 là tập hợp các cặp khóa/giá trị đại diện cho nhiều ánh xạ, trong đó tập hợp chứa nhiều cặp có cùng khóa nhưng khác giá trị. Với một bộ sưu tập như vậy, bạn sử dụng 514 để thu thập tất cả các giá trị được liên kết với mỗi khóa duy nhất 514 là một cách hay để tổng hợp dữ liệu có điểm chung. Ví dụ: nếu bạn có một bộ sưu tập lưu trữ các bản ghi đơn đặt hàng của khách hàng, bạn có thể muốn nhóm tất cả các đơn đặt hàng từ cùng một mã bưu điện lại với nhau (trong đó “khóa” của cặp khóa/giá trị là trường mã bưu chính và “ Hãy xem xét cơ chế của 514 với một trường hợp ví dụ đơn giản, trong đó tập dữ liệu của chúng tôi bao gồm các từ trong tệp văn bản và số dòng mà chúng xuất hiện. Chúng tôi muốn nhóm tất cả các số dòng (giá trị) có cùng một từ (khóa) lại với nhau, cho phép chúng tôi xem tất cả các vị trí trong văn bản nơi một từ cụ thể xuất hiệnĐầu vào của chúng tôi là một 73 cặp khóa/giá trị trong đó mỗi từ là một khóa và giá trị là một số dòng trong tệp nơi từ đó xuất hiện. Đây là danh sách các cặp khóa/giá trị trong bộ sưu tập đầu vào 57 514 tập hợp tất cả các giá trị có cùng khóa và xuất ra một cặp mới bao gồm khóa duy nhất và tập hợp tất cả các giá trị được liên kết với khóa đó trong bộ sưu tập đầu vào. Nếu chúng tôi áp dụng 514 cho bộ sưu tập đầu vào của chúng tôi ở trên, bộ sưu tập đầu ra sẽ như thế này 58Do đó, 514 đại diện cho một phép biến đổi từ multimap (nhiều khóa thành các giá trị riêng lẻ) sang uni-map (các khóa duy nhất cho các bộ sưu tập giá trị)Sử dụng Mặc dù tất cả các SDK đều có biến đổi 514, nhưng việc sử dụng 687 thường tự nhiên hơn. Biến đổi 687 có thể được tham số hóa bằng (các) tên thuộc tính để nhóm các phần tử của PCollection hoặc một hàm lấy từng phần tử làm đầu vào ánh xạ tới một khóa để thực hiện nhóm trên đó 59 60 61 624. 2. 2. 1 GroupByKey và PCollections không giới hạnNếu bạn đang sử dụng các 73 không giới hạn, bạn phải sử dụng một trong hai hoặc một để thực hiện một 514 hoặc. Điều này là do một 514 hoặc 547 có giới hạn phải đợi tất cả dữ liệu có một khóa nhất định được thu thập, nhưng với các bộ sưu tập không giới hạn, dữ liệu là không giới hạn. Cửa sổ và/hoặc trình kích hoạt cho phép nhóm hoạt động trên các gói dữ liệu logic, hữu hạn trong các luồng dữ liệu không giới hạnNếu bạn áp dụng 514 hoặc 547 cho một nhóm 73 không giới hạn mà không đặt chiến lược cửa sổ không toàn cầu, chiến lược kích hoạt hoặc cả hai cho mỗi bộ sưu tập, Beam sẽ tạo ra lỗi IllegalStateException tại thời điểm xây dựng đường ốngKhi sử dụng 514 hoặc 547 để nhóm các 73 đã áp dụng, tất cả các 73 bạn muốn nhóm phải sử dụng cùng một chiến lược tạo cửa sổ và kích thước cửa sổ. Ví dụ: tất cả các bộ sưu tập bạn đang hợp nhất phải sử dụng cửa sổ cố định 5 phút giống hệt nhau (theo giả thuyết) hoặc cửa sổ trượt 4 phút bắt đầu cứ sau 30 giâyNếu đường ống của bạn cố gắng sử dụng 514 hoặc 547 để hợp nhất các 73 với các cửa sổ không tương thích, thì Beam sẽ tạo ra lỗi IllegalStateException tại thời điểm xây dựng đường ống4. 2. 3. CoGroupByKey 547 thực hiện liên kết quan hệ của hai hoặc nhiều khóa/giá trị 73 có cùng loại khóa. hiển thị một đường dẫn ví dụ sử dụng phép nốiCân nhắc sử dụng 547 nếu bạn có nhiều bộ dữ liệu cung cấp thông tin về những thứ liên quan. Ví dụ: giả sử bạn có hai tệp khác nhau chứa dữ liệu người dùng. một tệp có tên và địa chỉ email; . Bạn có thể kết hợp hai tập dữ liệu đó, sử dụng tên người dùng làm khóa chung và dữ liệu khác làm giá trị được liên kết. Sau khi tham gia, bạn có một tập dữ liệu chứa tất cả thông tin (địa chỉ email và số điện thoại) được liên kết với mỗi tênNếu bạn đang sử dụng các 73 không giới hạn, bạn phải sử dụng một trong hai hoặc một để thực hiện một 547. Xem để biết thêm chi tiếtTrong Beam SDK cho Java, 547 chấp nhận một bộ các 73 có khóa ( 710) làm đầu vào. Để đảm bảo an toàn cho loại, SDK yêu cầu bạn vượt qua từng 73 như một phần của 712. Bạn phải khai báo một 713 cho mỗi đầu vào 73 trong 712 mà bạn muốn chuyển đến 547. Là đầu ra, 547 trả về một 718, nhóm các giá trị từ tất cả các 73 đầu vào theo các khóa chung của chúng. Mỗi khóa (tất cả thuộc loại 720) sẽ có một 721 khác nhau, là bản đồ từ 722 đến 723. Bạn có thể truy cập một bộ sưu tập cụ thể trong một đối tượng 721 bằng cách sử dụng 713 mà bạn đã cung cấp cùng với bộ sưu tập ban đầuTrong Beam SDK dành cho Python, 547 chấp nhận một từ điển gồm các 73 có khóa làm đầu vào. Là đầu ra, 547 tạo một đầu ra duy nhất 73 chứa một bộ khóa/giá trị cho mỗi khóa trong các 73 đầu vào. Giá trị của mỗi khóa là một từ điển ánh xạ từng thẻ thành một giá trị có thể lặp lại bên dưới khóa của chúng trong 73 tương ứngTrong Beam Go SDK, 547 chấp nhận số lượng 73 tùy ý làm đầu vào. Là đầu ra, 547 tạo một đầu ra duy nhất 73 nhóm từng khóa với các hàm lặp giá trị cho mỗi đầu vào 73. Hàm iterator ánh xạ tới đầu vào 737 theo cùng thứ tự chúng được cung cấp cho 547Các ví dụ khái niệm sau đây sử dụng hai bộ sưu tập đầu vào để hiển thị cơ chế của 547Bộ dữ liệu đầu tiên có một 740 được gọi là 741 và chứa tên và địa chỉ email. Bộ dữ liệu thứ hai có một 740 được gọi là 743 và chứa tên và số điện thoạiTập dữ liệu đầu tiên chứa tên và địa chỉ email. Bộ dữ liệu thứ hai chứa tên và số điện thoại 63 64 65 66Sau 547, dữ liệu kết quả chứa tất cả dữ liệu được liên kết với từng khóa duy nhất từ bất kỳ bộ sưu tập đầu vào nào 67 68 69 70Ví dụ mã sau kết hợp hai 73 với 547, theo sau là một 556 để sử dụng kết quả. Sau đó, mã sử dụng các thẻ để tra cứu và định dạng dữ liệu từ mỗi bộ sưu tậpVí dụ mã sau kết hợp hai 73 với 547, theo sau là một 556 để sử dụng kết quả. Thứ tự của các tham số trình vòng lặp 583 ánh xạ tới thứ tự của các đầu vào 547 71 72 73 74Dữ liệu được định dạng trông như thế này 75 76 77 784. 2. 4. Phối hợp
515 có các biến thể hoạt động trên toàn bộ 73 và một số biến thể kết hợp các giá trị cho từng khóa trong các cặp khóa/giá trị 73. Khi bạn áp dụng biến đổi 515, bạn phải cung cấp hàm chứa logic để kết hợp các phần tử hoặc giá trị. Hàm kết hợp phải có tính chất giao hoán và kết hợp, vì hàm này không nhất thiết phải được gọi chính xác một lần trên tất cả các giá trị với một khóa đã cho. Do dữ liệu đầu vào (bao gồm cả tập hợp giá trị) có thể được phân phối trên nhiều công nhân nên hàm kết hợp có thể được gọi nhiều lần để thực hiện kết hợp từng phần trên các tập hợp con của tập hợp giá trị. Beam SDK cũng cung cấp một số hàm kết hợp được tạo sẵn cho các hoạt động kết hợp số phổ biến như tổng, tối thiểu và tối đaCác thao tác kết hợp đơn giản, chẳng hạn như tính tổng, thường có thể được triển khai dưới dạng một hàm đơn giản. Các hoạt động kết hợp phức tạp hơn có thể yêu cầu bạn tạo một lớp con của 761 có loại tích lũy khác với loại đầu vào/đầu ra. Tính kết hợp và tính giao hoán của 761 cho phép người chạy tự động áp dụng một số tối ưu hóa
4. 2. 4. 1. Kết hợp đơn giản sử dụng chức năng đơn giảnMã ví dụ sau hiển thị một hàm kết hợp đơn giản. Việc kết hợp được thực hiện bằng cách sửa đổi biến đổi nhóm bằng phương pháp 79 80 81 82Tất cả các Bộ kết hợp phải được đăng ký bằng hàm 766 chung. Điều này cho phép SDK Go suy ra mã hóa từ bất kỳ đầu vào/đầu ra nào, đăng ký Bộ kết hợp để thực thi trên các trình chạy từ xa và tối ưu hóa quá trình thực thi thời gian chạy của Bộ kết hợp thông qua phản chiếuCombiner1 nên được sử dụng khi bộ tích lũy, đầu vào và đầu ra của bạn đều cùng loại. Nó có thể được gọi với 767 trong đó 768 là loại đầu vào/bộ tích lũy/đầu raCombiner2 nên được sử dụng khi bộ tích lũy, đầu vào và đầu ra của bạn là 2 loại riêng biệt. Nó có thể được gọi với 769 trong đó 770 là loại bộ tích lũy và 771 là loại khácCombiner3 nên được sử dụng khi bộ tích lũy, đầu vào và đầu ra của bạn là 3 loại riêng biệt. Nó có thể được gọi với ________ 5772 trong đó _________ 5770 là loại bộ tích lũy, ________ 5771 là loại đầu vào và 775 là loại đầu ra4. 2. 4. 2. Kết hợp nâng cao sử dụng CombineFnĐối với các hàm kết hợp phức tạp hơn, bạn có thể định nghĩa một lớp con của 761. Bạn nên sử dụng 761 nếu chức năng kết hợp yêu cầu bộ tích lũy tinh vi hơn, phải thực hiện xử lý bổ sung trước hoặc sau, có thể thay đổi loại đầu ra hoặc tính đến khóa. Một thao tác kết hợp chung bao gồm bốn thao tác. Khi bạn tạo một lớp con của 761, bạn phải cung cấp bốn thao tác bằng cách ghi đè các phương thức tương ứng.
Mã ví dụ sau đây cho biết cách xác định một 761 để tính trung bình cộng 83 84 85 86
4. 2. 4. 3. Kết hợp một PCollection thành một giá trị duy nhấtSử dụng kết hợp toàn cầu để chuyển đổi tất cả các phần tử trong một 73 nhất định thành một giá trị duy nhất, được biểu thị trong quy trình bán hàng của bạn dưới dạng một 73 mới chứa một phần tử. Mã ví dụ sau đây cho biết cách áp dụng hàm kết hợp tổng do Beam cung cấp để tạo ra một giá trị tổng duy nhất cho 73 số nguyên 87 88 89 404. 2. 4. 4. Kết hợp và cửa sổ toàn cầuNếu đầu vào của bạn 73 sử dụng cửa sổ chung mặc định, hành vi mặc định là trả về một 73 có chứa một mục. Giá trị của mặt hàng đó đến từ bộ tích lũy trong hàm kết hợp mà bạn đã chỉ định khi áp dụng 515. Ví dụ: hàm kết hợp tổng do Beam cung cấp trả về giá trị 0 (tổng của đầu vào trống), trong khi hàm kết hợp nhỏ nhất trả về giá trị lớn nhất hoặc vô hạnThay vào đó, để có 515 trả về một giá trị 73 trống nếu đầu vào trống, hãy chỉ định 789 khi bạn áp dụng biến đổi 515 của mình, như trong ví dụ mã sau 41 42 43 444. 2. 4. 5. Cửa sổ kết hợp và không toàn cầuNếu 73 của bạn sử dụng bất kỳ chức năng cửa sổ không toàn cầu nào, Beam sẽ không cung cấp hành vi mặc định. Bạn phải chỉ định một trong các tùy chọn sau khi đăng ký 515
Nếu 73 của bạn sử dụng bất kỳ chức năng tạo cửa sổ không toàn cục nào, SDK Beam Go sẽ hoạt động giống như với tính năng tạo cửa sổ toàn cục. Cửa sổ trống trong đầu vào 73 cũng sẽ trống trong bộ sưu tập đầu ra4. 2. 4. 6. Kết hợp các giá trị trong một PCollection có khóaSau khi tạo một PCollection có khóa (ví dụ: bằng cách sử dụng biến đổi 514), một mẫu phổ biến là kết hợp tập hợp các giá trị được liên kết với từng khóa thành một giá trị được hợp nhất. Dựa trên ví dụ trước từ ________ 5514, một ________ 073 được nhóm khóa có tên là ________ 5803 trông như thế này 45Trong 73 ở trên, mỗi phần tử có một khóa chuỗi (ví dụ: “cat”) và một số nguyên có thể lặp lại cho giá trị của nó (trong phần tử đầu tiên, chứa [1, 5, 9]). Nếu bước xử lý tiếp theo trong quy trình của chúng tôi kết hợp các giá trị (thay vì xem xét chúng riêng lẻ), bạn có thể kết hợp các số nguyên có thể lặp lại để tạo một giá trị hợp nhất duy nhất để ghép nối với từng khóa. Mẫu này của một 514 theo sau là hợp nhất tập hợp các giá trị tương đương với biến đổi Kết hợp PerKey của Beam. Hàm kết hợp mà bạn cung cấp cho Combine PerKey phải là hàm rút gọn kết hợp hoặc một lớp con của 761. 46 47 48 494. 2. 5. làm phẳng
546 hợp nhất nhiều đối tượng 73 thành một đối tượng logic duy nhất 73. Ví dụ sau đây cho thấy cách áp dụng biến đổi 546 để hợp nhất nhiều đối tượng 73 500 501 502 5034. 2. 5. 1. Mã hóa dữ liệu trong các bộ sưu tập hợp nhấtTheo mặc định, bộ mã hóa cho đầu ra 73 giống với bộ mã hóa cho 73 đầu tiên trong đầu vào 819. Tuy nhiên, mỗi đối tượng 73 đầu vào có thể sử dụng các bộ mã hóa khác nhau, miễn là tất cả chúng đều chứa cùng một loại dữ liệu trong ngôn ngữ bạn chọn4. 2. 5. 2. Hợp nhất các bộ sưu tập có cửa sổKhi sử dụng 546 để hợp nhất các đối tượng 73 đã áp dụng chiến lược tạo cửa sổ, tất cả các đối tượng 73 mà bạn muốn hợp nhất phải sử dụng chiến lược tạo cửa sổ và định cỡ cửa sổ tương thích. Ví dụ: tất cả các bộ sưu tập mà bạn đang hợp nhất đều phải sử dụng (theo giả thuyết) các cửa sổ cố định 5 phút giống hệt nhau hoặc cửa sổ trượt 4 phút bắt đầu cứ sau 30 giâyNếu quy trình của bạn cố gắng sử dụng 546 để hợp nhất các đối tượng 73 với các cửa sổ không tương thích, Beam sẽ tạo ra lỗi 826 khi quy trình của bạn được xây dựng4. 2. 6. Vách ngăn
561 tách một 73 thành một số lượng cố định các bộ sưu tập nhỏ hơn. Thông thường, trong TypeScript SDK, biến đổi 834 sẽ tự nhiên hơn khi sử dụng 561 phân chia các phần tử của 73 theo chức năng phân vùng mà bạn cung cấp. Hàm phân vùng chứa logic xác định cách tách các phần tử của đầu vào 73 thành từng phân vùng kết quả 73. Số lượng phân vùng phải được xác định tại thời điểm xây dựng biểu đồ. Ví dụ: bạn có thể chuyển số lượng phân vùng dưới dạng tùy chọn dòng lệnh trong thời gian chạy (sau đó sẽ được sử dụng để xây dựng biểu đồ quy trình của bạn), nhưng bạn không thể xác định số lượng phân vùng ở giữa quy trình (dựa trên dữ liệu được tính toán sau Ví dụ sau chia một 73 thành các nhóm phần trăm 504 505 506 5074. 3. Yêu cầu viết mã người dùng cho biến đổi BeamKhi bạn xây dựng mã người dùng cho biến đổi Beam, bạn nên ghi nhớ bản chất thực thi phân tán. Ví dụ: có thể có nhiều bản sao chức năng của bạn chạy song song trên nhiều máy khác nhau và các bản sao đó hoạt động độc lập, không giao tiếp hoặc chia sẻ trạng thái với bất kỳ bản sao nào khác. Tùy thuộc vào Trình chạy đường ống và xử lý back-end mà bạn chọn cho đường ống của mình, mỗi bản sao chức năng mã người dùng của bạn có thể được thử lại hoặc chạy nhiều lần. Do đó, bạn nên thận trọng khi đưa những thứ như trạng thái phụ thuộc vào mã người dùng của mình Nói chung, mã người dùng của bạn phải đáp ứng ít nhất các yêu cầu này
Ngoài ra, bạn nên đặt đối tượng chức năng của mình là idempotent. Các chức năng không bình thường được Beam hỗ trợ, nhưng cần suy nghĩ thêm để đảm bảo tính chính xác khi có tác dụng phụ bên ngoài
4. 3. 1. Khả năng tuần tự hóaMọi đối tượng hàm bạn cung cấp cho một biến đổi phải được tuần tự hóa hoàn toàn. Điều này là do một bản sao của hàm cần được đánh số thứ tự và truyền tới một nhân viên từ xa trong cụm xử lý của bạn. Các lớp cơ sở cho mã người dùng, chẳng hạn như Một số yếu tố khả năng tuần tự hóa khác mà bạn nên ghi nhớ là
4. 3. 2. Khả năng tương thích chủ đềĐối tượng chức năng của bạn phải tương thích với luồng. Mỗi phiên bản của đối tượng chức năng của bạn được truy cập bởi một luồng duy nhất tại một thời điểm trên phiên bản worker, trừ khi bạn tạo các luồng của riêng mình một cách rõ ràng. Tuy nhiên, xin lưu ý rằng SDK Beam không an toàn cho luồng. Nếu bạn tạo chủ đề của riêng mình trong mã người dùng, bạn phải cung cấp đồng bộ hóa của riêng mình. Lưu ý rằng các thành viên tĩnh trong đối tượng chức năng của bạn không được chuyển đến các phiên bản worker và nhiều phiên bản chức năng của bạn có thể được truy cập từ các luồng khác nhau. 4. 3. 3. bất lựcBạn nên đặt đối tượng chức năng của mình là idempotent–nghĩa là nó có thể được lặp lại hoặc thử lại thường xuyên nếu cần mà không gây ra các tác dụng phụ ngoài ý muốn. Các chức năng không bình thường được hỗ trợ, tuy nhiên, mô hình Beam không đảm bảo về số lần mã người dùng của bạn có thể được gọi hoặc thử lại; 4. 4. đầu vào bênNgoài đầu vào chính 73, bạn có thể cung cấp thêm đầu vào cho biến đổi 556 ở dạng đầu vào phụ. Đầu vào phụ là đầu vào bổ sung mà 583 của bạn có thể truy cập mỗi khi nó xử lý một phần tử trong đầu vào 73. Khi bạn chỉ định đầu vào phụ, bạn tạo chế độ xem một số dữ liệu khác có thể được đọc từ bên trong biến đổi ________ 5556 của biến đổi ________ 5583 trong khi xử lý từng phần tửĐầu vào phụ hữu ích nếu 556 của bạn cần thêm dữ liệu bổ sung khi xử lý từng phần tử trong đầu vào 73, nhưng dữ liệu bổ sung cần được xác định trong thời gian chạy (và không được mã hóa cứng). Các giá trị như vậy có thể được xác định bởi dữ liệu đầu vào hoặc phụ thuộc vào một nhánh khác trong quy trình của bạnTất cả các lần lặp đầu vào bên phải được đăng ký bằng hàm 867 chung. Điều này tối ưu hóa việc thực thi thời gian chạy của iterable4. 4. 1. Truyền đầu vào bên cho ParDo 508 509 510 5114. 4. 2. Đầu vào bên và cửa sổMột 73 có cửa sổ có thể là vô hạn và do đó không thể được nén thành một giá trị duy nhất (hoặc một lớp bộ sưu tập duy nhất). Khi bạn tạo một 796 của một 73 có cửa sổ, thì 796 đại diện cho một thực thể duy nhất trên mỗi cửa sổ (một đơn vị trên mỗi cửa sổ, một danh sách trên mỗi cửa sổ, v.v. )Beam sử dụng (các) cửa sổ cho phần tử đầu vào chính để tra cứu cửa sổ thích hợp cho phần tử đầu vào phụ. Beam chiếu cửa sổ của phần tử đầu vào chính vào bộ cửa sổ của đầu vào bên, sau đó sử dụng đầu vào bên từ cửa sổ kết quả. Nếu đầu vào chính và đầu vào phụ có các cửa sổ giống hệt nhau, phép chiếu sẽ cung cấp chính xác cửa sổ tương ứng. Tuy nhiên, nếu đầu vào có các cửa sổ khác nhau, Beam sẽ sử dụng phép chiếu để chọn cửa sổ đầu vào bên thích hợp nhất Ví dụ: nếu đầu vào chính được tạo cửa sổ bằng cách sử dụng cửa sổ có thời gian cố định là một phút và đầu vào bên được hiển thị bằng cửa sổ có thời gian cố định là một giờ, thì Beam sẽ chiếu cửa sổ đầu vào chính dựa trên bộ cửa sổ đầu vào bên và chọn đầu vào bên Nếu phần tử đầu vào chính tồn tại trong nhiều cửa sổ, thì 872 được gọi nhiều lần, một lần cho mỗi cửa sổ. Mỗi lần gọi đến 872 sẽ chiếu cửa sổ “hiện tại” cho phần tử đầu vào chính và do đó có thể cung cấp một chế độ xem khác nhau về đầu vào phụ mỗi lầnNếu đầu vào bên có nhiều lần kích hoạt kích hoạt, Beam sẽ sử dụng giá trị từ lần kích hoạt mới nhất. Điều này đặc biệt hữu ích nếu bạn sử dụng đầu vào phụ với một cửa sổ chung duy nhất và chỉ định trình kích hoạt 4. 5. đầu ra bổ sungMặc dù 556 luôn tạo ra một đầu ra chính 73 (là giá trị trả về từ 531), bạn cũng có thể yêu cầu 556 của mình tạo ra bất kỳ số lượng đầu ra bổ sung nào của 73. Nếu bạn chọn có nhiều đầu ra, thì 556 của bạn sẽ trả về tất cả các 73 đầu ra (bao gồm cả đầu ra chính) được gộp lại với nhauMặc dù 591 luôn tạo ra đầu ra 73, nhưng 583 của bạn có thể tạo ra bất kỳ số lượng đầu ra bổ sung nào của 737 hoặc thậm chí không có đầu ra nào. Nếu bạn chọn có nhiều đầu ra, thì 583 của bạn cần được gọi bằng hàm 556 khớp với số lượng đầu ra. 887 cho hai đầu ra 73, 889 cho ba đầu ra, v.v. cho đến khi 890. Nếu bạn cần thêm, bạn có thể sử dụng 891 sẽ trả về một 892Trong khi 556 luôn tạo ra đầu ra chính 73 (dưới dạng giá trị trả về từ 531). Nếu bạn muốn có nhiều đầu ra, hãy phát ra một đối tượng có các thuộc tính riêng biệt trong thao tác 556 của bạn và làm theo thao tác này với một 834 để chia nó thành nhiều 734. 5. 1. Thẻ cho nhiều đầu ra 834 PTransform sẽ lấy một PCCollection của các phần tử có dạng 400 và trả về một đối tượng 401. Tập hợp các thẻ mong muốn được chuyển đến hoạt động; SDK Go không sử dụng thẻ đầu ra mà thay vào đó sử dụng thứ tự theo vị trí cho nhiều PCCollections đầu ra 512 513 514 5154. 5. 2. Phát ra nhiều đầu ra trong DoFn của bạnGọi các hàm trình phát khi cần để tạo 0 hoặc nhiều phần tử để khớp với nó 73. Cùng một giá trị có thể được phát ra với nhiều bộ phát. Như bình thường, không thay đổi giá trị sau khi phát chúng từ bất kỳ bộ phát nàoTất cả các trình phát phải được đăng ký bằng hàm 404 chung. Điều này tối ưu hóa việc thực thi thời gian chạy của bộ phátDoFns cũng có thể trả về một phần tử thông qua trả về tiêu chuẩn. Trả về tiêu chuẩn luôn là PCollection đầu tiên được trả về từ chùm. ân xá. Các trình phát khác xuất ra PCCollections của riêng chúng theo thứ tự tham số đã xác định 516 517 518 5194. 5. 3. Truy cập các tham số bổ sung trong DoFn của bạnNgoài phần tử và 624, Beam sẽ điền các tham số khác vào phương thức 912 của DoFn của bạn. Bất kỳ sự kết hợp nào của các tham số này đều có thể được thêm vào phương thức quy trình của bạn theo bất kỳ thứ tự nàoNgoài phần tử, Beam sẽ đưa các tham số khác vào phương thức 630 của DoFn của bạn. Bất kỳ sự kết hợp nào của các tham số này đều có thể được thêm vào phương thức quy trình của bạn theo bất kỳ thứ tự nàoNgoài phần tử, Beam sẽ đưa các tham số khác vào phương thức 630 của DoFn của bạn. Chúng có sẵn bằng cách đặt các bộ truy cập trong đối số ngữ cảnh, giống như đối với các đầu vào bênNgoài phần tử, Beam sẽ điền các tham số khác vào phương thức 636 của DoFn của bạn. Bất kỳ sự kết hợp nào của các tham số này đều có thể được thêm vào phương thức quy trình của bạn theo thứ tự tiêu chuẩnbối cảnh. Bối cảnh. Để hỗ trợ ghi nhật ký tổng hợp và số liệu do người dùng xác định, có thể yêu cầu tham số 410. Các quy ước Per Go, nếu có, nó bắt buộc phải là tham số đầu tiên của phương thức 583 520dấu thời gian. Để truy cập dấu thời gian của một phần tử đầu vào, hãy thêm một tham số được chú thích bằng 412 thuộc loại 413. Ví dụdấu thời gian. Để truy cập dấu thời gian của phần tử đầu vào, hãy thêm tham số từ khóa mặc định vào 414. Ví dụdấu thời gian. Để truy cập dấu thời gian của phần tử đầu vào, hãy thêm tham số 415 trước phần tử. Ví dụdấu thời gian. Để truy cập vào cửa sổ có phần tử đầu vào, hãy thêm ____6416 vào đối số ngữ cảnh 521 522 523 524Cửa sổ. Để truy cập vào cửa sổ mà phần tử đầu vào rơi vào, hãy thêm tham số loại cửa sổ được sử dụng cho đầu vào 73. Nếu tham số là loại cửa sổ (một lớp con của 418) không khớp với đầu vào 73 thì sẽ xảy ra lỗi. Nếu một phần tử nằm trong nhiều cửa sổ (ví dụ: điều này sẽ xảy ra khi sử dụng 420), thì phương thức 912 sẽ được gọi nhiều lần cho phần tử, một lần cho mỗi cửa sổ. Ví dụ: khi cửa sổ cố định đang được sử dụng, cửa sổ thuộc loại 422Cửa sổ. Để truy cập vào cửa sổ có phần tử đầu vào, hãy thêm tham số từ khóa mặc định vào 423. Nếu một phần tử nằm trong nhiều cửa sổ (ví dụ: điều này sẽ xảy ra khi sử dụng 420), thì phương thức 630 sẽ được gọi nhiều lần cho phần tử, một lần cho mỗi cửa sổCửa sổ. Để truy cập cửa sổ có phần tử đầu vào, hãy thêm tham số 426 trước phần tử. Nếu một phần tử nằm trong nhiều cửa sổ (ví dụ: điều này sẽ xảy ra khi sử dụng SlidingWindows), thì phương thức 636 sẽ được gọi nhiều lần cho phần tử, một lần cho mỗi cửa sổ. Vì 426 là một giao diện nên có thể nhập khẳng định để triển khai cụ thể cửa sổ. Ví dụ: khi cửa sổ cố định đang được sử dụng, cửa sổ thuộc loại 429Cửa sổ. Để truy cập vào cửa sổ có phần tử đầu vào, hãy thêm ____6416 vào đối số ngữ cảnh. Nếu một phần tử nằm trong nhiều cửa sổ (ví dụ: điều này sẽ xảy ra khi sử dụng 420), thì hàm sẽ được gọi nhiều lần cho phần tử, một lần cho mỗi cửa sổ 525 526 527 528PaneInfo. Khi kích hoạt được sử dụng, Beam cung cấp đối tượng 432 chứa thông tin về kích hoạt hiện tại. Sử dụng 432, bạn có thể xác định xem đây là lần kích hoạt sớm hay muộn và cửa sổ này đã kích hoạt bao nhiêu lần cho khóa nàyPaneInfo. Khi kích hoạt được sử dụng, Beam cung cấp đối tượng 434 chứa thông tin về kích hoạt hiện tại. Sử dụng 434, bạn có thể xác định xem đây là lần kích hoạt sớm hay muộn và cửa sổ này đã kích hoạt bao nhiêu lần cho khóa này. Việc triển khai tính năng này trong Python SDK chưa được hoàn thành đầy đủ; PaneInfo. Khi kích hoạt được sử dụng, Beam cung cấp đối tượng 436 chứa thông tin về kích hoạt hiện tại. Sử dụng 436, bạn có thể xác định xem đây là lần kích hoạt sớm hay muộn và cửa sổ này đã kích hoạt bao nhiêu lần cho khóa nàyCửa sổ. Để truy cập vào cửa sổ có phần tử đầu vào, hãy thêm ____6438 vào đối số ngữ cảnh. Sử dụng 436, bạn có thể xác định xem đây là lần kích hoạt sớm hay muộn và cửa sổ này đã kích hoạt bao nhiêu lần cho khóa này 529 530 531 532Tùy chọn đường ống. Luôn có thể truy cập 913 cho quy trình hiện tại trong một phương thức quy trình bằng cách thêm nó làm tham số 533Các phương thức 441 cũng có thể truy cập nhiều tham số này. Tất cả các tham số Dấu thời gian, Cửa sổ, khóa, 913, 624 và 444 đều có thể được truy cập theo phương thức 441. Ngoài ra, phương thức 441 có thể nhận tham số kiểu 447 cho biết bộ đếm thời gian dựa trên thời gian sự kiện hay thời gian xử lý. Bộ hẹn giờ được giải thích chi tiết hơn trong bài đăng trên blog Xử lý kịp thời (và có trạng thái) với Apache BeamHẹn giờ và trạng thái. Ngoài các tham số đã nói ở trên, các tham số Trạng thái và Hẹn giờ do người dùng xác định có thể được sử dụng trong DoFn có trạng thái. Bộ hẹn giờ và trạng thái được giải thích chi tiết hơn trong bài đăng trên blog Xử lý kịp thời (và có trạng thái) với Apache Beam Hẹn giờ và trạng thái. Các tham số Trạng thái do người dùng xác định có thể được sử dụng trong DoFn có trạng thái. Bộ hẹn giờ chưa được triển khai trong Go SDK; . Sau khi được triển khai, các tham số Hẹn giờ do người dùng xác định có thể được sử dụng trong DoFn có trạng thái. Bộ hẹn giờ và trạng thái được giải thích chi tiết hơn trong bài đăng trên blog Xử lý kịp thời (và có trạng thái) với Apache Beam Hẹn giờ và trạng thái. Tính năng này chưa được triển khai trong TypeScript SDK, nhưng chúng tôi hoan nghênh các đóng góp. Trong thời gian chờ đợi, các đường ống Bản mô tả muốn sử dụng trạng thái và bộ hẹn giờ có thể làm như vậy bằng cách sử dụng 534 535 5364. 6. biến đổi tổ hợpCác phép biến đổi có thể có cấu trúc lồng nhau, trong đó một phép biến đổi phức tạp thực hiện nhiều phép biến đổi đơn giản hơn (chẳng hạn như nhiều biến đổi 556, 515, 514 hoặc thậm chí các phép biến đổi hỗn hợp khác). Các phép biến hình này được gọi là phép biến hình tổ hợp. Việc lồng nhiều biến đổi bên trong một biến đổi tổng hợp duy nhất có thể làm cho mã của bạn trở nên mô đun hơn và dễ hiểu hơnBeam SDK đi kèm với nhiều biến đổi tổng hợp hữu ích. Xem các trang tham chiếu API để biết danh sách các biến đổi
4. 6. 1. Một ví dụ biến đổi tổng hợpBiến đổi 451 trong chương trình ví dụ WordCount là một ví dụ về biến đổi tổng hợp. 451 là một lớp con của 78 subclass bao gồm nhiều phép biến đổi lồng nhau. Trong phương pháp 451 áp dụng các thao tác biến đổi sau.
537 538 539 540
4. 6. 2. Tạo một biến đổi tổng hợpMột PTransform trong Typescript SDK chỉ đơn giản là một chức năng chấp nhận và trả về các 548, chẳng hạn như các 73Để tạo biến đổi tổng hợp của riêng bạn, hãy tạo một lớp con của lớp 78 và ghi đè phương thức 454 để chỉ định logic xử lý thực tế. Sau đó, bạn có thể sử dụng biến đổi này giống như cách bạn sử dụng biến đổi tích hợp từ Beam SDKĐối với các tham số loại lớp 78, bạn chuyển các loại 73 mà biến đổi của bạn lấy làm đầu vào và tạo ra làm đầu ra. Để lấy nhiều 73 làm đầu vào hoặc tạo nhiều 73 làm đầu ra, hãy sử dụng một trong các loại nhiều bộ sưu tập cho tham số loại có liên quanĐể tạo 78 tổng hợp của riêng bạn, hãy gọi phương thức 84 trên biến phạm vi đường ống hiện tại. Các phép biến đổi được thông qua sub- 84 mới này sẽ là một phần của cùng một 78 tổng hợpĐể có thể sử dụng lại Tổng hợp của bạn, hãy xây dựng nó bên trong một hàm hoặc phương thức Go thông thường. Hàm này được truyền một phạm vi và PCollections đầu vào, đồng thời trả về bất kỳ PCCollections đầu ra nào mà nó tạo ra. Ghi chú. Các chức năng như vậy không thể được chuyển trực tiếp đến các chức năng 556Mẫu mã sau đây cho biết cách khai báo một 78 chấp nhận một 73 của 950 cho đầu vào và xuất ra một 73 của 600 541 542 539Trong lớp con 78 của bạn, bạn sẽ cần ghi đè phương thức 454. Phương thức 454 là nơi bạn thêm logic xử lý cho 78. Quyền ghi đè của bạn đối với 454 phải chấp nhận loại đầu vào phù hợp 73 làm tham số và chỉ định đầu ra 73 làm giá trị trả vềMẫu mã sau đây cho thấy cách ghi đè 454 cho lớp 490 được khai báo trong ví dụ trướcMẫu mã sau đây cho biết cách gọi PTransform tổng hợp 451, thêm nó vào quy trình của bạn 544 542 546Miễn là bạn ghi đè phương thức 454 trong lớp con 78 của mình để chấp nhận (các) đầu vào thích hợp 73 và trả về (các) đầu ra tương ứng 73, thì bạn có thể bao gồm bao nhiêu biến đổi tùy thích. Các biến đổi này có thể bao gồm các biến đổi lõi, biến đổi tổng hợp hoặc các biến đổi có trong thư viện Beam SDKCác 78 tổng hợp của bạn có thể bao gồm bao nhiêu biến đổi tùy thích. Các biến đổi này có thể bao gồm các biến đổi lõi, các biến đổi tổng hợp khác hoặc các biến đổi có trong thư viện Beam SDK. Họ cũng có thể tiêu thụ và trả lại bao nhiêu 73 nếu cầnCác tham số và giá trị trả về của biến đổi tổng hợp của bạn phải khớp với loại đầu vào ban đầu và loại trả về cuối cùng cho toàn bộ biến đổi, ngay cả khi dữ liệu trung gian của biến đổi thay đổi loại nhiều lần Ghi chú. Phương thức 454 của 78 không có nghĩa là được gọi trực tiếp bởi người dùng biến đổi. Thay vào đó, bạn nên gọi phương thức 531 trên chính 73, với biến đổi làm đối số. Điều này cho phép các biến đổi được lồng vào trong cấu trúc đường ống của bạn4. 6. 3. Hướng dẫn Phong cách PTransformHướng dẫn về Phong cách PTransform chứa thông tin bổ sung không có ở đây, chẳng hạn như hướng dẫn về phong cách, hướng dẫn kiểm tra và ghi nhật ký cũng như các cân nhắc về ngôn ngữ cụ thể. Hướng dẫn này là điểm khởi đầu hữu ích khi bạn muốn viết các PTransform tổng hợp mới 5. Đường ống I/OKhi bạn tạo một đường dẫn, bạn thường cần đọc dữ liệu từ một số nguồn bên ngoài, chẳng hạn như tệp hoặc cơ sở dữ liệu. Tương tự như vậy, bạn có thể muốn quy trình của mình xuất dữ liệu kết quả sang hệ thống lưu trữ bên ngoài. Beam cung cấp các biến đổi đọc và ghi cho một số loại lưu trữ dữ liệu phổ biến. Nếu bạn muốn quy trình của mình đọc hoặc ghi sang định dạng lưu trữ dữ liệu không được hỗ trợ bởi các biến đổi tích hợp, bạn có thể triển khai các biến đổi đọc và ghi của riêng mình 5. 1. Đọc dữ liệu đầu vàoBiến đổi đọc đọc dữ liệu từ một nguồn bên ngoài và trả về một đại diện dữ liệu 73 để đường dẫn của bạn sử dụng. Bạn có thể sử dụng biến đổi đọc tại bất kỳ thời điểm nào trong khi xây dựng quy trình của mình để tạo một 73 mới, mặc dù nó sẽ phổ biến nhất khi bắt đầu quy trình của bạn 547 548 5495. 2. Ghi dữ liệu đầu raBiến đổi ghi ghi dữ liệu trong 73 vào nguồn dữ liệu ngoài. Bạn thường sẽ sử dụng các biến đổi ghi ở cuối quy trình để xuất kết quả cuối cùng của quy trình. Tuy nhiên, bạn có thể sử dụng biến đổi ghi để xuất dữ liệu của 73 tại bất kỳ điểm nào trong quy trình của bạn 550 551 5525. 3. Dữ liệu đầu vào và đầu ra dựa trên tệp5. 3. 1. Đọc từ nhiều địa điểmNhiều biến đổi đọc hỗ trợ đọc từ nhiều tệp đầu vào khớp với toán tử toàn cầu mà bạn cung cấp. Lưu ý rằng các toán tử toàn cục dành riêng cho hệ thống tệp và tuân theo các mô hình nhất quán dành riêng cho hệ thống tệp. Ví dụ TextIO sau đây sử dụng toán tử toàn cầu (_______45006) để đọc tất cả các tệp đầu vào phù hợp có tiền tố “đầu vào-” và hậu tố “. csv” ở vị trí nhất định 553 554 555Để đọc dữ liệu từ các nguồn khác nhau vào một 73 duy nhất, hãy đọc từng nguồn một cách độc lập rồi sử dụng phép biến đổi để tạo một 73 duy nhất5. 3. 2. Ghi vào nhiều tệp đầu raĐối với dữ liệu đầu ra dựa trên tệp, ghi biến đổi ghi vào nhiều tệp đầu ra theo mặc định. Khi bạn chuyển tên tệp đầu ra cho một biến đổi ghi, tên tệp được sử dụng làm tiền tố cho tất cả các tệp đầu ra mà biến đổi ghi tạo ra. Bạn có thể thêm một hậu tố vào mỗi tệp đầu ra bằng cách chỉ định một hậu tố Ví dụ chuyển đổi ghi sau đây ghi nhiều tệp đầu ra vào một vị trí. Mỗi tệp có tiền tố “số”, thẻ số và hậu tố “. csv” 556 557 5585. 4. Biến đổi I/O do tia cung cấpXem trang Biến đổi I/O do Beam cung cấp để biết danh sách các biến đổi I/O hiện có 6. lược đồThông thường, các loại hồ sơ đang được xử lý có cấu trúc rõ ràng. Các nguồn Beam phổ biến tạo ra các đối tượng hàng JSON, Avro, Bộ đệm giao thức hoặc cơ sở dữ liệu; . Ngay cả trong một đường dẫn SDK, các POJO Java đơn giản (hoặc các cấu trúc tương đương trong các ngôn ngữ khác) thường được sử dụng làm các loại trung gian và chúng cũng có cấu trúc rõ ràng có thể được suy ra bằng cách kiểm tra lớp. Bằng cách hiểu cấu trúc của các bản ghi của quy trình, chúng tôi có thể cung cấp các API ngắn gọn hơn nhiều để xử lý dữ liệu 6. 1. Lược đồ là gì?Hầu hết các bản ghi có cấu trúc đều có chung một số đặc điểm
Các bản ghi thường có cấu trúc lồng nhau. Cấu trúc lồng nhau xảy ra khi bản thân một trường có các trường con, do đó, loại trường đó có một lược đồ. Các trường là kiểu mảng hoặc bản đồ cũng là một đặc điểm chung của các bản ghi có cấu trúc này Ví dụ: hãy xem xét lược đồ sau, biểu thị các hành động trong một công ty thương mại điện tử hư cấu Mua, tựa vào, bám vào Tên trường Loại trườngngười dùngIdSTRINGitemIdINT64shippingAddressROW(ShippingAddress)chi phíINT64giao dịchARRAY[ROW(Giao dịch)] Địa chỉ giao hàng Tên trườngLoại trườngđường phốĐịa chỉSTRINGthành phốSTRINGstatenullable STRINGCountrySTRINGpostCodeSTRINGGiao dịch Tên trườngField TypebankSTRINGpurchaseAmountDOUBLEBản ghi sự kiện mua hàng được biểu thị bằng lược đồ mua hàng ở trên. Mỗi sự kiện mua hàng chứa một địa chỉ giao hàng, là một hàng lồng nhau chứa giản đồ riêng của nó. Mỗi giao dịch mua cũng chứa một loạt các giao dịch thẻ tín dụng (một danh sách, vì một giao dịch mua có thể được chia thành nhiều thẻ tín dụng); . Điều này cung cấp một mô tả trừu tượng về các loại liên quan, một loại được trừu tượng hóa khỏi bất kỳ ngôn ngữ lập trình cụ thể nào Các lược đồ cung cấp cho chúng tôi một hệ thống loại cho các bản ghi Beam độc lập với bất kỳ loại ngôn ngữ lập trình cụ thể nào. Có thể có nhiều lớp Java đều có cùng một lược đồ (ví dụ: lớp Bộ đệm giao thức hoặc lớp POJO) và Beam sẽ cho phép chúng tôi chuyển đổi liền mạch giữa các loại này. Các lược đồ cũng cung cấp một cách đơn giản để suy luận về các loại trên các API ngôn ngữ lập trình khác nhau Một 73 với một lược đồ không cần phải có một 966 được chỉ định, vì Beam biết cách mã hóa và giải mã các hàng Lược đồ; 6. 2. Lược đồ cho các loại ngôn ngữ lập trìnhMặc dù bản thân các lược đồ độc lập với ngôn ngữ, nhưng chúng được thiết kế để nhúng một cách tự nhiên vào các ngôn ngữ lập trình của Beam SDK đang được sử dụng. Điều này cho phép người dùng Beam tiếp tục sử dụng các kiểu gốc trong khi tận dụng lợi thế của việc Beam hiểu các lược đồ phần tử của họ Trong Java, bạn có thể sử dụng tập hợp các lớp sau đây để biểu diễn lược đồ mua hàng. Beam sẽ tự động suy ra lược đồ chính xác dựa trên các thành viên của lớp Trong Python, bạn có thể sử dụng tập hợp các lớp sau để biểu diễn lược đồ mua hàng. Beam sẽ tự động suy ra lược đồ chính xác dựa trên các thành viên của lớp Trong Go, mã hóa lược đồ được sử dụng theo mặc định cho các loại cấu trúc, với các trường Đã xuất trở thành một phần của lược đồ. Beam sẽ tự động suy luận lược đồ dựa trên các trường và thẻ trường của cấu trúc cũng như thứ tự của chúng Trong Bản mô tả, các đối tượng JSON được sử dụng để biểu thị dữ liệu của lược đồ. Thật không may, thông tin loại trong Bản mô tả không được truyền tới lớp thời gian chạy, vì vậy nó cần được chỉ định thủ công ở một số nơi (e. g. khi sử dụng đường dẫn ngôn ngữ chéo) 559 560 561 562Sử dụng các lớp JavaBean như trên là một cách để ánh xạ lược đồ tới các lớp Java. Tuy nhiên, nhiều lớp Java có thể có cùng một lược đồ, trong trường hợp đó, các kiểu Java khác nhau thường có thể được sử dụng thay thế cho nhau. Beam sẽ thêm các chuyển đổi ẩn giữa các loại có lược đồ phù hợp. Ví dụ: lớp 5011 ở trên có cùng lược đồ với lớp sau 563Vì vậy, nếu chúng ta có hai 73 như sau 564Sau đó, hai 73 này sẽ có cùng một lược đồ, mặc dù các kiểu Java của chúng sẽ khác nhau. Điều này có nghĩa là ví dụ hai đoạn mã sau là hợp lệ 565và 566Mặc dù trong cả hai trường hợp, tham số 623 khác với loại Java của 73, vì các lược đồ giống nhau, Beam sẽ tự động thực hiện chuyển đổi. Biến đổi 5016 tích hợp sẵn cũng có thể được sử dụng để dịch giữa các loại lược đồ tương đương trong Java, như chi tiết bên dưới6. 3. Định nghĩa lược đồLược đồ cho một 73 xác định các phần tử của 73 đó dưới dạng một danh sách có thứ tự các trường được đặt tên. Mỗi trường có một tên, một loại và có thể là một tập hợp các tùy chọn người dùng. Loại trường có thể là nguyên thủy hoặc hỗn hợp. Sau đây là các loại nguyên thủy hiện được Beam hỗ trợTypeDescriptionBYTEAMột giá trị có chữ ký 8 bitINT16A Giá trị có chữ ký 16 bitINT32A Giá trị có chữ ký 32 bitINT64A Giá trị có chữ ký 64 bitDECIMAMột loại thập phân có độ chính xác tùy ýFLOATA Số dấu phẩy động IEEE 754 32 bitDOUBLEA Số dấu phẩy động IEEE 754 64 bitSTRINGA chuỗiDATETIMEA dấu thời gian được biểu thị . Trong trường hợp này, trường sẽ có loại ROW và lược đồ lồng nhau sẽ là một thuộc tính của loại trường này. A field can also reference a nested schema. In this case, the field will have type ROW, and the nested schema will be an attribute of this field type. Ba loại bộ sưu tập được hỗ trợ dưới dạng các loại trường. Mảng, ITERABLE và MAP
6. 4. các loại logicNgười dùng có thể mở rộng hệ thống loại lược đồ để thêm các loại logic tùy chỉnh có thể được sử dụng làm trường. Một loại logic được xác định bởi một mã định danh duy nhất và một đối số. Loại logic cũng chỉ định loại lược đồ cơ bản được sử dụng để lưu trữ, cùng với các chuyển đổi đến và từ loại đó. Ví dụ: một liên kết logic luôn có thể được biểu diễn dưới dạng một hàng với các trường có thể null, trong đó người dùng đảm bảo rằng chỉ một trong các trường đó được đặt tại một thời điểm. Tuy nhiên, điều này có thể tẻ nhạt và phức tạp để quản lý. Loại logic OneOf cung cấp một lớp giá trị giúp quản lý loại dưới dạng liên kết dễ dàng hơn, trong khi vẫn sử dụng một hàng có các trường có thể rỗng làm bộ lưu trữ cơ bản của nó. Mỗi loại logic cũng có một mã định danh duy nhất, vì vậy chúng cũng có thể được giải thích bằng các ngôn ngữ khác. Thêm ví dụ về các loại logic được liệt kê dưới đây 6. 4. 1. Định nghĩa kiểu logicĐể xác định loại logic, bạn phải chỉ định loại Lược đồ được sử dụng để biểu thị loại cơ bản cũng như mã định danh duy nhất cho loại đó. Một loại logic áp đặt ngữ nghĩa bổ sung lên trên một loại lược đồ. Ví dụ: một loại logic để biểu thị dấu thời gian nano giây được biểu diễn dưới dạng lược đồ chứa trường INT64 và INT32. Chỉ riêng lược đồ này không nói bất cứ điều gì về cách diễn giải loại này, tuy nhiên, loại logic cho bạn biết rằng lược đồ này biểu thị dấu thời gian nano giây, với trường INT64 biểu thị giây và trường INT32 biểu thị nano giây Các kiểu logic cũng được chỉ định bởi một đối số, cho phép tạo một lớp gồm các kiểu liên quan. Ví dụ: loại thập phân có độ chính xác giới hạn sẽ có đối số số nguyên cho biết có bao nhiêu chữ số chính xác được biểu thị. Đối số được biểu thị bằng một loại lược đồ, vì vậy bản thân nó có thể là một loại phức tạp Trong Java, một kiểu logic được chỉ định là một lớp con của lớp 5020. Một lớp Java tùy chỉnh có thể được chỉ định để biểu diễn kiểu logic và các hàm chuyển đổi phải được cung cấp để chuyển đổi qua lại giữa lớp Java này và biểu diễn kiểu Lược đồ bên dưới. Ví dụ: loại logic biểu thị dấu thời gian nano giây có thể được triển khai như sauTrong Go, một loại logic được chỉ định với triển khai tùy chỉnh của giao diện 5021. Ví dụ: nhà cung cấp loại logic đại diện cho dấu thời gian nano giây có thể được triển khai như sauTrong Bản mô tả, một loại logic được xác định bởi giao diện LogicalTypeInfo liên kết URN của một loại logic với biểu diễn của nó và chuyển đổi của nó sang và từ biểu diễn này 567 568 5696. 4. 2. Các loại logic hữu íchHiện tại SDK Python cung cấp các loại logic tiện lợi tối thiểu, ngoài việc xử lý 5022Hiện tại, SDK Go cung cấp các loại logic tiện lợi tối thiểu, ngoài việc xử lý các nguyên hàm số nguyên bổ sung và 5023Kiểu liệt kêTrình tạo tiện ích này chưa tồn tại cho Python SDK Trình tạo tiện lợi này chưa tồn tại cho Go SDK Kiểu logic này cho phép tạo một kiểu liệt kê bao gồm một tập hợp các hằng số được đặt tên 570Giá trị của trường này được lưu trữ trong hàng dưới dạng một loại INT32, tuy nhiên, loại logic xác định một loại giá trị cho phép bạn truy cập vào bảng liệt kê dưới dạng một chuỗi hoặc một giá trị. Ví dụ 571Đưa ra một đối tượng hàng có trường liệt kê, bạn cũng có thể trích xuất trường dưới dạng giá trị liệt kê 572Suy luận lược đồ tự động từ Java POJO và JavaBeans tự động chuyển đổi Java enum thành kiểu logic EnumerationType OneOfTypeTrình tạo tiện ích này chưa tồn tại cho Python SDK Trình tạo tiện lợi này chưa tồn tại cho Go SDK OneOfType cho phép tạo một loại kết hợp rời rạc trên một tập hợp các trường lược đồ. Ví dụ 573Giá trị của trường này được lưu trữ trong hàng dưới dạng một loại Hàng khác, trong đó tất cả các trường được đánh dấu là có thể rỗng. Tuy nhiên, loại logic xác định đối tượng Giá trị chứa giá trị liệt kê cho biết trường nào đã được đặt và chỉ cho phép nhận trường đó 574Trong ví dụ trên, chúng tôi đã sử dụng tên trường trong câu lệnh chuyển đổi để rõ ràng, tuy nhiên, giá trị số nguyên enum cũng có thể được sử dụng 6. 5. Tạo lược đồĐể tận dụng các lược đồ, các 73 của bạn phải có một lược đồ đi kèm với nó. Thông thường, bản thân nguồn sẽ đính kèm lược đồ vào PCollection. Ví dụ: khi sử dụng 5025 để đọc các tệp Avro, nguồn có thể tự động suy ra lược đồ Beam từ lược đồ Avro và đính kèm lược đồ đó vào Beam 73. Tuy nhiên, không phải tất cả các nguồn đều tạo ra các lược đồ. Ngoài ra, các đường ống Beam thường có các giai đoạn và loại trung gian và những loại này cũng có thể được hưởng lợi từ tính biểu cảm của các lược đồ6. 5. 1. Suy luận lược đồThích ứng cho
Thật không may, Beam không thể truy cập thông tin loại TypeScript khi chạy. Các lược đồ phải được khai báo thủ công với 5027. Mặt khác, các hoạt động nhận biết lược đồ như 687 có thể được sử dụng mà không cần khai báo lược đồ rõ ràngBeam có thể suy ra các lược đồ từ nhiều loại Java phổ biến. Chú thích 5029 có thể được sử dụng để yêu cầu Beam suy luận các lược đồ từ một loại cụ thể. Chú thích lấy một đối số là 5030 và các lớp 5030 đã được tích hợp sẵn cho các kiểu Java phổ biến. 5032 cũng có thể được gọi theo chương trình đối với các trường hợp không thực tế để chú thích chính loại JavaJava POJO POJO (Đối tượng Java cũ đơn giản) là một đối tượng Java không bị ràng buộc bởi bất kỳ hạn chế nào ngoài Đặc tả ngôn ngữ Java. Một POJO có thể chứa các biến thành viên là nguyên hàm, là các POJO khác hoặc là các bản đồ bộ sưu tập hoặc mảng của chúng. POJO không phải mở rộng các lớp được chỉ định trước hoặc mở rộng bất kỳ giao diện cụ thể nào Nếu một lớp POJO được chú thích bằng 5033, Beam sẽ tự động suy ra một lược đồ cho lớp này. Các lớp lồng nhau được hỗ trợ giống như các lớp có các trường 983, mảng và 667Ví dụ: chú thích cho lớp sau yêu cầu Beam suy ra một lược đồ từ lớp POJO này và áp dụng nó cho bất kỳ 5036 nào 575Chú thích 5037 cho Beam biết rằng hàm tạo này có thể được sử dụng để tạo các phiên bản của TransactionPojo, giả sử rằng các tham số của hàm tạo có cùng tên với tên trường. 5037 cũng có thể được sử dụng để chú thích các phương thức tĩnh của nhà máy trên lớp, cho phép hàm tạo được giữ ở chế độ riêng tư. Nếu không có chú thích 5037 thì tất cả các trường phải không phải là cuối cùng và lớp phải có hàm tạo đối số bằng 0Có một số chú thích hữu ích khác ảnh hưởng đến cách Beam suy luận các lược đồ. Theo mặc định, tên trường lược đồ được suy luận sẽ khớp với tên trường lớp. Tuy nhiên, có thể sử dụng 5040 để chỉ định một tên khác sẽ được sử dụng cho trường lược đồ. 5041 có thể được sử dụng để đánh dấu các trường lớp cụ thể là loại trừ khỏi lược đồ được suy luận. Ví dụ: thông thường có các trường tạm thời trong một lớp không được đưa vào lược đồ (e. g. lưu trữ giá trị băm vào bộ đệm để ngăn việc tính toán lại giá trị băm tốn kém) và có thể sử dụng 5041 để loại trừ các trường này. Lưu ý rằng các trường bị bỏ qua sẽ không được đưa vào mã hóa của các bản ghi nàyTrong một số trường hợp, việc chú thích lớp POJO không thuận tiện, ví dụ: nếu POJO nằm trong một gói khác không thuộc sở hữu của tác giả đường ống Beam. Trong những trường hợp này, suy luận lược đồ có thể được kích hoạt theo chương trình trong chức năng chính của đường ống như sau 576Đậu Java Đậu Java là một tiêu chuẩn thực tế để tạo các lớp thuộc tính có thể tái sử dụng trong Java. Mặc dù tiêu chuẩn đầy đủ có nhiều đặc điểm, nhưng đặc điểm chính là tất cả các thuộc tính được truy cập thông qua các lớp getter và setter và định dạng tên cho các getter và setter này được chuẩn hóa. Một lớp Java Bean có thể được chú thích bằng 5043 và Beam sẽ tự động suy ra một lược đồ cho lớp này. Ví dụ 577Chú thích 5037 có thể được sử dụng để chỉ định một hàm tạo hoặc một phương thức tĩnh của nhà máy, trong trường hợp đó, có thể bỏ qua hàm setters và hàm tạo đối số 0 578 5040 và 5041 có thể được sử dụng để thay đổi lược đồ được suy ra, giống như với các lớp POJOGiá trị tự động Các lớp giá trị Java nổi tiếng là khó tạo chính xác. Có rất nhiều bản tóm tắt mà bạn phải tạo để triển khai đúng một lớp giá trị. AutoValue là một thư viện phổ biến để dễ dàng tạo các lớp như vậy bằng cách triển khai một lớp cơ sở trừu tượng đơn giản Beam có thể suy ra lược đồ từ lớp AutoValue. Ví dụ 579Đây là tất cả những gì cần thiết để tạo một lớp AutoValue đơn giản và chú thích 5029 ở trên yêu cầu Beam suy ra một lược đồ từ nó. Điều này cũng cho phép các phần tử AutoValue được sử dụng bên trong 73s 5040 và 5041 có thể được sử dụng để thay đổi lược đồ suy raBeam có một vài cơ chế khác nhau để suy luận các lược đồ từ mã Python các lớp NamedTuple Một lớp là một lớp Python bao bọc một 544, gán tên cho từng phần tử và giới hạn nó ở một loại cụ thể. Beam sẽ tự động suy ra lược đồ cho PCollections với các loại đầu ra 5052. Ví dụ 580chùm tia. Hàng và Chọn Ngoài ra còn có các phương pháp để tạo khai báo lược đồ đặc biệt. Trước tiên, bạn có thể sử dụng lambda trả về các phiên bản của 5053 581Đôi khi có thể ngắn gọn hơn để diễn đạt logic tương tự với phép biến đổi 582Lưu ý rằng những khai báo này không bao gồm bất kỳ thông tin cụ thể nào về các loại trường 5055 và 5056, vì vậy Beam sẽ cố gắng suy luận thông tin loại. Nếu không thể, nó sẽ trở lại loại chung chung 5057. Đôi khi điều này không lý tưởng, bạn có thể sử dụng phép ép kiểu để đảm bảo Beam suy luận đúng loại với 5053 hoặc với 5054 583Beam hiện chỉ phỏng đoán các lược đồ cho các trường đã xuất trong cấu trúc Go cấu trúc Beam sẽ tự động suy ra các lược đồ cho tất cả các cấu trúc Go được sử dụng làm phần tử PCollection và mặc định mã hóa chúng bằng mã hóa lược đồ 584Các trường chưa được xuất sẽ bị bỏ qua và không thể được tự động suy ra như một phần của giản đồ. Các trường kiểu func, kênh, không an toàn. Con trỏ hoặc uintptr sẽ bị bỏ qua khi suy luận. Các trường của loại giao diện bị bỏ qua, trừ khi nhà cung cấp lược đồ được đăng ký cho chúng Theo mặc định, tên trường lược đồ sẽ khớp với tên trường cấu trúc đã xuất. Trong ví dụ trên, “Ngân hàng” và “Số tiền mua hàng” là tên trường lược đồ. Tên trường lược đồ có thể được ghi đè bằng thẻ cấu trúc cho trường 585Việc ghi đè tên trường lược đồ rất hữu ích cho việc chuyển đổi ngôn ngữ chéo về khả năng tương thích, vì các trường lược đồ có thể có các yêu cầu hoặc hạn chế khác với các trường đã xuất của Go 6. 6. Sử dụng chuyển đổi lược đồLược đồ trên 73 cho phép thực hiện nhiều biến đổi quan hệ phong phú. Thực tế là mỗi bản ghi bao gồm các trường được đặt tên cho phép các tập hợp đơn giản và dễ đọc, tham chiếu các trường theo tên, tương tự như các tập hợp trong biểu thức SQLBeam chưa hỗ trợ biến đổi Schema nguyên bản trong Go. Tuy nhiên, nó sẽ được thực hiện với hành vi sau 6. 6. 1. Cú pháp chọn trườngƯu điểm của lược đồ là chúng cho phép tham chiếu các trường phần tử theo tên. Beam cung cấp cú pháp lựa chọn cho các trường tham chiếu, bao gồm các trường lồng nhau và lặp lại. Cú pháp này được sử dụng bởi tất cả các biến đổi lược đồ khi tham chiếu các trường mà chúng hoạt động trên đó. Cú pháp cũng có thể được sử dụng bên trong DoFn để chỉ định các trường lược đồ nào sẽ xử lý Việc đánh địa chỉ các trường theo tên vẫn đảm bảo an toàn cho loại vì Beam sẽ kiểm tra xem các lược đồ có khớp với nhau tại thời điểm biểu đồ đường ống được tạo không. Nếu một trường được chỉ định không tồn tại trong lược đồ, quy trình bán hàng sẽ không khởi chạy được. Ngoài ra, nếu một trường được chỉ định với loại không khớp với loại của trường đó trong giản đồ, quy trình bán hàng sẽ không khởi chạy được Các ký tự sau không được phép trong tên trường. . * [ ] { } Các trường cấp cao nhấtĐể chọn một trường ở cấp cao nhất của lược đồ, tên của trường được chỉ định. Ví dụ: để chỉ chọn id người dùng từ 73 giao dịch mua, người ta sẽ viết (sử dụng biến đổi 5054) 586 587trường lồng nhauHỗ trợ cho các trường lồng nhau chưa được phát triển cho Python SDK Hỗ trợ cho các trường lồng nhau chưa được phát triển cho Go SDK Các trường lồng nhau riêng lẻ có thể được chỉ định bằng toán tử dấu chấm. Ví dụ: để chỉ chọn mã bưu chính từ địa chỉ giao hàng, người ta sẽ viết 588ký tự đại diệnHỗ trợ ký tự đại diện chưa được phát triển cho SDK Python Hỗ trợ ký tự đại diện chưa được phát triển cho Go SDK Toán tử * có thể được chỉ định ở bất kỳ cấp độ lồng nhau nào để biểu thị tất cả các trường ở cấp độ đó. Ví dụ: để chọn tất cả các trường địa chỉ giao hàng, người ta sẽ viết 589MảngTrường mảng, trong đó kiểu phần tử mảng là một hàng, cũng có thể có các trường con của kiểu phần tử được xử lý. Khi được chọn, kết quả là một mảng của loại trường con đã chọn. Ví dụ Hỗ trợ cho các trường Mảng chưa được phát triển cho Python SDK Hỗ trợ cho các trường Mảng chưa được phát triển cho Go SDK 590Sẽ dẫn đến một hàng chứa trường mảng với phần tử kiểu chuỗi, chứa danh sách các ngân hàng cho mỗi giao dịch Mặc dù nên sử dụng dấu ngoặc [] trong bộ chọn, nhưng để làm rõ rằng các phần tử mảng đang được chọn, chúng có thể được bỏ qua cho ngắn gọn. Trong tương lai, tính năng cắt mảng sẽ được hỗ trợ, cho phép lựa chọn các phần của mảng bản đồTrường bản đồ, trong đó loại giá trị là một hàng, cũng có thể có các trường con của loại giá trị được xử lý. Khi được chọn, kết quả là một bản đồ trong đó các phím giống như trong bản đồ gốc nhưng giá trị là loại được chỉ định. Tương tự như mảng, nên sử dụng dấu ngoặc nhọn {} trong bộ chọn, để làm rõ rằng các phần tử giá trị bản đồ đang được chọn, chúng có thể được bỏ qua cho ngắn gọn. Trong tương lai, bộ chọn phím bản đồ sẽ được hỗ trợ, cho phép chọn các phím cụ thể từ bản đồ. Ví dụ, đưa ra lược đồ sau mua theo loại Phần sau 591Hỗ trợ cho các trường Bản đồ chưa được phát triển cho Python SDK Hỗ trợ cho các trường Bản đồ chưa được phát triển cho Go SDK Sẽ dẫn đến một hàng chứa trường bản đồ với chuỗi loại khóa và chuỗi loại giá trị. Bản đồ đã chọn sẽ chứa tất cả các khóa từ bản đồ gốc và các giá trị sẽ là userId có trong bản ghi mua hàng Mặc dù nên sử dụng dấu ngoặc {} trong bộ chọn, nhưng để làm rõ rằng các phần tử giá trị bản đồ đang được chọn, chúng có thể được bỏ qua cho ngắn gọn. Trong tương lai, tính năng cắt bản đồ sẽ được hỗ trợ, cho phép chọn các phím cụ thể từ bản đồ 6. 6. 2. Biến đổi lược đồBeam cung cấp một tập hợp các biến đổi hoạt động tự nhiên trên các lược đồ. Các biến đổi này rất biểu cảm, cho phép lựa chọn và tổng hợp theo các trường lược đồ được đặt tên. Sau đây là một số ví dụ về biến đổi lược đồ hữu ích Chọn đầu vàoThông thường, một tính toán chỉ quan tâm đến một tập hợp con của các trường trong đầu vào 73. Biến đổi 5054 cho phép một người dễ dàng chỉ chiếu ra các trường quan tâm. Kết quả 73 có một lược đồ chứa từng trường được chọn làm trường cấp cao nhất. Có thể chọn cả trường cấp cao nhất và trường lồng nhau. Ví dụ: trong lược đồ Mua hàng, người ta chỉ có thể chọn các trường userId và streetAddress như sau 592Hỗ trợ cho các trường lồng nhau chưa được phát triển cho Python SDK Hỗ trợ cho các trường lồng nhau chưa được phát triển cho Go SDK Kết quả 73 sẽ có lược đồ sauField NameField TypeuserIdSTRINGstreetAddressSTRINGĐiều này cũng đúng với các lựa chọn ký tự đại diện. Sau đây 593Hỗ trợ cho Ký tự đại diện chưa được phát triển cho Python SDK Hỗ trợ cho Ký tự đại diện chưa được phát triển cho Go SDK Sẽ dẫn đến lược đồ sau Field NameField TypeuserIdSTRINGstreetAddressSTRINGcitySTRINGstatenullable STRINGcountrySTRINGpostCodeSTRINGKhi chọn các trường được lồng bên trong một mảng, quy tắc tương tự sẽ áp dụng để mỗi trường được chọn xuất hiện riêng biệt dưới dạng trường cấp cao nhất trong hàng kết quả. Điều này có nghĩa là nếu nhiều trường được chọn từ cùng một hàng lồng nhau, thì mỗi trường được chọn sẽ xuất hiện dưới dạng trường mảng của riêng nó. Ví dụ 594Hỗ trợ cho các trường lồng nhau chưa được phát triển cho SDK Python Hỗ trợ cho các trường lồng nhau chưa được phát triển cho Go SDK Sẽ dẫn đến lược đồ sau Tên trườngField TypebankARRAY[STRING]purchaseAmountARRAY[DOUBLE]Lựa chọn ký tự đại diện tương đương với việc chọn riêng từng trường. Chọn các trường được lồng bên trong bản đồ có cùng ngữ nghĩa như mảng. Nếu bạn chọn nhiều trường từ bản đồ thì mỗi trường đã chọn sẽ được mở rộng thành bản đồ của riêng nó ở cấp cao nhất. Điều này có nghĩa là tập hợp các khóa bản đồ sẽ được sao chép một lần cho mỗi trường đã chọn Đôi khi các hàng lồng nhau khác nhau sẽ có các trường có cùng tên. Việc chọn nhiều trường trong số này sẽ dẫn đến xung đột tên vì tất cả các trường đã chọn được đặt trong cùng một lược đồ hàng. Khi tình huống này phát sinh, có thể sử dụng phương thức trình tạo 5067 để cung cấp tên thay thế cho trường đã chọnMột cách sử dụng khác của phép biến đổi Select là làm phẳng một lược đồ lồng nhau thành một lược đồ phẳng duy nhất. Ví dụ 595Hỗ trợ cho các trường lồng nhau chưa được phát triển cho SDK Python Hỗ trợ cho các trường lồng nhau chưa được phát triển cho Go SDK Sẽ dẫn đến lược đồ sau Tên trườngLoại trườngngười dùngIdSTRINGitemIdSTRINGshippingAddress_streetAddressSTRINGshippingAddress_citynullable STRINGshippingAddress_stateSTRINGshippingAddress_countrySTRINGshippingAddress_postCodeSTRINGchi phíCentsINT64transactions_bankARRAY[STRING]transactions_purchaseAmountARRAY[DOUBLE] Tập hợp nhómBiến đổi 5068 cho phép chỉ cần nhóm dữ liệu theo bất kỳ số lượng trường nào trong lược đồ đầu vào, áp dụng các tập hợp cho các nhóm đó và lưu trữ kết quả của các tập hợp đó trong một trường lược đồ mới. Đầu ra của biến đổi 5068 có một lược đồ với một trường tương ứng với mỗi tập hợp được thực hiệnBiến đổi 687 cho phép chỉ cần nhóm dữ liệu theo bất kỳ số lượng trường nào trong lược đồ đầu vào, áp dụng các tập hợp cho các nhóm đó và lưu trữ kết quả của các tập hợp đó trong một trường lược đồ mới. Đầu ra của phép biến đổi 687 có một lược đồ với một trường tương ứng với mỗi tập hợp được thực hiệnCách sử dụng đơn giản nhất của 5068 chỉ định không có tập hợp nào, trong trường hợp đó, tất cả các đầu vào khớp với tập hợp trường đã cung cấp được nhóm lại với nhau thành trường 5073. Ví dụCách sử dụng đơn giản nhất của 687 chỉ định không có tập hợp nào, trong trường hợp đó, tất cả các đầu vào khớp với tập hợp các trường được cung cấp được nhóm lại với nhau thành một trường 5073. Ví dụ 596 597Hỗ trợ cho nhóm nhận biết lược đồ chưa được phát triển cho Go SDK Lược đồ đầu ra của cái này là Tên trườngField TypekeyROW{userId. STRING, ngân hàng. STRING}valuesITERABLE[ROW[Purchase]]Trường khóa chứa khóa nhóm và trường giá trị chứa danh sách tất cả các giá trị khớp với khóa đó. Tên của các trường khóa và giá trị trong lược đồ đầu ra có thể được kiểm soát bằng cách sử dụng trình tạo withKeyField và withValueField này, như sau 598Việc áp dụng một hoặc nhiều tập hợp cho kết quả được nhóm là khá phổ biến. Mỗi tập hợp có thể chỉ định một hoặc nhiều trường để tổng hợp, hàm tổng hợp và tên của trường kết quả trong lược đồ đầu ra. Ví dụ: ứng dụng sau tính toán ba tập hợp được nhóm theo userId, với tất cả các tập hợp được biểu thị trong một lược đồ đầu ra duy nhất 599 600Hỗ trợ cho nhóm nhận biết lược đồ chưa được phát triển cho Go SDK Kết quả của phép tổng hợp này sẽ có lược đồ sau Tên trườngField TypekeyROW{userId. STRING}valueROW{numPurchases. INT64, tổngSpendCent. INT64, mua hàng đầu. ARRAY[INT64]}Thường thì 5076 sẽ được sử dụng để làm phẳng kết quả thành một lược đồ phẳng, không lồng nhau. tham giaBeam hỗ trợ các phép nối bằng nhau trên lược đồ 737 - cụ thể là các phép nối trong đó điều kiện nối phụ thuộc vào sự bằng nhau của một tập hợp con các trường. Ví dụ: các ví dụ sau sử dụng lược đồ Mua hàng để kết hợp các giao dịch với các bài đánh giá có khả năng được liên kết với giao dịch đó (cả người dùng và sản phẩm đều khớp với đánh giá đó trong giao dịch). Đây là “liên kết tự nhiên” - một trong đó các tên trường giống nhau được sử dụng ở cả phía bên trái và bên phải của liên kết - và được chỉ định bằng từ khóa 5078Hỗ trợ tham gia chưa được phát triển cho Python SDK Hỗ trợ tham gia chưa được phát triển cho Go SDK 601Lược đồ kết quả như sau Field NameField TypelhsROW{Transaction}rhsROW{Review}Mỗi hàng kết quả chứa một Giao dịch và một Đánh giá phù hợp với điều kiện tham gia. Nếu các trường khớp trong hai lược đồ có tên khác nhau thì có thể sử dụng hàm on. Ví dụ: nếu lược đồ Đánh giá đặt tên các trường đó khác với lược đồ Giao dịch, thì chúng ta có thể viết như sau Hỗ trợ tham gia chưa được phát triển cho Python SDK Hỗ trợ tham gia chưa được phát triển cho Go SDK 602Ngoài các phép nối bên trong, phép biến đổi Join hỗ trợ các phép nối ngoài đầy đủ, phép nối ngoài bên trái và phép nối ngoài bên phải liên kết phức tạpMặc dù hầu hết các phép nối có xu hướng là phép nối nhị phân - nối hai đầu vào với nhau - đôi khi bạn có nhiều hơn hai luồng đầu vào cần được nối trên một khóa chung. Biến đổi 5079 cho phép nối nhiều 737 lại với nhau dựa trên sự bằng nhau của các trường lược đồ. Mỗi 73 có thể được đánh dấu là bắt buộc hoặc tùy chọn trong bản ghi nối cuối cùng, cung cấp sự tổng quát hóa các phép nối ngoài cho các phép nối có nhiều hơn hai 73 đầu vào. Đầu ra có thể được mở rộng tùy chọn - cung cấp các bản ghi được nối riêng lẻ, như trong biến đổi 5083. Đầu ra cũng có thể được xử lý ở định dạng không mở rộng - cung cấp khóa tham gia cùng với Iterables của tất cả các bản ghi từ mỗi đầu vào khớp với khóa đóHỗ trợ tham gia chưa được phát triển cho Python SDK Hỗ trợ tham gia chưa được phát triển cho Go SDK Lọc sự kiệnBiến đổi 671 có thể được định cấu hình với một tập hợp các vị từ, mỗi biến dựa trên một trường được chỉ định. Chỉ những bản ghi mà tất cả các vị từ trả về true mới vượt qua bộ lọc. Ví dụ như sau 603Sẽ sản xuất tất cả các giao dịch mua từ Đức với giá mua lớn hơn hai mươi xu Thêm các trường vào lược đồBiến đổi AddFields có thể được sử dụng để mở rộng lược đồ với các trường mới. Các hàng đầu vào sẽ được mở rộng sang lược đồ mới bằng cách chèn các giá trị null cho các trường mới, mặc dù có thể chỉ định các giá trị mặc định thay thế; . Có thể thêm các trường con lồng nhau bằng cách sử dụng cú pháp chọn trường, bao gồm các trường lồng nhau bên trong các mảng hoặc giá trị bản đồ Ví dụ, ứng dụng sau 604Kết quả trong một 73 với lược đồ mở rộng. Tất cả các hàng và trường của đầu vào, cũng như các trường đã chỉ định được thêm vào lược đồ. Tất cả các hàng kết quả sẽ có các giá trị null được điền vào timeOfDaySeconds và shippingAddress. các trường deliveryNotes và một giá trị sai được điền vào cho các giao dịch. trường được gắn cờXóa các trường khỏi lược đồ 5086 cho phép loại bỏ các trường cụ thể khỏi lược đồ. Các hàng đầu vào sẽ bị cắt bớt lược đồ và mọi giá trị cho các trường bị loại bỏ sẽ bị xóa khỏi đầu ra. Các trường lồng nhau cũng có thể bị loại bỏ bằng cú pháp chọn trườngVí dụ, đoạn mã sau 605Kết quả là một bản sao của đầu vào với hai trường đó và các giá trị tương ứng của chúng đã bị xóa Đổi tên các trường lược đồ 5087 cho phép đổi tên các trường cụ thể trong lược đồ. Các giá trị trường trong các hàng đầu vào không thay đổi, chỉ lược đồ được sửa đổi. Biến đổi này thường được sử dụng để chuẩn bị các bản ghi cho đầu ra cho phần chìm nhận biết lược đồ, chẳng hạn như RDBMS, để đảm bảo rằng các tên trường lược đồ 73 khớp với tên của đầu ra. Nó cũng có thể được sử dụng để đổi tên các trường được tạo bởi các biến đổi khác để làm cho chúng dễ sử dụng hơn (tương tự như SELECT AS trong SQL). Các trường lồng nhau cũng có thể được đổi tên bằng cú pháp chọn trườngVí dụ, đoạn mã sau 606Kết quả trong cùng một tập hợp các yếu tố đầu vào chưa sửa đổi, tuy nhiên lược đồ trên PCollection đã được thay đổi để đổi tên userId thành userIdentifier và shippingAddress. đường phốĐịa chỉ giao hàngĐịa chỉ. đường phố Chuyển đổi giữa các loạiNhư đã đề cập, Beam có thể tự động chuyển đổi giữa các loại Java khác nhau, miễn là các loại đó có lược đồ tương đương. Một cách để làm điều này là sử dụng biến đổi 5016, như sau 607Beam sẽ xác thực rằng lược đồ được suy luận cho 5090 khớp với lược đồ của đầu vào 73, sau đó sẽ truyền tới một 5092Vì lớp 5093 có thể hỗ trợ bất kỳ lược đồ nào, bất kỳ 73 nào có lược đồ đều có thể được chuyển thành một 73 hàng, như sau 608Nếu loại nguồn là lược đồ một trường, Convert cũng sẽ chuyển đổi thành loại trường nếu được hỏi, mở hộp hiệu quả. Ví dụ: đưa ra một lược đồ có một trường INT64, phần sau đây sẽ chuyển đổi nó thành một 5096 609Trong mọi trường hợp, việc kiểm tra loại được thực hiện khi xây dựng biểu đồ đường ống và nếu các loại không khớp với lược đồ thì đường ống sẽ không khởi chạy được 6. 6. 3. Lược đồ trong ParDoMột 73 với lược đồ có thể áp dụng một 556, giống như bất kỳ 73 nào khác. Tuy nhiên, trình chạy Beam biết về các lược đồ khi áp dụng 556, cho phép chức năng bổ sungchuyển đổi đầu vàoBeam chưa hỗ trợ chuyển đổi đầu vào trong Go Vì Beam biết lược đồ của nguồn 73, nên nó có thể tự động chuyển đổi các phần tử thành bất kỳ loại Java nào mà lược đồ phù hợp được biết đến. Ví dụ: sử dụng lược đồ Giao dịch nêu trên, giả sử chúng ta có 73 sau 610Nếu không có lược đồ, thì 583 được áp dụng sẽ phải chấp nhận một phần tử kiểu 5104. Tuy nhiên vì có lược đồ, bạn có thể áp dụng DoFn sau 611Mặc dù tham số 623 không khớp với kiểu Java của 73, nhưng vì nó có lược đồ phù hợp nên Beam sẽ tự động chuyển đổi các phần tử. Nếu lược đồ không khớp, Beam sẽ phát hiện điều này tại thời điểm xây dựng biểu đồ và sẽ không thực hiện được với lỗi loạiVì mọi lược đồ có thể được biểu diễn bằng một loại Hàng, nên Hàng cũng có thể được sử dụng ở đây 612Lựa chọn đầu vàoVì đầu vào có lược đồ nên bạn cũng có thể tự động chọn các trường cụ thể để xử lý trong DoFn Với các giao dịch mua ở trên 73, giả sử bạn chỉ muốn xử lý các trường userId và itemId. Bạn có thể thực hiện những điều này bằng cách sử dụng các biểu thức lựa chọn được mô tả ở trên, như sau 613Bạn cũng có thể chọn các trường lồng nhau, như sau 614Để biết thêm thông tin, hãy xem phần về biểu thức chọn trường. Khi chọn các lược đồ con, Beam sẽ tự động chuyển đổi sang bất kỳ loại lược đồ phù hợp nào, giống như khi đọc toàn bộ hàng 7. Mã hóa dữ liệu và an toàn loạiThích ứng cho
Khi các trình chạy Beam thực thi đường ống của bạn, chúng thường cần cụ thể hóa dữ liệu trung gian trong các 73 của bạn, dữ liệu này yêu cầu chuyển đổi các phần tử sang và từ các chuỗi byte. Beam SDK sử dụng các đối tượng có tên là 966 để mô tả cách các phần tử của một 73 nhất định có thể được mã hóa và giải mã
Trong Beam SDK cho Java, loại 966 cung cấp các phương thức cần thiết để mã hóa và giải mã dữ liệu. SDK cho Java cung cấp một số lớp con Coder hoạt động với nhiều loại Java tiêu chuẩn, chẳng hạn như Integer, Long, Double, StringUtf8, v.v. Bạn có thể tìm thấy tất cả các lớp con Coder có sẵn trong gói CoderTrong Beam SDK cho Python, loại 966 cung cấp các phương thức cần thiết để mã hóa và giải mã dữ liệu. SDK cho Python cung cấp một số lớp con Coder hoạt động với nhiều loại Python tiêu chuẩn, chẳng hạn như các loại nguyên thủy, Tuple, Iterable, StringUtf8, v.v. Bạn có thể tìm thấy tất cả các lớp con Coder có sẵn trong apache_beam. gói mã hóaCác loại Go tiêu chuẩn như 601, 5116 5117, 5118 và 596, v.v. được mã hóa bằng bộ lập trình dựng sẵn. Cấu trúc và con trỏ tới cấu trúc mặc định sử dụng mã hóa Beam Schema Row. Tuy nhiên, người dùng có thể xây dựng và đăng ký lập trình viên tùy chỉnh với 5120. Bạn có thể tìm thấy các hàm Coder có sẵn trong gói coderCác loại TypeScript tiêu chuẩn như 5121, 5122 và 596, v.v. được mã hóa bằng các trình lập trình dựng sẵn. Các đối tượng và mảng JSON được mã hóa thông qua mã hóa BSON. Đối với các loại này, không cần chỉ định bộ mã hóa trừ khi tương tác với các biến đổi ngôn ngữ chéo. Người dùng có thể xây dựng bộ lập trình tùy chỉnh bằng cách mở rộng 5124 để sử dụng với 5125, nhưng các loại logic thường được ưu tiên cho trường hợp này
7. 1. Chỉ định lập trình viênBeam SDK yêu cầu một người viết mã cho mỗi 73 trong quy trình của bạn. Trong hầu hết các trường hợp, Beam SDK có thể tự động suy ra một 966 cho một 73 dựa trên loại phần tử của nó hoặc biến đổi tạo ra nó, tuy nhiên, trong một số trường hợp, tác giả quy trình sẽ cần chỉ định rõ ràng một 966 hoặc phát triển một 966 cho Bạn có thể đặt bộ mã hóa một cách rõ ràng cho một 73 hiện có bằng cách sử dụng phương pháp 5132. Lưu ý rằng bạn không thể gọi 5133 trên một 73 đã được hoàn thiện (e. g. bằng cách gọi 5135 trên đó)Bạn có thể lấy bộ mã hóa cho một 73 hiện có bằng cách sử dụng phương pháp 5137. Phương pháp này sẽ thất bại với một 826 nếu một bộ mã hóa chưa được thiết lập và không thể suy ra được cho 73 đã choBeam SDK sử dụng nhiều cơ chế khác nhau khi cố gắng tự động suy ra 966 cho một 73Mỗi đối tượng đường ống có một 5142. 5142 đại diện cho ánh xạ các loại Java tới các bộ lập trình mặc định mà đường dẫn nên sử dụng cho các 73 của từng loạiBeam SDK cho Python có một 5142 đại diện cho ánh xạ các loại Python tới bộ mã hóa mặc định sẽ được sử dụng cho các 73 của mỗi loạiBeam SDK for Go cho phép người dùng đăng ký triển khai bộ mã hóa mặc định với 5120Theo mặc định, Beam SDK cho Java tự động suy ra 966 cho các phần tử của 73 do 78 tạo ra bằng cách sử dụng tham số loại từ đối tượng hàm của biến đổi, chẳng hạn như 583. Ví dụ, trong trường hợp của 556, một đối tượng hàm 5153 chấp nhận một phần tử đầu vào kiểu 600 và tạo ra một phần tử đầu ra kiểu 950. Trong trường hợp như vậy, SDK dành cho Java sẽ tự động suy ra giá trị mặc định 966 cho đầu ra 5157 (trong đường dẫn mặc định 5142, giá trị này là 5159)Theo mặc định, Beam SDK cho Python tự động suy ra 966 cho các thành phần của đầu ra 73 bằng cách sử dụng các gợi ý kiểu chữ từ đối tượng hàm của biến đổi, chẳng hạn như 583. Trong trường hợp của 556, ví dụ: một 583 với các gợi ý kiểu chữ 5165 và 5166 chấp nhận một phần tử đầu vào kiểu int và tạo ra một phần tử đầu ra kiểu str. Trong trường hợp như vậy, Beam SDK dành cho Python sẽ tự động suy ra giá trị mặc định là 966 cho đầu ra 73 (trong đường dẫn mặc định là 5142, giá trị này là 5170)Theo mặc định, Beam SDK cho Go sẽ tự động suy ra 966 cho các thành phần của đầu ra 73 theo đầu ra của đối tượng chức năng của biến đổi, chẳng hạn như 583. Trong trường hợp của 556, ví dụ: một 583 với các tham số là 5176 chấp nhận một phần tử đầu vào thuộc loại 601 và tạo ra một phần tử đầu ra thuộc loại 596. Trong trường hợp như vậy, Beam SDK for Go sẽ tự động suy ra 966 mặc định cho đầu ra 73 là bộ mã hóa 5181
Khi sử dụng ________ 094, cách đơn giản nhất để đảm bảo rằng bạn có bộ mã hóa chính xác là gọi ________ 45186 khi bạn áp dụng biến đổi 947. 2. Bộ mã hóa mặc định và CoderRegistryMỗi đối tượng Đường ống có một đối tượng 5142, ánh xạ các loại ngôn ngữ tới bộ mã hóa mặc định mà đường ống sẽ sử dụng cho các loại đó. Bạn có thể tự mình sử dụng 5142 để tra cứu bộ mã hóa mặc định cho một loại nhất định hoặc để đăng ký bộ mã hóa mặc định mới cho một loại nhất định 5142 chứa ánh xạ mặc định của các lập trình viên sang các loại JavaPython tiêu chuẩn cho bất kỳ đường dẫn nào bạn tạo bằng cách sử dụng . Bảng sau đây cho thấy ánh xạ tiêu chuẩn. JavaPython. The following table shows the standard mapping:Java TypeDefault CoderDoubleDoubleCoderInstantInstantCoderIntegerVarIntCoderIterableIterableCoderKVKvCoderListListCoderMapMapCoderLongVarLongCoderStringStringUtf8CoderTableRowTableRowJsonCoderVoidVoidCoderbyte[ ]ByteArrayCoderTimestampedValueTimestampedValueCoder Loại Python Coderint mặc địnhVarIntCoderfloatFloatCoderstrBytesCoderbytesStrUtf8CoderTupleTupleCoder7. 2. 1. Tra cứu một bộ mã hóa mặc địnhBạn có thể sử dụng phương pháp 5191 để xác định Coder mặc định cho một loại Java. Bạn có thể truy cập vào 5142 cho một quy trình nhất định bằng cách sử dụng phương pháp 5193. Điều này cho phép bạn xác định (hoặc thiết lập) Coder mặc định cho một loại Java trên cơ sở từng đường ống. tôi. e. “đối với quy trình này, hãy xác minh rằng các giá trị Số nguyên được mã hóa bằng cách sử dụng 5194. ”Bạn có thể sử dụng phương pháp 5195 để xác định Coder mặc định cho loại Python. Bạn có thể sử dụng ________ 45196 để truy cập ________ 45142. Điều này cho phép bạn xác định (hoặc đặt) Coder mặc định cho loại PythonBạn có thể sử dụng hàm 5198 để xác định Coder mặc định cho loại Go7. 2. 2. Đặt bộ mã hóa mặc định cho một loạiĐể đặt Coder mặc định cho loại JavaPython cho một quy trình cụ thể, bạn có được và . Bạn sử dụng phương thức ____45193 ______45196 để lấy đối tượng 5142, sau đó sử dụng phương thức 5203 5204 to register a new 966 for the target type.Để đặt Coder mặc định cho loại Go, bạn sử dụng chức năng 5120 để đăng ký chức năng bộ mã hóa và giải mã cho loại mục tiêu. Tuy nhiên, các loại dựng sẵn như 601, 596, 5117, v.v. không thể để bộ lập trình của chúng ghi đè lênMã ví dụ sau minh họa cách đặt Coder mặc định, trong trường hợp này là 5194, cho Số nguyênint values for a pipeline.Mã ví dụ sau minh họa cách đặt Bộ mã hóa tùy chỉnh cho các phần tử 5211 615 616 6177. 2. 3. Chú thích một loại dữ liệu tùy chỉnh với một bộ mã hóa mặc địnhNếu chương trình đường ống của bạn xác định loại dữ liệu tùy chỉnh, bạn có thể sử dụng chú thích 5212 để chỉ định bộ mã hóa sẽ sử dụng với loại đó. Theo mặc định, Beam sẽ sử dụng 5213 sử dụng tuần tự hóa Java, nhưng nó có nhược điểm
Bạn có thể sử dụng chú thích 5212 để đặt mặc định mới như sau 618Nếu bạn đã tạo một bộ mã hóa tùy chỉnh để phù hợp với loại dữ liệu của mình và bạn muốn sử dụng chú thích 5212, thì lớp bộ mã hóa của bạn phải triển khai một phương thức xuất xưởng tĩnh 5216 619SDK Beam dành cho PythonGo không hỗ trợ chú thích các loại dữ liệu bằng bộ mã hóa mặc định. Nếu bạn muốn đặt bộ mã hóa mặc định, hãy sử dụng phương pháp được mô tả trong phần trước, Đặt bộ mã hóa mặc định cho một loại. 8. cửa sổCửa sổ chia nhỏ một 73 theo dấu thời gian của các phần tử riêng lẻ của nó. Các phép biến đổi tổng hợp nhiều phần tử, chẳng hạn như 514 và 515, hoạt động hoàn toàn trên cơ sở mỗi cửa sổ — chúng xử lý từng 73 dưới dạng chuỗi liên tiếp của nhiều cửa sổ hữu hạn, mặc dù bản thân toàn bộ bộ sưu tập có thể có kích thước không giới hạnMột khái niệm liên quan, được gọi là trình kích hoạt, xác định thời điểm phát ra kết quả tổng hợp khi dữ liệu không giới hạn đến. Bạn có thể sử dụng trình kích hoạt để tinh chỉnh chiến lược cửa sổ cho 73 của mình. Trình kích hoạt cho phép bạn xử lý dữ liệu đến muộn hoặc cung cấp kết quả sớm. Xem phần để biết thêm thông tin8. 1. Khái niệm cơ bản về cửa sổMột số biến đổi Beam, chẳng hạn như 514 và 515, nhóm nhiều phần tử bằng một khóa chung. Thông thường, thao tác nhóm đó sẽ nhóm tất cả các phần tử có cùng khóa trong toàn bộ tập dữ liệu. Với tập dữ liệu không giới hạn, không thể thu thập tất cả các phần tử, vì các phần tử mới liên tục được thêm vào và có thể nhiều vô hạn (e. g. truyền dữ liệu). Nếu bạn đang làm việc với các 73 không giới hạn, việc tạo cửa sổ đặc biệt hữu íchTrong mô hình Beam, bất kỳ 73 nào (bao gồm cả các 73 không giới hạn) đều có thể được chia nhỏ thành các cửa sổ logic. Mỗi phần tử trong 73 được gán cho một hoặc nhiều cửa sổ theo chức năng tạo cửa sổ của 73 và mỗi cửa sổ riêng lẻ chứa một số phần tử hữu hạn. Nhóm các biến đổi sau đó xem xét từng phần tử của 73 trên cơ sở mỗi cửa sổ. Ví dụ: 514, nhóm hoàn toàn các phần tử của 73 theo khóa và cửa sổthận trọng. Hành vi cửa sổ mặc định của Beam là gán tất cả các phần tử của một 73 cho một cửa sổ chung, duy nhất và loại bỏ dữ liệu muộn, ngay cả đối với các 73 không bị chặn. Trước khi bạn sử dụng biến đổi nhóm chẳng hạn như 514 trên một 73 không giới hạn, bạn phải thực hiện ít nhất một trong các thao tác sau
Nếu bạn không đặt chức năng cửa sổ không toàn cục hoặc trình kích hoạt không mặc định cho 73 không giới hạn của mình và sau đó sử dụng biến đổi nhóm chẳng hạn như 514 hoặc 515, quy trình của bạn sẽ tạo ra lỗi khi xây dựng và công việc của bạn sẽ thất bại8. 1. 1. ràng buộc cửa sổSau khi bạn đặt chức năng tạo cửa sổ cho 73, cửa sổ của các phần tử sẽ được sử dụng vào lần tiếp theo bạn áp dụng biến đổi nhóm cho 73 đó. Nhóm cửa sổ xảy ra trên cơ sở khi cần thiết. Nếu bạn đặt chức năng tạo cửa sổ bằng cách sử dụng biến đổi 5241, thì mỗi phần tử được gán cho một cửa sổ, nhưng các cửa sổ không được xem xét cho đến khi 514 hoặc 515 tổng hợp trên một cửa sổ và khóa. Điều này có thể có các hiệu ứng khác nhau trên quy trình của bạn. Xem xét ví dụ về đường ống dẫn trong hình bên dướiHình 3. Đường ống áp dụng cửa sổ Trong quy trình trên, chúng tôi tạo một 73 không giới hạn bằng cách đọc một tập hợp các cặp khóa/giá trị bằng cách sử dụng 5245, sau đó áp dụng chức năng tạo cửa sổ cho tập hợp đó bằng cách sử dụng biến đổi 5241. Sau đó, chúng tôi áp dụng một 556 cho tập hợp, rồi sau đó nhóm kết quả của 556 đó bằng cách sử dụng 514. Chức năng tạo cửa sổ không ảnh hưởng đến biến đổi 556, bởi vì các cửa sổ không thực sự được sử dụng cho đến khi chúng cần thiết cho biến đổi 514. Tuy nhiên, các biến đổi tiếp theo được áp dụng cho kết quả của 514 – dữ liệu được nhóm theo cả khóa và cửa sổ8. 1. 2. Cửa sổ với PCollections giới hạnBạn có thể sử dụng tính năng tạo cửa sổ với các tập dữ liệu có kích thước cố định trong các 73 có giới hạn. Tuy nhiên, lưu ý rằng cửa sổ chỉ xem xét các dấu thời gian ẩn được đính kèm với từng phần tử của 73 và các nguồn dữ liệu tạo tập dữ liệu cố định (chẳng hạn như 5255) gán cùng một dấu thời gian cho mọi phần tử. Điều này có nghĩa là tất cả các phần tử theo mặc định là một phần của một cửa sổ chung, duy nhấtĐể sử dụng cửa sổ với các tập dữ liệu cố định, bạn có thể chỉ định dấu thời gian của riêng mình cho từng thành phần. Để gán dấu thời gian cho các phần tử, hãy sử dụng biến đổi 556 với 583 để xuất từng phần tử bằng dấu thời gian mới (ví dụ: biến đổi WithTimestamp trong Beam SDK cho Java)Để minh họa cách cửa sổ có giới hạn 73 có thể ảnh hưởng đến cách quy trình xử lý dữ liệu của bạn, hãy xem xét quy trình sauhinh 4. 514 và 556 không có cửa sổ, trên tập hợp có giới hạnTrong quy trình trên, chúng tôi tạo một 73 có giới hạn bằng cách đọc các dòng từ một tệp bằng cách sử dụng 5255. Sau đó, chúng tôi nhóm bộ sưu tập bằng cách sử dụng 514 và áp dụng biến đổi 556 cho 73 được nhóm. Trong ví dụ này, 514 tạo một tập hợp các khóa duy nhất và sau đó, 556 được áp dụng chính xác một lần cho mỗi khóaLưu ý rằng ngay cả khi bạn không đặt chức năng tạo cửa sổ thì vẫn có một cửa sổ – tất cả các thành phần trong 73 của bạn được gán cho một cửa sổ chung duy nhấtBây giờ, hãy xem xét cùng một đường dẫn, nhưng sử dụng chức năng tạo cửa sổ Hình 5. 514 và 556 có cửa sổ, trên tập hợp có giới hạnNhư trước đây, đường dẫn tạo một 73 có giới hạn bằng cách đọc các dòng từ một tệp. Sau đó, chúng tôi đặt một cho 73 đó. Biến đổi 514 nhóm các phần tử của 73 theo cả khóa và cửa sổ, dựa trên chức năng cửa sổ. Biến đổi 556 tiếp theo được áp dụng nhiều lần cho mỗi khóa, một lần cho mỗi cửa sổ8. 2. Chức năng cửa sổ được cung cấpBạn có thể xác định các loại cửa sổ khác nhau để phân chia các phần tử của 73. Beam cung cấp một số chức năng cửa sổ, bao gồm
Bạn cũng có thể xác định 842 của riêng mình nếu bạn có nhu cầu phức tạp hơnLưu ý rằng mỗi phần tử có thể thuộc về nhiều hơn một cửa sổ, tùy thuộc vào chức năng tạo cửa sổ mà bạn sử dụng. Ví dụ, cửa sổ thời gian trượt có thể tạo các cửa sổ chồng chéo trong đó một phần tử có thể được gán cho nhiều cửa sổ. Tuy nhiên, mỗi phần tử trong 73 chỉ có thể nằm trong một cửa sổ, vì vậy nếu một phần tử được gán cho nhiều cửa sổ, phần tử đó được sao chép về mặt khái niệm vào từng cửa sổ và mỗi phần tử giống hệt nhau ngoại trừ cửa sổ của nó8. 2. 1. Cửa sổ thời gian cố địnhHình thức cửa sổ đơn giản nhất là sử dụng cửa sổ thời gian cố định. được cung cấp một dấu thời gian 73 có thể được cập nhật liên tục, mỗi cửa sổ có thể chụp (ví dụ) tất cả các phần tử có dấu thời gian rơi vào khoảng thời gian 30 giâyCửa sổ thời gian cố định thể hiện khoảng thời gian nhất quán, khoảng thời gian không trùng lặp trong luồng dữ liệu. Xem xét các cửa sổ có thời lượng 30 giây. tất cả các phần tử trong 73 không giới hạn của bạn với các giá trị dấu thời gian từ 0. 00. 00 đến (nhưng không bao gồm) 0. 00. 30 thuộc về cửa sổ đầu tiên, các phần tử có giá trị dấu thời gian từ 0. 00. 30 đến (nhưng không bao gồm) 0. 01. 00 thuộc về cửa sổ thứ hai, v.v.Hình 6. Cửa sổ thời gian cố định, thời lượng 30 giây 8. 2. 2. cửa sổ thời gian trượtCửa sổ thời gian trượt cũng biểu thị các khoảng thời gian trong luồng dữ liệu; . Ví dụ: mỗi cửa sổ có thể thu thập dữ liệu trị giá 60 giây nhưng cứ sau 30 giây lại có một cửa sổ mới bắt đầu. Tần suất mà các cửa sổ trượt bắt đầu được gọi là khoảng thời gian. Do đó, ví dụ của chúng tôi sẽ có thời lượng cửa sổ là 60 giây và khoảng thời gian là 30 giây Vì nhiều cửa sổ chồng lên nhau nên hầu hết các thành phần trong tập dữ liệu sẽ thuộc về nhiều cửa sổ. Loại cửa sổ này rất hữu ích để lấy dữ liệu trung bình đang chạy; Hình 7. Cửa sổ thời gian trượt, với thời lượng cửa sổ 1 phút và khoảng thời gian cửa sổ 30 giây 8. 2. 3. cửa sổ phiênHàm cửa sổ phiên xác định các cửa sổ chứa các phần tử nằm trong khoảng thời gian khoảng cách nhất định của phần tử khác. Cửa sổ phiên áp dụng trên cơ sở từng khóa và hữu ích cho dữ liệu được phân phối không đều theo thời gian. Ví dụ: luồng dữ liệu biểu thị hoạt động chuột của người dùng có thể có thời gian dài không hoạt động xen kẽ với mật độ nhấp chuột cao. Nếu dữ liệu đến sau thời gian khoảng cách tối thiểu được chỉ định, điều này sẽ bắt đầu bắt đầu một cửa sổ mới Hình 8. Thời lượng phiên, với thời lượng khoảng cách tối thiểu. Lưu ý cách mỗi khóa dữ liệu có các cửa sổ khác nhau, theo phân phối dữ liệu của nó 8. 2. 4. Cửa sổ toàn cầu duy nhấtTheo mặc định, tất cả dữ liệu trong 73 được gán cho một cửa sổ chung duy nhất và dữ liệu muộn sẽ bị loại bỏ. Nếu tập dữ liệu của bạn có kích thước cố định, bạn có thể sử dụng cửa sổ chung mặc định cho 73 của mìnhBạn có thể sử dụng một cửa sổ chung duy nhất nếu bạn đang làm việc với tập dữ liệu không giới hạn (e. g. từ nguồn dữ liệu phát trực tuyến) nhưng hãy thận trọng khi áp dụng các biến đổi tổng hợp, chẳng hạn như 514 và 515. Cửa sổ chung duy nhất với trình kích hoạt mặc định thường yêu cầu phải có toàn bộ tập dữ liệu trước khi xử lý, điều này không thể thực hiện được với dữ liệu cập nhật liên tục. Để thực hiện tổng hợp trên một 73 không giới hạn sử dụng cửa sổ chung, bạn nên chỉ định trình kích hoạt không mặc định cho 73 đó8. 3. Đặt chức năng cửa sổ của PCollection của bạnBạn có thể đặt chức năng tạo cửa sổ cho 73 bằng cách áp dụng biến đổi 5241. Khi bạn áp dụng biến đổi 5241, bạn phải cung cấp một 842. 842 xác định chức năng cửa sổ mà 73 của bạn sẽ sử dụng cho các biến đổi nhóm tiếp theo, chẳng hạn như cửa sổ thời gian cố định hoặc trượtKhi bạn đặt chức năng cửa sổ, bạn cũng có thể muốn đặt trình kích hoạt cho 73 của mình. Trình kích hoạt xác định thời điểm mỗi cửa sổ riêng lẻ được tổng hợp và phát ra, đồng thời giúp tinh chỉnh cách thức hoạt động của chức năng cửa sổ đối với dữ liệu trễ và tính toán kết quả sớm. Xem phần để biết thêm thông tin8. 3. 1. cửa sổ thời gian cố địnhĐoạn mã ví dụ sau đây cho biết cách áp dụng 5241 để chia một 73 thành các cửa sổ cố định, mỗi cửa sổ dài 60 giây 620 621 622 6238. 3. 2. cửa sổ thời gian trượtMã ví dụ sau cho biết cách áp dụng 5241 để chia một 73 thành các cửa sổ thời gian trượt. Mỗi cửa sổ dài 30 giây và một cửa sổ mới bắt đầu cứ sau 5 giây 624 625 626 6278. 3. 3. cửa sổ phiênMã ví dụ sau đây cho biết cách áp dụng 5241 để chia 73 thành các cửa sổ phiên, trong đó mỗi phiên phải được phân tách bằng khoảng cách thời gian ít nhất 10 phút (600 giây) 628 629 630 631Lưu ý rằng các phiên là theo từng khóa — mỗi khóa trong bộ sưu tập sẽ có các nhóm phiên riêng tùy thuộc vào phân phối dữ liệu 8. 3. 4. Cửa sổ toàn cầu duy nhấtNếu 73 của bạn bị giới hạn (kích thước cố định), bạn có thể gán tất cả các phần tử cho một cửa sổ chung duy nhất. Mã ví dụ sau đây cho biết cách đặt một cửa sổ toàn cục duy nhất cho một 73 632 633 634 6358. 4. Hình mờ và dữ liệu muộnTrong bất kỳ hệ thống xử lý dữ liệu nào, có một độ trễ nhất định giữa thời điểm một sự kiện dữ liệu xảy ra ("thời gian sự kiện", được xác định bởi dấu thời gian trên chính phần tử dữ liệu) và thời gian phần tử dữ liệu thực tế được xử lý ở bất kỳ giai đoạn nào trong . Ngoài ra, không có gì đảm bảo rằng các sự kiện dữ liệu sẽ xuất hiện trong quy trình bán hàng của bạn theo đúng thứ tự mà chúng được tạo Ví dụ: giả sử chúng ta có một 73 đang sử dụng cửa sổ thời gian cố định, với cửa sổ dài năm phút. Đối với mỗi cửa sổ, Beam phải thu thập tất cả dữ liệu có dấu thời gian của sự kiện trong phạm vi cửa sổ nhất định (từ 0. 00 và 4. 59 trong cửa sổ đầu tiên chẳng hạn). Dữ liệu có dấu thời gian nằm ngoài phạm vi đó (dữ liệu từ 5. 00 trở lên) thuộc về một cửa sổ khácTuy nhiên, dữ liệu không phải lúc nào cũng được đảm bảo đến theo một đường ống theo thứ tự thời gian hoặc luôn đến theo các khoảng thời gian có thể dự đoán được. Beam theo dõi một hình mờ, đó là khái niệm của hệ thống về thời điểm tất cả dữ liệu trong một cửa sổ nhất định có thể được đưa vào đường ống. Sau khi hình mờ đi qua cuối cửa sổ, bất kỳ phần tử nào khác xuất hiện cùng với dấu thời gian trong cửa sổ đó đều được coi là dữ liệu muộn Từ ví dụ của chúng tôi, giả sử chúng tôi có một hình mờ đơn giản giả định thời gian trễ khoảng 30 giây giữa dấu thời gian dữ liệu (thời gian sự kiện) và thời gian dữ liệu xuất hiện trong đường ống (thời gian xử lý), sau đó Beam sẽ đóng cửa sổ đầu tiên ở mức 5. 30. Nếu một bản ghi dữ liệu đến lúc 5. 34, nhưng với dấu thời gian sẽ đưa nó vào 0. 00-4. 59 cửa sổ (giả sử, 3. 38), thì bản ghi đó là dữ liệu trễ Ghi chú. Để đơn giản, chúng tôi giả định rằng chúng tôi đang sử dụng một hình mờ rất đơn giản để ước tính thời gian trễ. Trên thực tế, nguồn dữ liệu của 73 của bạn xác định hình mờ và hình mờ có thể chính xác hoặc phức tạp hơnCấu hình cửa sổ mặc định của Beam cố gắng xác định thời điểm tất cả dữ liệu đã đến (dựa trên loại nguồn dữ liệu) và sau đó chuyển hình mờ qua cuối cửa sổ. Cấu hình mặc định này không cho phép dữ liệu trễ. cho phép bạn sửa đổi và tinh chỉnh chiến lược cửa sổ cho một 73. Bạn có thể sử dụng trình kích hoạt để quyết định thời điểm mỗi cửa sổ riêng lẻ tổng hợp và báo cáo kết quả của nó, bao gồm cả cách cửa sổ phát ra các phần tử muộn8. 4. 1. Quản lý dữ liệu muộnBạn có thể cho phép dữ liệu trễ bằng cách gọi hoạt động 5305 khi bạn đặt chiến lược cửa sổ của 73. Ví dụ mã sau minh họa chiến lược tạo cửa sổ sẽ cho phép dữ liệu trễ tối đa hai ngày sau khi kết thúc cửa sổ 636 637 638Khi bạn đặt 5305 trên một 73, độ trễ được phép đó sẽ lan truyền tới bất kỳ 73 tiếp theo nào bắt nguồn từ 73 đầu tiên mà bạn đã áp dụng độ trễ được phép cho. Nếu bạn muốn thay đổi độ trễ được phép sau này trong quy trình bán hàng của mình, bạn phải làm như vậy một cách rõ ràng bằng cách áp dụng 53118. 5. Thêm dấu thời gian vào các phần tử của PCollectionNguồn không giới hạn cung cấp dấu thời gian cho từng phần tử. Tùy thuộc vào nguồn không giới hạn của bạn, bạn có thể cần định cấu hình cách trích xuất dấu thời gian từ luồng dữ liệu thô Tuy nhiên, các nguồn có giới hạn (chẳng hạn như tệp từ 5255) không cung cấp dấu thời gian. Nếu bạn cần dấu thời gian, bạn phải thêm chúng vào các phần tử của 73Bạn có thể gán dấu thời gian mới cho các phần tử của 73 bằng cách áp dụng một phép biến đổi để tạo ra các phần tử mới có dấu thời gian mà bạn đã đặtMột ví dụ có thể là nếu quy trình của bạn đọc các bản ghi nhật ký từ một tệp đầu vào và mỗi bản ghi nhật ký bao gồm một trường dấu thời gian; . Bạn có thể phân tích cú pháp trường dấu thời gian từ mỗi bản ghi và sử dụng biến đổi 556 với 583 để đính kèm dấu thời gian vào từng thành phần trong 73 của bạn 639 640 6419. Gây nên
Khi thu thập và nhóm dữ liệu vào các cửa sổ, Beam sử dụng trình kích hoạt để xác định thời điểm phát ra kết quả tổng hợp của từng cửa sổ (được gọi là ngăn). Nếu bạn sử dụng cấu hình cửa sổ mặc định của Beam và , Beam sẽ xuất kết quả tổng hợp khi nó và loại bỏ tất cả dữ liệu tiếp theo cho cửa sổ đó Bạn có thể đặt trình kích hoạt cho các 73 của mình để thay đổi hành vi mặc định này. Beam cung cấp một số trình kích hoạt dựng sẵn mà bạn có thể đặt
Ở cấp độ cao, trình kích hoạt cung cấp hai khả năng bổ sung so với việc chỉ xuất ra ở cuối cửa sổ
Những khả năng này cho phép bạn kiểm soát luồng dữ liệu của mình và cân bằng giữa các yếu tố khác nhau tùy thuộc vào trường hợp sử dụng của bạn
Ví dụ: một hệ thống yêu cầu các bản cập nhật nhạy cảm với thời gian có thể sử dụng trình kích hoạt dựa trên thời gian nghiêm ngặt phát ra một cửa sổ sau mỗi N giây, đánh giá tính kịp thời hơn tính đầy đủ của dữ liệu. Một hệ thống coi trọng tính đầy đủ của dữ liệu hơn thời gian chính xác của kết quả có thể chọn sử dụng trình kích hoạt mặc định của Beam, kích hoạt ở cuối cửa sổ Bạn cũng có thể đặt trình kích hoạt cho một 73 không giới hạn sử dụng một. Điều này có thể hữu ích khi bạn muốn quy trình của mình cung cấp các bản cập nhật định kỳ trên tập dữ liệu không giới hạn — ví dụ: mức trung bình đang chạy của tất cả dữ liệu được cung cấp cho thời điểm hiện tại, được cập nhật N giây hoặc mỗi N phần tử9. 1. Trình kích hoạt thời gian sự kiệnTrình kích hoạt 5320 hoạt động vào thời gian diễn ra sự kiện. Trình kích hoạt 5320 phát ra nội dung của một cửa sổ sau khi vượt qua phần cuối của cửa sổ, dựa trên dấu thời gian được đính kèm với các phần tử dữ liệu. Hình mờ là thước đo tiến độ toàn cầu và là khái niệm của Beam về tính đầy đủ của đầu vào trong quy trình của bạn tại bất kỳ điểm nào. ______45322 5320 5324 chỉ kích hoạt khi hình mờ đi qua cuối cửa sổ. Ngoài ra, bạn có thể định cấu hình trình kích hoạt kích hoạt nếu quy trình của bạn nhận dữ liệu trước hoặc sau khi kết thúc cửa sổ Ví dụ sau đây cho thấy một kịch bản thanh toán và sử dụng cả kích hoạt sớm và muộn 642 643 6449. 1. 1. Trình kích hoạt mặc địnhTrình kích hoạt mặc định cho 73 dựa trên thời gian của sự kiện và phát ra kết quả của cửa sổ khi hình mờ của Beam đi qua cuối cửa sổ, sau đó kích hoạt mỗi khi có dữ liệu muộnTuy nhiên, nếu bạn đang sử dụng cả cấu hình cửa sổ mặc định và trình kích hoạt mặc định, trình kích hoạt mặc định sẽ phát chính xác một lần và dữ liệu muộn sẽ bị loại bỏ. Điều này là do cấu hình cửa sổ mặc định có giá trị độ trễ cho phép là 0. Xem phần Xử lý dữ liệu muộn để biết thông tin về cách sửa đổi hành vi này 9. 2. Kích hoạt thời gian xử lýTrình kích hoạt 5326 hoạt động theo thời gian xử lý. Ví dụ: trình kích hoạt ____45327 ______45326 ____45329 phát ra một cửa sổ sau một khoảng thời gian nhất định . Thời gian xử lý được xác định bởi đồng hồ hệ thống, thay vì dấu thời gian của phần tử dữ liệu. Trình kích hoạt 5326 hữu ích để kích hoạt kết quả sớm từ một cửa sổ, đặc biệt là cửa sổ có khung thời gian lớn, chẳng hạn như một cửa sổ toàn cầu9. 3. Trình kích hoạt theo hướng dữ liệuBeam cung cấp một trình kích hoạt theo hướng dữ liệu, ______45331 ____45332 Ví dụ: điều quan trọng cần lưu ý là nếu bạn chỉ định ____45334 AfterCount(50) . Nếu 32 yếu tố quan trọng với bạn, hãy cân nhắc sử dụng để kết hợp nhiều điều kiện. Điều này cho phép bạn chỉ định nhiều điều kiện bắn, chẳng hạn như “bắn khi tôi nhận được 50 phần tử hoặc cứ sau 1 giây”. and only 32 elements arrive, those 32 elements sit around forever. If the 32 elements are important to you, consider using to combine multiple conditions. This allows you to specify multiple firing conditions such as “fire either when I receive 50 elements, or every 1 second”. 9. 4. Đặt trình kích hoạtKhi bạn đặt chức năng tạo cửa sổ cho 73 bằng cách sử dụng 5241____45338 5339 transform, you can also specify a trigger.Bạn đặt (các) trình kích hoạt cho một 73 bằng cách gọi phương thức 5341 dựa trên kết quả của biến đổi 5342 của bạn. Mẫu mã này đặt trình kích hoạt dựa trên thời gian cho 73, trình kích hoạt này sẽ đưa ra kết quả một phút sau khi phần tử đầu tiên trong cửa sổ đó được xử lý. Dòng cuối cùng trong mẫu mã, 5344, đặt chế độ tích lũy của cửa sổBạn đặt (các) trình kích hoạt cho một 73 bằng cách đặt tham số 5346 khi bạn sử dụng biến đổi 5338. Mẫu mã này đặt trình kích hoạt dựa trên thời gian cho 73, trình kích hoạt này sẽ đưa ra kết quả một phút sau khi phần tử đầu tiên trong cửa sổ đó được xử lý. Tham số 5349 đặt chế độ tích lũy của cửa sổBạn đặt (các) trình kích hoạt cho một 73 bằng cách chuyển tham số 5351 khi bạn sử dụng biến đổi 5339. Mẫu mã này đặt trình kích hoạt dựa trên thời gian cho 73, trình kích hoạt này sẽ đưa ra kết quả một phút sau khi phần tử đầu tiên trong cửa sổ đó được xử lý. Tham số 5354 đặt chế độ tích lũy của cửa sổ 645 646 6479. 4. 1. Chế độ tích lũy cửa sổKhi bạn chỉ định trình kích hoạt, bạn cũng phải đặt chế độ tích lũy của cửa sổ. Khi trình kích hoạt kích hoạt, nó sẽ phát ra nội dung hiện tại của cửa sổ dưới dạng một ngăn. Vì trình kích hoạt có thể kích hoạt nhiều lần nên chế độ tích lũy sẽ xác định xem hệ thống có tích lũy các ô cửa sổ khi trình kích hoạt kích hoạt hay loại bỏ chúng Để đặt một cửa sổ tích lũy các ô được tạo khi trình kích hoạt kích hoạt, hãy gọi 5355 khi bạn đặt trình kích hoạt. Để đặt một cửa sổ loại bỏ các ô đã kích hoạt, hãy gọi 5344Để đặt cửa sổ tích lũy các ô được tạo khi trình kích hoạt kích hoạt, hãy đặt tham số 5349 thành 5358 khi bạn đặt trình kích hoạt. Để đặt một cửa sổ loại bỏ các ô đã bắn, hãy đặt 5349 thành 5360Để đặt cửa sổ tích lũy các ô được tạo khi trình kích hoạt kích hoạt, hãy đặt tham số 5354 thành 5362 khi bạn đặt trình kích hoạt. Để đặt một cửa sổ loại bỏ các ô đã bắn, hãy đặt 5354 thành 5364Hãy xem một ví dụ sử dụng 73 với cửa sổ thời gian cố định và trình kích hoạt dựa trên dữ liệu. Đây là điều bạn có thể làm nếu, ví dụ: mỗi cửa sổ biểu thị mức trung bình đang chạy trong mười phút, nhưng bạn muốn hiển thị giá trị hiện tại của mức trung bình trong giao diện người dùng thường xuyên hơn mười phút một lần. Chúng tôi sẽ giả định các điều kiện sau đây
Sơ đồ sau hiển thị các sự kiện dữ liệu cho khóa X khi chúng đến PCollection và được gán cho các cửa sổ. Để sơ đồ đơn giản hơn một chút, chúng ta sẽ giả định rằng tất cả các sự kiện đều đến trong quy trình theo thứ tự 9. 4. 1. 1. chế độ tích lũyNếu trình kích hoạt của chúng tôi được đặt ở chế độ tích lũy, thì trình kích hoạt sẽ phát ra các giá trị sau mỗi lần kích hoạt. Hãy nhớ rằng trình kích hoạt sẽ kích hoạt mỗi khi ba yếu tố đến 6489. 4. 1. 2. chế độ loại bỏNếu trình kích hoạt của chúng tôi được đặt ở chế độ loại bỏ, trình kích hoạt sẽ phát ra các giá trị sau trên mỗi lần kích hoạt 6499. 4. 2. Xử lý dữ liệu muộnNếu bạn muốn quy trình của mình xử lý dữ liệu đến sau khi hình mờ đi qua cuối cửa sổ, bạn có thể áp dụng độ trễ cho phép khi đặt cấu hình cửa sổ của mình. Điều này giúp trình kích hoạt của bạn có cơ hội phản ứng với dữ liệu muộn. Nếu độ trễ cho phép được đặt, trình kích hoạt mặc định sẽ đưa ra kết quả mới ngay lập tức bất cứ khi nào có dữ liệu trễ Bạn đặt độ trễ cho phép bằng cách sử dụng ______45368 ____45369 650 651 652Độ trễ cho phép này lan truyền đến tất cả các 73 được tạo ra do áp dụng các phép biến đổi cho 73 ban đầu. Nếu bạn muốn thay đổi độ trễ được phép sau này trong quy trình bán hàng của mình, bạn có thể đăng ký ____45311 ____45369 5370 again, explicitly.9. 5. kích hoạt tổng hợpBạn có thể kết hợp nhiều trình kích hoạt để tạo thành trình kích hoạt tổng hợp và có thể chỉ định trình kích hoạt để phát ra kết quả nhiều lần, nhiều nhất một lần hoặc trong các điều kiện tùy chỉnh khác 9. 5. 1. Các loại kích hoạt tổng hợpBeam bao gồm các kích hoạt tổng hợp sau
9. 5. 2. Bố cục với AfterWatermarkMột số trình kích hoạt tổng hợp hữu ích nhất kích hoạt một lần duy nhất khi Beam ước tính rằng tất cả dữ liệu đã đến (i. e. khi hình mờ đi qua cuối cửa sổ) kết hợp với một trong hai hoặc cả hai điều sau
Bạn có thể thể hiện mẫu này bằng cách sử dụng 5320. Ví dụ: mã kích hoạt ví dụ sau kích hoạt trong các điều kiện sau
653 654 6559. 5. 3. Các kích hoạt tổng hợp khácBạn cũng có thể xây dựng các loại trình kích hoạt tổng hợp khác. Mã ví dụ sau hiển thị trình kích hoạt tổng hợp đơn giản kích hoạt bất cứ khi nào ngăn có ít nhất 100 phần tử hoặc sau một phút 656 65710. số liệuTrong mô hình Beam, các chỉ số cung cấp một số thông tin chi tiết về trạng thái hiện tại của quy trình người dùng, có thể xảy ra trong khi quy trình đang chạy. Có thể có những lý do khác nhau cho điều đó, ví dụ
10. 1. Các khái niệm chính về chỉ số Beam
Các chỉ số được báo cáo hoàn toàn nằm trong phạm vi biến đổi trong quy trình đã báo cáo các chỉ số đó. Điều này cho phép báo cáo cùng một tên chỉ số ở nhiều nơi và xác định giá trị mà mỗi biến đổi được báo cáo, cũng như tổng hợp chỉ số trên toàn bộ quy trình
10. 2. Các loại chỉ sốCó ba loại số liệu được hỗ trợ tại thời điểm này. 5387, 5388 và 5389Trong Beam SDK for Go, một 410 do khung cung cấp phải được chuyển đến chỉ số, nếu không giá trị chỉ số sẽ không được ghi lại. Khung sẽ tự động cung cấp một 410 hợp lệ đến 636 và các phương thức tương tự khi đó là tham số đầu tiênPhản đối. Số liệu báo cáo một giá trị dài duy nhất và có thể tăng hoặc giảm 658 659Phân bổ. Một số liệu báo cáo thông tin về việc phân phối các giá trị được báo cáo 660 661máy đo. Số liệu báo cáo giá trị mới nhất trong số các giá trị được báo cáo. Vì các số liệu được thu thập từ nhiều công nhân nên giá trị có thể không phải là giá trị cuối cùng tuyệt đối mà là một trong những giá trị mới nhất 662 66310. 3. Số liệu truy vấn 5393 có một phương thức 5394 trả về một đối tượng 5395 cho phép truy cập các chỉ số. Phương pháp chính có sẵn trong 5395 cho phép truy vấn tất cả các chỉ số phù hợp với một bộ lọc nhất định 5397 có một phương thức 5398 trả về một đối tượng 5399 cho phép truy cập các chỉ số. Phương pháp chính có sẵn trong 5399 cho phép truy vấn tất cả các chỉ số phù hợp với một bộ lọc nhất định. Nó nhận một biến vị ngữ với loại tham số 5401, có thể được sử dụng cho các bộ lọc tùy chỉnh 664 66510. 4. Sử dụng số liệu trong quy trìnhDưới đây là một ví dụ đơn giản về cách sử dụng chỉ số 5387 trong quy trình người dùng 666 66710. 5. Xuất chỉ sốSố liệu chùm tia có thể được xuất sang các phần chìm bên ngoài. Nếu một số liệu chìm được thiết lập trong cấu hình, người chạy sẽ đẩy các số liệu tới nó trong khoảng thời gian 5 giây mặc định. Cấu hình được giữ trong lớp MetricsOptions. Nó chứa cấu hình thời gian đẩy và cũng có các tùy chọn cụ thể chìm như loại và URL. Hiện tại, chỉ có REST HTTP và các phần chìm Graphite được hỗ trợ và chỉ các trình chạy Flink và Spark hỗ trợ xuất số liệu Ngoài ra, các số liệu Beam được xuất sang bảng điều khiển Spark và Flink bên trong để được tư vấn trong giao diện người dùng tương ứng của chúng 11. Trạng thái và bộ hẹn giờCác cơ sở kích hoạt và cửa sổ của Beam cung cấp khả năng trừu tượng hóa mạnh mẽ để nhóm và tổng hợp dữ liệu đầu vào không giới hạn dựa trên dấu thời gian. Tuy nhiên, có những trường hợp sử dụng tổng hợp mà các nhà phát triển có thể yêu cầu mức độ kiểm soát cao hơn mức độ kiểm soát được cung cấp bởi các cửa sổ và trình kích hoạt. Beam cung cấp API để quản lý trạng thái theo từng khóa theo cách thủ công, cho phép kiểm soát chi tiết các tập hợp Trạng thái mô hình API trạng thái của Beam trên mỗi khóa. Để sử dụng API trạng thái, bạn bắt đầu với một 73 có khóa, trong Java được mô hình hóa như một 710. Một 556 đang xử lý 73 này hiện có thể khai báo các biến trạng thái. Bên trong 556, các biến trạng thái này có thể được sử dụng để ghi hoặc cập nhật trạng thái cho khóa hiện tại hoặc để đọc trạng thái trước đó được ghi cho khóa đó. Trạng thái luôn chỉ nằm trong phạm vi đầy đủ đối với khóa xử lý hiện tạiCửa sổ vẫn có thể được sử dụng cùng với xử lý trạng thái. Tất cả trạng thái cho một khóa nằm trong phạm vi cửa sổ hiện tại. Điều này có nghĩa là lần đầu tiên một khóa được nhìn thấy cho một cửa sổ nhất định, bất kỳ trạng thái nào được đọc sẽ trả về trống và một trình chạy có thể thu gom rác trạng thái khi một cửa sổ hoàn thành. Nó cũng thường hữu ích khi sử dụng các tập hợp cửa sổ của Beam trước toán tử trạng thái. Ví dụ: sử dụng bộ kết hợp để tổng hợp trước dữ liệu, sau đó lưu trữ dữ liệu đã tổng hợp bên trong trạng thái. Các cửa sổ hợp nhất hiện không được hỗ trợ khi sử dụng trạng thái và bộ hẹn giờ Đôi khi xử lý trạng thái được sử dụng để triển khai xử lý kiểu máy trạng thái bên trong một 583. Khi thực hiện việc này, cần phải lưu ý rằng các thành phần trong PCCollection đầu vào không có thứ tự được đảm bảo và để đảm bảo rằng logic chương trình có khả năng phục hồi với điều này. Các bài kiểm tra đơn vị được viết bằng DirectRunner sẽ xáo trộn thứ tự xử lý phần tử và được khuyến nghị để kiểm tra tính chính xácTrong Java, DoFn tuyên bố các trạng thái sẽ được truy cập bằng cách tạo các biến thành viên 5409 cuối cùng đại diện cho mỗi trạng thái. Mỗi tiểu bang phải được đặt tên bằng cách sử dụng chú thích 5410; . Một 583 có thể khai báo nhiều biến trạng tháiTrong Python, DoFn khai báo các trạng thái sẽ được truy cập bằng cách tạo các biến thành viên lớp 5409 đại diện cho từng trạng thái. Mỗi 5409 được khởi tạo với một tên, tên này là duy nhất cho một ParDo trong biểu đồ và không liên quan đến các nút khác trong biểu đồ. Một 583 có thể khai báo nhiều biến trạng tháiTrong Go, DoFn khai báo các trạng thái sẽ được truy cập bằng cách tạo các biến thành viên cấu trúc trạng thái đại diện cho từng trạng thái. Mỗi biến trạng thái được khởi tạo bằng một khóa, khóa này là duy nhất cho một ParDo trong biểu đồ và không liên quan đến các nút khác trong biểu đồ. Nếu không cung cấp tên, khóa sẽ mặc định là tên của biến thành viên. Một 583 có thể khai báo nhiều biến trạng thái
11. 1. Các loại trạng tháiBeam cung cấp một số loại trạng thái ValueStateValueState là một giá trị trạng thái vô hướng. Đối với mỗi khóa trong đầu vào, một ValueState sẽ lưu trữ một giá trị đã nhập có thể được đọc và sửa đổi bên trong các phương thức 912 hoặc 441 của DoFn. Nếu loại ValueState có bộ mã hóa được đăng ký, thì Beam sẽ tự động suy ra bộ mã hóa cho giá trị trạng thái. Mặt khác, một bộ mã hóa có thể được chỉ định rõ ràng khi tạo ValueState. Ví dụ: ParDo sau đây tạo một biến trạng thái duy nhất tích lũy số lượng phần tử được nhìn thấyGhi chú. 5418 được gọi là 5419 trong Python SDK 668 669Beam cũng cho phép chỉ định rõ ràng một bộ mã hóa cho các giá trị 5418. Ví dụ 670 671 672 673Kết hợpTrạng thái 5421 cho phép bạn tạo đối tượng trạng thái được cập nhật bằng bộ kết hợp Beam. Ví dụ: ví dụ 5418 trước đó có thể được viết lại để sử dụng 5421 674 675 676TúiBangMột trường hợp sử dụng phổ biến cho trạng thái là tích lũy nhiều phần tử. 5424 cho phép tích lũy một tập hợp các phần tử không có thứ tự. Điều này cho phép thêm các phần tử vào bộ sưu tập mà không yêu cầu đọc toàn bộ bộ sưu tập trước, đây là một hiệu quả đạt được. Ngoài ra, các vận động viên hỗ trợ đọc theo trang có thể cho phép các túi riêng lẻ lớn hơn bộ nhớ khả dụng 677 678 53511. 2. Đọc trạng thái hoãn lạiKhi một 583 chứa nhiều thông số trạng thái, việc đọc từng thông số theo thứ tự có thể chậm. Gọi hàm 5426 ở trạng thái có thể khiến người chạy thực hiện thao tác chặn đọc. Thực hiện nhiều lần đọc chặn theo trình tự sẽ thêm độ trễ cho quá trình xử lý phần tử. Nếu bạn biết rằng một trạng thái sẽ luôn được đọc, bạn có thể chú thích trạng thái đó là @AlwaysFetched, sau đó trình chạy có thể tìm nạp trước tất cả các trạng thái cần thiết. Ví dụ 680 681 682Tuy nhiên, nếu có các đường dẫn mã trong đó các trạng thái không được tìm nạp, thì việc chú thích bằng @AlwaysFetched sẽ thêm tính năng tìm nạp không cần thiết cho các đường dẫn đó. Trong trường hợp này, phương thức readLater cho phép người chạy biết rằng trạng thái sẽ được đọc trong tương lai, cho phép nhiều lần đọc trạng thái được gộp lại với nhau 68311. 3. hẹn giờBeam cung cấp API gọi lại hẹn giờ cho mỗi phím. Điều này cho phép xử lý chậm dữ liệu được lưu trữ bằng API trạng thái. Bộ hẹn giờ có thể được đặt thành gọi lại tại thời điểm sự kiện hoặc dấu thời gian xử lý. Mỗi bộ đếm thời gian được xác định bằng TimerId. Chỉ có thể đặt bộ hẹn giờ nhất định cho một phím cho một dấu thời gian. Cuộc gọi được đặt trên bộ hẹn giờ sẽ ghi đè thời gian kích hoạt trước đó cho bộ hẹn giờ của phím đó 11. 3. 1. bộ hẹn giờ sự kiệnBộ hẹn giờ thời gian sự kiện kích hoạt khi hình mờ đầu vào cho DoFn vượt qua thời gian mà bộ hẹn giờ được đặt, nghĩa là người chạy tin rằng không có thêm yếu tố nào được xử lý bằng dấu thời gian trước dấu thời gian của bộ hẹn giờ. Điều này cho phép tổng hợp thời gian sự kiện 684 685 68611. 3. 2. bộ định thời gian xử lýBộ hẹn giờ thời gian xử lý kích hoạt khi thời gian thực của đồng hồ treo tường trôi qua. Điều này thường được sử dụng để tạo các lô dữ liệu lớn hơn trước khi xử lý. Nó cũng có thể được sử dụng để lên lịch các sự kiện sẽ xảy ra vào một thời điểm cụ thể. Cũng giống như với bộ hẹn giờ thời gian sự kiện, bộ hẹn giờ thời gian xử lý là trên mỗi khóa - mỗi khóa có một bản sao riêng của bộ hẹn giờ Mặc dù bộ hẹn giờ thời gian xử lý có thể được đặt thành dấu thời gian tuyệt đối, nhưng rất phổ biến để đặt chúng thành phần bù so với thời gian hiện tại. Trong Java, các phương thức 5427 và 5428 có thể được sử dụng để thực hiện điều này 687 688 68611. 3. 3. Thẻ hẹn giờ độngBeam cũng hỗ trợ tự động thiết lập thẻ hẹn giờ bằng cách sử dụng 5429 trong SDK Java. Điều này cho phép đặt nhiều bộ hẹn giờ khác nhau trong một 583 và cho phép các thẻ bộ hẹn giờ được chọn động - e. g. dựa trên dữ liệu trong các yếu tố đầu vào. Chỉ có thể đặt bộ hẹn giờ với một thẻ cụ thể thành một dấu thời gian duy nhất, do đó, việc đặt lại bộ hẹn giờ có tác dụng ghi đè thời gian hết hạn trước đó cho bộ hẹn giờ với thẻ đó. Mỗi 5429 được xác định bằng id dòng hẹn giờ và các bộ hẹn giờ trong các họ hẹn giờ khác nhau là độc lậpTrong SDK Python, thẻ hẹn giờ động có thể được chỉ định trong khi gọi 5432 hoặc 5433. Theo mặc định, thẻ hẹn giờ là một chuỗi rỗng nếu không được chỉ định 690 691 68611. 3. 4. Dấu thời gian đầu ra của bộ hẹn giờTheo mặc định, bộ hẹn giờ theo thời gian sự kiện sẽ giữ hình mờ đầu ra của 556 với dấu thời gian của bộ hẹn giờ. Điều này có nghĩa là nếu bộ hẹn giờ được đặt thành 12 giờ đêm, thì bất kỳ tập hợp cửa sổ hoặc bộ hẹn giờ sự kiện nào sau này trong biểu đồ quy trình kết thúc sau 12 giờ đêm sẽ không hết hạn. Dấu thời gian của bộ hẹn giờ cũng là dấu thời gian đầu ra mặc định cho lệnh gọi lại bộ hẹn giờ. Điều này có nghĩa là bất kỳ phần tử nào xuất ra từ phương thức onTimer sẽ có dấu thời gian bằng với dấu thời gian của bộ hẹn giờ kích hoạt. Đối với bộ hẹn giờ thời gian xử lý, dấu thời gian đầu ra mặc định và giữ hình mờ là giá trị của hình mờ đầu vào tại thời điểm bộ hẹn giờ được đặtTrong một số trường hợp, DoFn cần xuất dấu thời gian sớm hơn thời gian hết hạn của bộ hẹn giờ và do đó cũng cần giữ hình mờ đầu ra của nó đối với các dấu thời gian đó. Ví dụ: hãy xem xét quy trình sau tạm thời nhóm các bản ghi vào trạng thái và đặt bộ hẹn giờ để thoát trạng thái. Mã này có thể xuất hiện đúng, nhưng sẽ không hoạt động bình thường 693Vấn đề với mã này là ParDo đang đệm các phần tử, tuy nhiên không có gì ngăn hình mờ vượt qua dấu thời gian của các phần tử đó, vì vậy tất cả các phần tử đó có thể bị loại bỏ dưới dạng dữ liệu muộn. Để ngăn điều này xảy ra, dấu thời gian đầu ra cần được đặt trên bộ hẹn giờ để ngăn hình mờ vượt qua dấu thời gian của phần tử tối thiểu. Đoạn mã sau chứng minh điều này 694 695 68611. 4. Tình trạng thu gom rácTrạng thái trên mỗi khóa cần được thu gom rác hoặc cuối cùng kích thước ngày càng tăng của trạng thái có thể tác động tiêu cực đến hiệu suất. Có hai chiến lược phổ biến cho trạng thái thu gom rác 11. 4. 1. Sử dụng cửa sổ để thu gom rácTất cả trạng thái và bộ hẹn giờ cho một khóa nằm trong phạm vi cửa sổ chứa khóa đó. Điều này có nghĩa là tùy thuộc vào dấu thời gian của phần tử đầu vào, ParDo sẽ thấy các giá trị khác nhau cho trạng thái tùy thuộc vào cửa sổ mà phần tử đó rơi vào. Ngoài ra, khi hình mờ đầu vào đi qua cuối cửa sổ, trình chạy sẽ thu thập tất cả trạng thái cho cửa sổ đó. (Ghi chú. nếu độ trễ cho phép được đặt thành giá trị dương cho cửa sổ, người chạy phải đợi hình mờ đi qua cuối cửa sổ cộng với độ trễ cho phép trước trạng thái thu gom rác). Điều này có thể được sử dụng như một chiến lược thu gom rác Ví dụ, được đưa ra sau đây 697 698 699Trạng thái cửa hàng 556 này mỗi ngày. Khi đường ống xử lý xong dữ liệu cho một ngày nhất định, tất cả trạng thái của ngày đó sẽ được thu gom rác11. 4. 1. Sử dụng bộ hẹn giờ để thu gom rácTrong một số trường hợp, rất khó để tìm ra chiến lược cửa sổ mô hình hóa chiến lược thu gom rác mong muốn. Ví dụ: mong muốn chung là chuyển trạng thái thu gom rác cho một khóa sau khi không thấy hoạt động nào trên khóa trong một thời gian. Điều này có thể được thực hiện bằng cách cập nhật bộ đếm thời gian mà trạng thái thu gom rác. Ví dụ 00 01 68611. 5. Ví dụ về trạng thái và bộ hẹn giờSau đây là một số ví dụ sử dụng trạng thái và bộ hẹn giờ 11. 5. 1. Kết hợp các nhấp chuột và lượt xemTrong ví dụ này, quy trình đang xử lý dữ liệu từ trang chủ của trang thương mại điện tử. Có hai luồng đầu vào. luồng lượt xem, biểu thị các liên kết sản phẩm được đề xuất hiển thị cho người dùng trên trang chủ và luồng lượt nhấp, biểu thị lượt nhấp thực tế của người dùng vào các liên kết này. Mục tiêu của quy trình là kết hợp các sự kiện nhấp chuột với các sự kiện xem, xuất ra một sự kiện đã tham gia mới chứa thông tin từ cả hai sự kiện. Mỗi liên kết có một mã định danh duy nhất có trong cả sự kiện xem và sự kiện tham gia Nhiều sự kiện xem sẽ không bao giờ được theo dõi bằng các nhấp chuột. Đường ống này sẽ đợi một giờ cho một nhấp chuột, sau đó nó sẽ từ bỏ tham gia này. Mặc dù mỗi sự kiện nhấp chuột phải có một sự kiện xem, nhưng một số ít sự kiện xem có thể bị mất và không bao giờ được đưa vào quy trình Beam; . Các sự kiện đầu vào không được sắp xếp - có thể thấy sự kiện nhấp chuột trước sự kiện xem. Thời gian chờ tham gia một giờ phải dựa trên thời gian sự kiện, không phải thời gian xử lý 03 0411. 5. 2. RPC theo đợtTrong ví dụ này, các yếu tố đầu vào đang được chuyển tiếp đến một dịch vụ RPC bên ngoài. RPC chấp nhận các yêu cầu hàng loạt - nhiều sự kiện cho cùng một người dùng có thể được xử lý theo đợt trong một lệnh gọi RPC. Vì dịch vụ RPC này cũng áp đặt giới hạn tốc độ nên chúng tôi muốn gộp các sự kiện có giá trị 10 giây lại với nhau để giảm số lượng cuộc gọi 05 0612. Có thể chia tách await beam.createRunner().run(function pipeline(root) { // Use root to build a pipeline. }); 67Một 583 có thể chia tách (SDF) cho phép người dùng tạo các thành phần mô-đun có chứa I/O (và một số thành phần nâng cao). Việc có các thành phần I/O dạng mô-đun có thể được kết nối với nhau giúp đơn giản hóa các mẫu điển hình mà người dùng muốn. Ví dụ: trường hợp sử dụng phổ biến là đọc tên tệp từ hàng đợi tin nhắn, sau đó phân tích cú pháp các tệp đó. Theo truyền thống, người dùng được yêu cầu viết một trình kết nối I/O duy nhất chứa logic cho hàng đợi tin nhắn và trình đọc tệp (độ phức tạp tăng lên) hoặc chọn sử dụng lại I/O hàng đợi tin nhắn theo sau bởi một 583 thông thường đọc tệp ( . Với SDF, chúng tôi mang đến sự phong phú của các API I/O của Apache Beam cho một mô-đun cho phép 583 trong khi vẫn duy trì hiệu suất của các trình kết nối I/O truyền thống12. 1. Khái niệm cơ bản về SDFỞ cấp độ cao, SDF chịu trách nhiệm xử lý các cặp phần tử và giới hạn. Một hạn chế đại diện cho một tập hợp con công việc cần thiết phải được thực hiện khi xử lý phần tử Thực hiện một SDF theo các bước sau
12. 1. 1. Một SDF cơ bảnMột SDF cơ bản bao gồm ba phần. hạn chế, nhà cung cấp hạn chế và trình theo dõi hạn chế. Nếu bạn muốn kiểm soát hình mờ, đặc biệt là trong đường ống phát trực tuyến, cần có thêm hai thành phần. nhà cung cấp công cụ ước tính thủy vân và công cụ ước tính thủy vân Hạn chế là một đối tượng do người dùng định nghĩa được sử dụng để biểu thị một tập hợp con công việc cho một phần tử nhất định. Ví dụ: chúng tôi đã xác định 5440 là một hạn chế để biểu thị các vị trí bù trong Java vàTrình cung cấp hạn chế cho phép các tác giả SDF ghi đè các triển khai mặc định, bao gồm cả các triển khai để phân tách và định cỡ. Trong Java và , đây là 583. có một loại 5442 chuyên dụngTrình theo dõi hạn chế chịu trách nhiệm theo dõi tập hợp con nào của hạn chế đã được hoàn thành trong quá trình xử lý. Để biết chi tiết về API, hãy đọc tài liệu tham khảo và Java Có một số triển khai 5443 tích hợp được định nghĩa trong Java
SDF cũng có triển khai 5443 tích hợp sẵn trong PythonGo cũng có loại 5443 tích hợp
Trạng thái hình mờ là một đối tượng do người dùng xác định được sử dụng để tạo một 5446 từ một 5447. Trạng thái hình mờ đơn giản nhất có thể là một 5448Nhà cung cấp công cụ ước tính hình mờ cho phép tác giả SDF xác định cách khởi tạo trạng thái hình mờ và tạo công cụ ước tính hình mờ. Trong Java và đây là 583. có một loại 5447 chuyên dụngCông cụ ước tính thủy vân theo dõi thủy vân khi một cặp giới hạn phần tử đang được tiến hành. Để biết chi tiết về API, hãy đọc tài liệu tham khảo về Java, , và Có một số triển khai 5446 tích hợp sẵn trong Java
Cùng với 5447 mặc định, có cùng một bộ triển khai 5446 tích hợp sẵn trong PythonCác loại 5446 sau đây được triển khai trong GoĐể xác định SDF, bạn phải chọn xem SDF có giới hạn (mặc định) hay không giới hạn và xác định cách khởi tạo giới hạn ban đầu cho một phần tử. Sự phân biệt dựa trên cách thể hiện khối lượng công việc
Trong Java, bạn có thể sử dụng @UnboundedPerElement hoặc @BoundedPerElement để chú thích 583 của mình. Trong Python, bạn có thể sử dụng để chú thích 583 07 08 09Tại thời điểm này, chúng tôi có một SDF hỗ trợ cho phép tái cân bằng công việc động. Để tăng tốc độ xảy ra song song hóa công việc ban đầu hoặc đối với những người chạy không hỗ trợ phân tách do người chạy bắt đầu, chúng tôi khuyên bạn nên cung cấp một tập hợp các lần phân tách ban đầu 10 11 1212. 2. Kích thước và tiến độĐịnh cỡ và tiến độ được sử dụng trong quá trình thực thi SDF để thông báo cho người chạy để họ có thể thực hiện các quyết định thông minh về việc phân chia những hạn chế nào và cách song song hóa công việc Trước khi xử lý một phần tử và hạn chế, người chạy có thể sử dụng kích thước ban đầu để chọn cách thức và người xử lý các hạn chế nhằm cải thiện sự cân bằng ban đầu và song song hóa công việc. Trong quá trình xử lý một phần tử và hạn chế, định cỡ và tiến trình được sử dụng để chọn phân chia hạn chế nào và ai sẽ xử lý chúng Theo mặc định, chúng tôi sử dụng ước tính của trình theo dõi hạn chế cho công việc còn lại dựa trên giả định rằng tất cả các hạn chế đều có chi phí bằng nhau. Để ghi đè mặc định, tác giả SDF có thể cung cấp phương pháp thích hợp trong nhà cung cấp hạn chế. Các tác giả SDF cần lưu ý rằng phương pháp định cỡ sẽ được gọi đồng thời trong quá trình xử lý gói do quá trình phân tách và ước tính tiến độ bắt đầu của người chạy 13 14 1512. 3. Điểm kiểm tra do người dùng khởi tạoMột số I/O không thể tạo ra tất cả dữ liệu cần thiết để hoàn thành một hạn chế trong thời gian tồn tại của một gói. Điều này thường xảy ra với các hạn chế không giới hạn, nhưng cũng có thể xảy ra với các hạn chế có giới hạn. Ví dụ: có thể có nhiều dữ liệu cần nhập hơn nhưng chưa có sẵn. Một nguyên nhân khác của trường hợp này là do hệ thống nguồn điều tiết dữ liệu của bạn SDF của bạn có thể báo hiệu cho bạn biết rằng bạn chưa xử lý xong hạn chế hiện tại. Tín hiệu này có thể gợi ý thời gian để tiếp tục tại. Trong khi người chạy cố gắng tôn trọng thời gian tiếp tục, điều này không được đảm bảo. Điều này cho phép thực thi tiếp tục trên một hạn chế có sẵn công việc cải thiện việc sử dụng tài nguyên 16 17 1812. 4. Runner-khởi xướng táchNgười chạy bất cứ lúc nào cũng có thể cố gắng tách một giới hạn trong khi nó đang được xử lý. Điều này cho phép người chạy tạm dừng xử lý hạn chế để có thể thực hiện công việc khác (phổ biến đối với các hạn chế không giới hạn để hạn chế lượng đầu ra và/hoặc cải thiện độ trễ) hoặc chia hạn chế thành hai phần, tăng khả năng song song có sẵn trong hệ thống. vận động viên khác nhau (e. g. , Dataflow, Flink, Spark) có các chiến lược khác nhau để phân tách theo đợt và thực thi trực tuyến Hãy ghi nhớ điều này khi viết một SDF vì thời điểm kết thúc hạn chế có thể thay đổi. Khi viết vòng lặp xử lý, hãy sử dụng kết quả từ việc cố gắng yêu cầu một phần của hạn chế thay vì cho rằng bạn có thể xử lý cho đến khi kết thúc Một ví dụ không chính xác có thể là 19 20 2112. 5. ước tính hình mờCông cụ ước tính hình mờ mặc định không tạo ra ước tính hình mờ. Do đó, hình mờ đầu ra chỉ được tính bằng số lượng hình mờ ngược dòng tối thiểu Một SDF có thể nâng cao hình mờ đầu ra bằng cách chỉ định giới hạn dưới cho tất cả đầu ra trong tương lai mà phần tử này và cặp hạn chế sẽ tạo ra. Người chạy tính toán hình mờ đầu ra tối thiểu bằng cách lấy giá trị tối thiểu trên tất cả các hình mờ ngược dòng và giá trị tối thiểu được báo cáo bởi từng phần tử và cặp giới hạn. Hình mờ được báo cáo phải tăng đơn điệu cho từng phần tử và cặp hạn chế trên các ranh giới gói. Khi một phần tử và cặp hạn chế ngừng xử lý hình mờ của nó, nó không còn được coi là một phần của phép tính trên Lời khuyên
12. 5. 1. Kiểm soát hình mờCó hai loại công cụ ước tính thủy vân chung. quan sát dấu thời gian và quan sát đồng hồ bên ngoài. Công cụ ước tính hình mờ quan sát dấu thời gian sử dụng dấu thời gian đầu ra của mỗi bản ghi để tính toán ước tính hình mờ trong khi công cụ ước tính hình mờ quan sát đồng hồ bên ngoài kiểm soát hình mờ bằng cách sử dụng đồng hồ không được liên kết với bất kỳ đầu ra riêng lẻ nào, chẳng hạn như đồng hồ cục bộ của máy hoặc đồng hồ tiếp xúc Nhà cung cấp công cụ ước tính hình mờ cho phép bạn ghi đè logic ước tính hình mờ mặc định và sử dụng triển khai công cụ ước tính hình mờ hiện có. Bạn cũng có thể cung cấp triển khai ước tính hình mờ của riêng mình 22 23 2412. 6. Cắt ngắn trong quá trình thoát nướcNgười chạy hỗ trợ đường ống thoát nước cần có khả năng thoát SDF; . Theo mặc định, các hạn chế có giới hạn xử lý phần còn lại của hạn chế trong khi các hạn chế không có giới hạn kết thúc quá trình xử lý tại điểm kiểm tra do SDF bắt đầu tiếp theo hoặc phân tách do người chạy bắt đầu. Bạn có thể ghi đè hành vi mặc định này bằng cách xác định phương thức thích hợp trên trình cung cấp hạn chế Ghi chú. Khi quá trình thoát đường ống bắt đầu và biến đổi hạn chế cắt ngắn được kích hoạt, 5457 sẽ không được lên lịch lại 25 26 2712. 7. Quyết toán góiHoàn thiện gói cho phép 583 thực hiện các tác dụng phụ bằng cách đăng ký gọi lại. Cuộc gọi lại được gọi sau khi người chạy đã thừa nhận rằng nó đã duy trì đầu ra một cách lâu dài. Ví dụ: một hàng đợi tin nhắn có thể cần xác nhận các tin nhắn mà nó đã nhập vào đường dẫn. Quyết toán gói không giới hạn ở SDF nhưng được gọi ra ở đây vì đây là trường hợp sử dụng chính 28 29 3013. Đường ống đa ngôn ngữPhần này cung cấp tài liệu toàn diện về các đường dẫn đa ngôn ngữ. Để bắt đầu tạo một kênh dẫn đa ngôn ngữ, hãy xem
Beam cho phép bạn kết hợp các biến đổi được viết bằng bất kỳ ngôn ngữ SDK được hỗ trợ nào (hiện tại là Java và Python) và sử dụng chúng trong một kênh dẫn đa ngôn ngữ. Khả năng này giúp dễ dàng cung cấp chức năng mới đồng thời trong các Apache Beam SDK khác nhau thông qua một chuyển đổi ngôn ngữ chéo duy nhất. Ví dụ: trình kết nối Apache Kafka và chuyển đổi SQL từ SDK Java có thể được sử dụng trong các đường dẫn Python Các quy trình sử dụng biến đổi từ nhiều ngôn ngữ SDK được gọi là quy trình đa ngôn ngữ 13. 1. Tạo chuyển đổi ngôn ngữ chéoĐể cung cấp các biến đổi được viết bằng một ngôn ngữ cho các quy trình được viết bằng ngôn ngữ khác, Beam sử dụng một dịch vụ mở rộng, dịch vụ này tạo và đưa các đoạn quy trình dành riêng cho ngôn ngữ thích hợp vào quy trình Trong ví dụ sau, một đường dẫn Beam Python khởi động một dịch vụ mở rộng Java cục bộ để tạo và thêm các đoạn đường dẫn Java thích hợp để thực thi chuyển đổi ngôn ngữ chéo Java Kafka thành đường dẫn Python. SDK sau đó tải xuống và tạo các giai đoạn phụ thuộc Java cần thiết để thực hiện các biến đổi này Khi chạy, trình chạy Beam sẽ thực thi cả hai phép biến đổi Python và Java để chạy đường dẫn Trong phần này, chúng tôi sẽ sử dụng KafkaIO. Đọc để minh họa cách tạo chuyển đổi ngôn ngữ chéo cho Java và ví dụ thử nghiệm cho Python 13. 1. 1. Tạo các biến đổi Java đa ngôn ngữCó hai cách để cung cấp các biến đổi Java cho các SDK khác
13. 1. 1. 1 Sử dụng các biến đổi Java hiện có mà không cần viết thêm mã JavaBắt đầu với Beam 2. 34. 0, người dùng SDK Python có thể sử dụng một số biến đổi Java mà không cần viết mã Java bổ sung. Điều này có thể hữu ích trong nhiều trường hợp. Ví dụ
Để đủ điều kiện sử dụng trực tiếp, API của biến đổi Java phải đáp ứng các yêu cầu sau
Đây là một lớp Java mẫu có thể được sử dụng trực tiếp từ API Python 31Để biết ví dụ hoàn chỉnh, hãy xem JavaDataGenerator Để sử dụng một lớp Java tuân thủ các yêu cầu trên từ đường dẫn SDK Python, hãy làm theo các bước sau
Bắt đầu với Beam 2. 36. 0, có thể bỏ qua bước 1 và 2, như được mô tả trong các phần tương ứng bên dưới Bước 1 Để sử dụng biến đổi Java đủ điều kiện từ Python, hãy xác định danh sách cho phép yaml. Danh sách cho phép này liệt kê tên lớp, phương thức hàm tạo và phương thức trình tạo có sẵn trực tiếp để sử dụng từ phía Python Bắt đầu với Beam 2. 35. 0, bạn có tùy chọn chuyển 5006 sang tùy chọn 5459 thay vì xác định danh sách cho phép thực tế. 5006 chỉ định rằng tất cả các biến đổi được hỗ trợ trong đường dẫn lớp của dịch vụ mở rộng có thể được truy cập thông qua API. Chúng tôi khuyến khích sử dụng danh sách cho phép thực tế để sản xuất, vì việc cho phép khách hàng truy cập các lớp Java tùy ý có thể gây ra rủi ro bảo mật 32Bước 2 Cung cấp danh sách cho phép làm đối số khi khởi động dịch vụ mở rộng Java. Ví dụ: bạn có thể bắt đầu dịch vụ mở rộng dưới dạng quy trình Java cục bộ bằng cách sử dụng lệnh sau 33Bắt đầu với Beam 2. 36. 0, API 5463 sẽ tự động khởi động dịch vụ mở rộng với phần phụ thuộc tệp 5464 đã cho nếu địa chỉ dịch vụ mở rộng không được cung cấpBước 3 Bạn có thể sử dụng lớp Java trực tiếp từ đường dẫn Python của mình bằng cách sử dụng một biến đổi sơ khai được tạo từ API 5463. API này cho phép bạn xây dựng biến đổi bằng cách sử dụng tên lớp Java và cho phép bạn gọi các phương thức của trình tạo để định cấu hình lớpCác loại tham số của hàm tạo và phương thức được ánh xạ giữa Python và Java bằng cách sử dụng lược đồ Beam. Lược đồ được tạo tự động bằng cách sử dụng các loại đối tượng được cung cấp ở phía Python. Nếu phương thức xây dựng của lớp Java hoặc phương thức xây dựng chấp nhận bất kỳ loại đối tượng phức tạp nào, hãy đảm bảo rằng lược đồ Beam cho các đối tượng này đã được đăng ký và có sẵn cho dịch vụ mở rộng Java. Nếu lược đồ chưa được đăng ký, dịch vụ mở rộng Java sẽ cố gắng đăng ký lược đồ bằng cách sử dụng. Trong Python, các đối tượng tùy ý có thể được biểu diễn bằng cách sử dụng các 5052, sẽ được biểu diễn dưới dạng các hàng Beam trong lược đồ. Đây là một biến đổi sơ khai Python đại diện cho biến đổi Java đã đề cập ở trên 34Bạn có thể sử dụng biến đổi này trong một đường dẫn Python cùng với các biến đổi Python khác. Để biết ví dụ hoàn chỉnh, hãy xem javadatagenerator. py 13. 1. 1. 2 Sử dụng API để cung cấp các biến đổi Java hiện có cho các SDK khácĐể làm cho Beam Java SDK của bạn có thể chuyển đổi linh hoạt trên các ngôn ngữ SDK, bạn phải triển khai hai giao diện. ExternalTransformBuilder và ExternalTransformRegistrar. Giao diện 5467 xây dựng chuyển đổi ngôn ngữ chéo bằng cách sử dụng các giá trị cấu hình được truyền vào từ đường ống và giao diện 5468 đăng ký chuyển đổi ngôn ngữ chéo để sử dụng với dịch vụ mở rộngTriển khai các giao diện
Sau khi bạn đã triển khai các giao diện 5467 và 5468, biến đổi của bạn có thể được đăng ký và tạo thành công bởi dịch vụ mở rộng Java mặc địnhBắt đầu dịch vụ mở rộng Bạn có thể sử dụng dịch vụ mở rộng với nhiều biến đổi trong cùng một quy trình. Beam Java SDK cung cấp dịch vụ mở rộng mặc định cho các biến đổi Java. Bạn cũng có thể viết dịch vụ mở rộng của riêng mình, nhưng điều đó thường không cần thiết, vì vậy nó không được đề cập trong phần này Thực hiện các thao tác sau để khởi động trực tiếp dịch vụ mở rộng Java 37Dịch vụ mở rộng hiện đã sẵn sàng để phục vụ các biến đổi trên cổng được chỉ định Khi tạo trình bao bọc dành riêng cho SDK cho biến đổi của mình, bạn có thể sử dụng các tiện ích do SDK cung cấp để bắt đầu dịch vụ mở rộng. Ví dụ: SDK Python cung cấp các tiện ích và để khởi động dịch vụ mở rộng Java bằng tệp JAR bao gồm các phụ thuộc Nếu biến đổi của bạn yêu cầu các thư viện bên ngoài, bạn có thể đưa chúng vào bằng cách thêm chúng vào đường dẫn lớp của dịch vụ mở rộng. Sau khi chúng được đưa vào đường dẫn lớp, chúng sẽ được phân đoạn khi biến đổi của bạn được mở rộng bởi dịch vụ mở rộng Viết trình bao bọc dành riêng cho SDK Chuyển đổi Java ngôn ngữ chéo của bạn có thể được gọi thông qua lớp cấp thấp hơn trong một đường dẫn đa ngôn ngữ (như được mô tả trong phần tiếp theo); . Sự trừu tượng hóa cấp cao hơn này sẽ giúp các tác giả đường ống sử dụng biến đổi của bạn dễ dàng hơn Để tạo trình bao bọc SDK để sử dụng trong đường dẫn Python, hãy làm như sau
13. 1. 2. Tạo các biến đổi Python đa ngôn ngữBất kỳ biến đổi Python nào được xác định trong phạm vi của dịch vụ mở rộng đều có thể truy cập được bằng cách chỉ định tên đủ điều kiện của chúng. Ví dụ: bạn có thể sử dụng biến đổi 5493 của Python trong một quy trình Java với tên đủ điều kiện của nó là 5494 40
Ngoài ra, bạn có thể muốn tạo một mô-đun Python đăng ký một biến đổi Python hiện có dưới dạng một biến đổi ngôn ngữ chéo để sử dụng với dịch vụ mở rộng Python và gọi vào biến đổi hiện có đó để thực hiện thao tác dự định của nó. Một URN đã đăng ký có thể được sử dụng sau này trong yêu cầu mở rộng để chỉ ra mục tiêu mở rộng Xác định mô-đun Python
Bắt đầu dịch vụ mở rộng Một dịch vụ mở rộng có thể được sử dụng với nhiều biến đổi trong cùng một đường ống. Beam Python SDK cung cấp dịch vụ mở rộng mặc định để bạn sử dụng với các biến đổi Python của mình. Bạn có thể tự do viết dịch vụ mở rộng của riêng mình, nhưng điều đó thường không cần thiết, vì vậy nó không được đề cập trong phần này Thực hiện các bước sau để khởi động trực tiếp dịch vụ mở rộng Python mặc định
bao gồm các phụ thuộc Hiện tại, các phép biến đổi bên ngoài của Python bị giới hạn ở các phần phụ thuộc có sẵn trong bộ khai thác Beam SDK cốt lõi 13. 1. 3. Tạo biến đổi ngôn ngữ chéoGo hiện không hỗ trợ tạo biến đổi ngôn ngữ chéo, chỉ sử dụng biến đổi ngôn ngữ chéo từ các ngôn ngữ khác; 13. 1. 4. Định nghĩa một URNPhát triển chuyển đổi ngôn ngữ chéo liên quan đến việc xác định URN để đăng ký chuyển đổi với dịch vụ mở rộng. Trong phần này, chúng tôi cung cấp một quy ước để xác định các URN như vậy. Việc tuân theo quy ước này là tùy chọn nhưng nó sẽ đảm bảo rằng biến đổi của bạn sẽ không gặp xung đột khi đăng ký dịch vụ mở rộng cùng với các biến đổi do các nhà phát triển khác phát triển 13. 1. 4. 1. Lược đồMột URN nên bao gồm các thành phần sau
Chúng tôi cung cấp lược đồ từ quy ước URN ở dạng Backus–Naur tăng cường. Từ khóa trong chữ hoa là từ thông số URN 4813. 1. 4. 2. ví dụDưới đây chúng tôi đã đưa ra một số ví dụ về các lớp biến đổi và các URN tương ứng sẽ được sử dụng
13. 2. Sử dụng biến đổi ngôn ngữ chéoTùy thuộc vào ngôn ngữ SDK của quy trình, bạn có thể sử dụng lớp trình bao bọc SDK cấp cao hoặc lớp chuyển đổi cấp thấp để truy cập chuyển đổi ngôn ngữ chéo 13. 2. 1. Sử dụng các biến đổi ngôn ngữ chéo trong một đường dẫn JavaNgười dùng có ba tùy chọn để sử dụng chuyển đổi ngôn ngữ chéo trong đường dẫn Java. Ở mức độ trừu tượng cao nhất, một số biến đổi Python phổ biến có thể truy cập được thông qua các biến đổi trình bao bọc Java chuyên dụng. Ví dụ: SDK Java có lớp 5506, lớp này sử dụng lớp 5506 của SDK Python và lớp này có lớp 5508, lớp này sử dụng lớp 5508 của SDK Python, v.v. Khi biến đổi trình bao bọc dành riêng cho SDK không có sẵn cho biến đổi Python đích, bạn có thể sử dụng lớp PythonExternalTransform cấp thấp hơn thay vào đó bằng cách chỉ định tên đủ điều kiện của biến đổi Python. Nếu bạn muốn thử chuyển đổi bên ngoài từ SDK khác ngoài Python (bao gồm cả SDK Java), bạn cũng có thể sử dụng lớp Bên ngoài cấp thấp nhấtSử dụng trình bao bọc SDK Để sử dụng chuyển đổi ngôn ngữ chéo thông qua trình bao bọc SDK, hãy nhập mô-đun cho trình bao bọc SDK và gọi nó từ quy trình của bạn, như minh họa trong ví dụ 49Sử dụng lớp PythonExternalTransform Khi không có trình bao bọc dành riêng cho SDK, bạn có thể truy cập biến đổi đa ngôn ngữ Python thông qua lớp 5495 bằng cách chỉ định tên đủ điều kiện và đối số hàm tạo của biến đổi Python đích 50Sử dụng lớp bên ngoài
13. 2. 2. Sử dụng các biến đổi ngôn ngữ chéo trong một đường dẫn PythonNếu có trình bao bọc dành riêng cho Python cho biến đổi ngôn ngữ chéo, hãy sử dụng trình bao bọc đó. Mặt khác, bạn phải sử dụng lớp cấp thấp hơn để truy cập biến đổi Sử dụng trình bao bọc SDK Để sử dụng chuyển đổi ngôn ngữ chéo thông qua trình bao bọc SDK, hãy nhập mô-đun cho trình bao bọc SDK và gọi nó từ quy trình của bạn, như minh họa trong ví dụ 51Sử dụng lớp ExternalTransform Khi không có trình bao bọc dành riêng cho SDK, bạn sẽ phải truy cập vào chuyển đổi ngôn ngữ chéo thông qua lớp 5482
Sử dụng lớp JavaExternalTransform Python có khả năng gọi các phép biến đổi do Java định nghĩa thông qua như thể chúng là các phép biến đổi Python. Chúng được gọi như sau 53Phương thức 5517 của Python có thể được sử dụng nếu tên phương thức trong java là các từ khóa Python dành riêng, chẳng hạn như 5518Cũng như các biến đổi bên ngoài khác, có thể cung cấp dịch vụ mở rộng bắt đầu trước hoặc các tệp jar bao gồm biến đổi, các phần phụ thuộc của nó và dịch vụ mở rộng của Beam, trong trường hợp đó, dịch vụ mở rộng sẽ tự động khởi động 13. 2. 3. Sử dụng chuyển đổi ngôn ngữ chéo trong đường dẫn GoNếu có sẵn trình bao bọc dành riêng cho ngôn ngữ chéo, hãy sử dụng trình bao bọc đó. Mặt khác, bạn phải sử dụng chức năng cấp thấp hơn để truy cập biến đổi Dịch vụ mở rộng Go SDK hỗ trợ tự động bắt đầu các dịch vụ mở rộng Java nếu địa chỉ mở rộng không được cung cấp, mặc dù điều này chậm hơn so với việc cung cấp dịch vụ mở rộng liên tục. Nhiều biến đổi Java được bao gói quản lý thực hiện việc này một cách tự động; . Để sử dụng chuyển đổi ngôn ngữ chéo Python, bạn phải bắt đầu thủ công bất kỳ dịch vụ mở rộng cần thiết nào trên máy cục bộ của mình và đảm bảo chúng có thể truy cập được vào mã của bạn trong quá trình xây dựng đường ống Sử dụng trình bao bọc SDK Để sử dụng chuyển đổi ngôn ngữ chéo thông qua trình bao bọc SDK, hãy nhập gói cho trình bao bọc SDK và gọi gói đó từ quy trình của bạn như minh họa trong ví dụ 54Sử dụng chức năng CrossLanguage Khi không có trình bao bọc dành riêng cho SDK, bạn sẽ phải truy cập vào chuyển đổi ngôn ngữ chéo thông qua chức năng 5520
13. 2. 4. Sử dụng các biến đổi ngôn ngữ chéo trong một đường ống Bản mô tảViệc sử dụng trình bao bọc Bản mô tả cho đường dẫn ngôn ngữ chéo cũng tương tự như sử dụng bất kỳ biến đổi nào khác, miễn là các phụ thuộc (e. g. một trình thông dịch Python gần đây hoặc Java JRE) có sẵn. Ví dụ: hầu hết các IO Bản mô tả chỉ đơn giản là các trình bao bọc xung quanh các biến đổi Beam từ các ngôn ngữ khác Nếu trình bao bọc chưa có sẵn, người ta có thể sử dụng nó một cách rõ ràng bằng cách sử dụng apache_beam. biến đổi. bên ngoài. rawExternalTransform. lấy `urn` (chuỗi xác định biến đổi), `payload` (đối tượng nhị phân hoặc json tham số hóa biến đổi) và `expansionService` có thể là địa chỉ của dịch vụ bắt đầu trước hoặc trả về có thể gọi được Ví dụ, người ta có thể viết 56Lưu ý rằng 5522 phải có bộ mã hóa tương thích đa ngôn ngữ, chẳng hạn như 5523. Điều này có thể được đảm bảo với các biến đổi withCoderInternal hoặc withRowCoder, e. g 57Coder cũng có thể được chỉ định trên đầu ra nếu nó không thể được suy ra, e. g Ngoài ra, có một số tiện ích như pythonTransform giúp gọi các phép biến đổi từ các ngôn ngữ cụ thể dễ dàng hơn 58Chuyển đổi ngôn ngữ chéo cũng có thể được xác định theo dòng, có thể hữu ích để truy cập các tính năng hoặc thư viện không có sẵn trong SDK gọi 5913. 3. Hỗ trợ người chạyHiện tại, các trình chạy di động như Flink, Spark và trình chạy trực tiếp có thể được sử dụng với các đường dẫn đa ngôn ngữ Dataflow hỗ trợ các đường ống đa ngôn ngữ thông qua kiến trúc phụ trợ Dataflow Runner v2 13. 4 mẹo và khắc phục sự cốĐể biết thêm mẹo và thông tin khắc phục sự cố, hãy xem tại đây 14 DoFn theo đợtThích ứng cho
Batched DoFns hiện là một tính năng chỉ dành cho Python Batched DoFns cho phép người dùng tạo các thành phần mô-đun, có thể kết hợp hoạt động theo lô gồm nhiều thành phần logic. Các DoFn này có thể tận dụng các thư viện Python được vector hóa, như numpy, scipy và pandas, hoạt động trên các lô dữ liệu để đạt hiệu quả 14. 1 Khái niệm cơ bảnBatched DoFns hiện là một tính năng chỉ dành cho Python Một Batched DoFn tầm thường có thể trông như thế này 60DoFn này có thể được sử dụng trong đường ống Beam hoạt động trên các phần tử riêng lẻ. Beam sẽ hoàn toàn đệm các phần tử và tạo các mảng có nhiều mảng ở phía đầu vào và ở phía đầu ra, nó sẽ phân tách các mảng có nhiều mảng thành các phần tử riêng lẻ 61Lưu ý rằng chúng tôi sử dụng để đặt kiểu chữ khôn ngoan cho đầu ra của 5525. Sau đó, khi áp dụng 5526 cho 73 này, Beam nhận ra rằng 5528 là loại lô có thể chấp nhận được để sử dụng cùng với các phần tử 5529. Chúng tôi sẽ sử dụng các gợi ý kiểu chữ gọn gàng như thế này trong suốt hướng dẫn này, nhưng Beam cũng hỗ trợ các gợi ý kiểu chữ từ các thư viện khác, hãy xemTrong trường hợp trước, Beam sẽ ngầm tạo và phát nổ các lô ở ranh giới đầu vào và đầu ra. Tuy nhiên, nếu Batched DoFns với các loại tương đương được xâu chuỗi lại với nhau, việc tạo và phát nổ hàng loạt này sẽ bị loại bỏ. Các lô sẽ được chuyển thẳng qua. Điều này làm cho việc tổng hợp hiệu quả các biến đổi hoạt động theo lô trở nên đơn giản hơn nhiều 6214. Dự phòng 2 phần tửBatched DoFns hiện là một tính năng chỉ dành cho Python Đối với một số DoFns, bạn có thể cung cấp cả triển khai theo lô và triển khai theo từng phần tử logic mong muốn của mình. Bạn có thể làm điều này bằng cách xác định cả 630 và 5531 63Khi thực hiện DoFn này, Beam sẽ chọn cách triển khai tốt nhất để sử dụng trong bối cảnh nhất định. Nói chung, nếu các đầu vào cho DoFn đã được theo đợt thì Beam sẽ sử dụng triển khai theo đợt; Lưu ý rằng, trong trường hợp này, không cần xác định 5533. Điều này là do Beam có thể lấy loại đầu ra từ gợi ý đánh máy trên 63014. 3 Sản xuất hàng loạt so với. tiêu thụ hàng loạtBatched DoFns hiện là một tính năng chỉ dành cho Python Theo quy ước, Beam giả định rằng phương pháp 5531, sử dụng các đầu vào theo đợt, cũng sẽ tạo ra các đầu ra theo đợt. Tương tự, Beam giả sử phương pháp 630 sẽ tạo ra các phần tử riêng lẻ. Điều này có thể được ghi đè bằng và trang trí. Ví dụ 6414. 4 loại lô được hỗ trợBatched DoFns hiện là một tính năng chỉ dành cho Python Chúng tôi đã sử dụng các loại numpy trong triển khai Batched DoFn trong hướng dẫn này – 5539 làm gợi ý kiểu phần tử và 5528 làm gợi ý kiểu lô tương ứng – nhưng Beam cũng hỗ trợ các gợi ý kiểu chữ từ các thư viện kháccục mịchLoại phần tửgợi ýLoại hàng loạtgợi ýCác loại số ( 601, 5542, 5543,…) np. ndarray (của Mảng Numpy)gấu trúcLoại phần tửgợi ýLoại hàng loạtgợi ýCác loại số ( 601, 5542, 5543,…) 5547 5548 5057 5550Các loại khác?Nếu có các loại lô khác mà bạn muốn sử dụng với Batched DoFns, vui lòng gửi vấn đề 14. 5 loại đầu vào và đầu ra hàng loạt độngBatched DoFns hiện là một tính năng chỉ dành cho Python Đối với một số DoFn theo lô, có thể không đủ để khai báo các loại lô một cách tĩnh, với các gợi ý về kiểu chữ trên 630 và/hoặc 5531. Bạn có thể cần phải khai báo động các kiểu này. Bạn có thể làm điều này bằng cách ghi đè các phương thức và trên DoFn của mình 6514. 6 lô và ngữ nghĩa thời gian sự kiệnBatched DoFns hiện là một tính năng chỉ dành cho Python Hiện tại, các lô phải có một bộ thông tin thời gian duy nhất (thời gian sự kiện, cửa sổ, v.v.) áp dụng cho mọi thành phần logic trong lô. Hiện tại không có cơ chế để tạo các lô kéo dài nhiều dấu thời gian. Tuy nhiên, có thể truy xuất thông tin thời gian này trong triển khai Batched DoFn. Thông tin này có thể được truy cập bằng cách sử dụng các thuộc tính 5555 thông thường |