рд╕реНрдкрд╛рд░реНрдХ рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рддрд░рд┐рдд рдЧреНрд░рд╛рдл рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рдЫрд╡рд┐

"рд╕рд░рд▓рддрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛ рд╣реИ" рдПрджреНрдЧрд░ рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛ рджреНрд╡рд╛рд░рд╛

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рд░реЗрдЦрд╛рдВрдХрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рди рд╣реИ, рд▓рд┐рдпреЛрдирд╣рд╛рд░реНрдб рдпреВрд▓рд░ рдХреЗ рд╕рдордп рд╕реЗ рдЗрд╕рдиреЗ рдорд╛рдирд╡ рдЬрд╛рддрд┐ рдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдХреЛрдирд┐рдЧреНрд╕рдмрд░реНрдЧ рдХреЗ рд╕рднреА рд╕рд╛рдд рдкреБрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЛ рдмрд╛рд░ рдпрд╛ рдХрд┐рд╕реА рдпрд╛рддреНрд░рд╛ рдордзреНрдпрд╕реНрде рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рд▓рд╛рднрджрд╛рдпрдХ рдорд╛рд░реНрдЧред

рдпреВрд▓рд░ рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ: рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВред рдпрд╣ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдЕрдВрддрд┐рдо рд╣реИ рдЬрд┐рд╕рдиреЗ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рднрдВрдбрд╛рд░рдг рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдпрджрд┐ рдЖрдк рдореВрд▓ Apache Spark рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдЬреИрд╕реЗ RDD, Driver program, Worker рдиреЛрдб рдЖрджрд┐ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк Databricks рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝реЗрдВред

рдореЗрд░реЗ рд▓рд┐рдП, рдПрдХ рддрдХрдиреАрдХ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдПред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЧреНрд░рд╛рдл рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ "рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ" рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП "рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ" рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рдереА: рдбрд┐рд╕реНрдХ рдкрд░ tsv рдлрд╛рдЗрд▓реЗрдВ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдпреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдк рдЬреИрд╕реЗ Parquet, Avro рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣рдг рд╕реНрдерд╛рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдпрд╣ HDFS рдпрд╛ S3 рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рд╕реНрдкрд╛рд░реНрдХ рдПрд╕рдХреНрдпреВрдПрд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрдЧреА: рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдФрд░ рдЙрд╕рдХреЗ рдирд╛рдо рдХреА рдЬреЛрдбрд╝реА, рджреВрд╕рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕рд╛рдерд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рд╡рд╛, рд╕реНрдХрд╛рд▓рд╛ рдФрд░ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рдЪреБрдирд╛ред

рддреБрд░рдВрдд рдореИрдВ рдЗрд╕ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╛рд░реНрдХ рдЧреНрд░рд╛рдлрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдЗрдВрд╕рд░реНрдЯ / рдЕрдкрдбреЗрдЯ рдСрдкрд░реЗрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ - рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдЖрд░рдбреАрдбреА рдЪреЗрдВрдЬ рдСрдкрд░реЗрд╢рдВрд╕ рдлреЛрд░реНрд╕ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкреВрд░реЗ рдЖрд░рдбреАрдбреА рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред NoSql рд╕реЙрд▓реНрдпреВрд╢рди рдЬреИрд╕реЗ Neo4J, рдЯрд╛рдЗрдЯреЗрдирд┐рдпрдо рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Cassandra, Hbaseред рдХреБрдЫ рднреА рдирд╣реАрдВ рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реЗрдЦрд╛рдВрдХрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╛рде рд╕реНрдкрд╛рд░реНрдХ рдЧреНрд░рд╛рдл рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕реНрд╡рдпрдВ рд▓реЛрдб рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реЗрдбреНрдпреВрд▓рд░ рдпрд╛ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╢реИрд▓реА рдореЗрдВред

рддреЛ рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдиреЗ рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ (рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рд╣реИрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):

def verts: RDD[(VertexId, String)] = sc.textFile(USER_NAMES) .flatMap(InputDataFlow.parseNames) def edges: RDD[Edge[PartitionID]] = sc.textFile(USER_GRAPH) .flatMap(InputDataFlow.makeEdges) 

Pregel


рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рдореЗрдВ рдЧреНрд░рд╛рдл рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рддрдВрддреНрд░ рдкреНрд░рд╛рдЧреЗрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо Google рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреНрд░рд╛рдЧреЗрд▓ рдореЙрдбрд▓ рдЧреНрд░рд╛рдл рдореЗрдВ рдХреЛрдиреЗ рдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реБрдкрд░рд╕реНрдЯреЗрдкреНрд╕ рдирд╛рдордХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдкреАрдЫреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рдПрдХ рд╢рд┐рдЦрд░ рдХреА рддрд░рд╣ рд╕реЛрдЪреЗрдВ" , рдЕрд░реНрдерд╛рдд рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред

рдирд┐рдпрдорд┐рдд MapReduce рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп Pregel рдмреЗрд╣рдж рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдЧреЗрд▓ рдирд╛рдо рдирджреА рдХреЗ рдирд╛рдо рд╕реЗ рдЖрдпрд╛ рд╣реИ, рдЬреЛ рдХреЛрдПрдирд┐рдЧреНрд╕рдмрд░реНрдЧ рдХреЗ рд╕рд╛рдд рдкреБрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЧреНрд░рд╛рдл рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЖрджрд┐рдо рдПрдХ рдЯреНрд░рд┐рдкрд▓ рд╣реИ - рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ: рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ (рдПрдХ рд╕реНрд░реЛрдд рд╢реАрд░реНрд╖), рдЬрд┐рд╕ рд╢реАрд░реНрд╖ рдореЗрдВ рд╣рдо рдЧреБрдЬрд░рддреЗ рд╣реИрдВ (рдПрдХ рдЧрдВрддрд╡реНрдп рд╢реАрд░реНрд╖) рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХрд╛ рдХрд┐рдирд╛рд░рд╛ (рдПрдХ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдХрд┐рдирд╛рд░рд╛) - рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЬрд╣рд╛рдВ рд╣рдо рдЬрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рд╕ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реАрдЧреЗрд▓ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреВрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЬрд┐рдЯрд┐рд╡ рдЗрдирдлрд┐рдирд┐рдЯреА, рдпреВрдбреАрдПрдл (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди) рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпреВрдПрдлрдПрдл рджреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рд╛рд╣рдЪрд░реНрдпред рдЪреВрдВрдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдВрддрд┐рдо рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬрдм рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдЧреЗрд▓ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИред рдкрд╣рд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬрд┐рд╕реЗ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рд╣реИ рджрд┐рдХреНрдЬрд╕реНрдЯреНрд░рд╛ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЬреЛ рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдордирдорд╛рдирд╛ рд╢реАрд░реНрд╖ рд╕реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

 def dijkstraShortestPath[VT](graph: GenericGraph[VT], sourceId: VertexId) = { val initialGraph = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity) val sssp = initialGraph.pregel(Double.PositiveInfinity)( (_, dist, newDist) => math.min(dist, newDist), triplet => { //Distance accumulator if (triplet.srcAttr + triplet.attr < triplet.dstAttr) { Iterator((triplet.dstId, triplet.srcAttr + triplet.attr)) } else { Iterator.empty } }, (a, b) => math.min(a, b) ) sssp.vertices.sortByKey(ascending = true).collect.mkString("\n") } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╣рдо рдПрдХ рджрд┐рдП рдЧрдП рд╢реАрд░реНрд╖ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рдиреНрдпреВрдирддрдо рджреВрд░реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд╛рдЧреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╢реАрд░реНрд╖ рдХреЗ рдмреАрдЪ рдХреА рд╕рдмрд╕реЗ рдЫреЛрдЯреА рджреВрд░реА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рджреВрд░реА рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди - рдпрд╣ рдХрдо рдЪрд░рдг рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ - рдХрдИ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╕ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЧреНрд░рд╛рдл рдЖрдЙрдЯрдкреБрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЬреБрджрд╛рдИ рдХреА рдбрд┐рдЧреНрд░реА


рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдХрдИ рдкрд╛рдардХреЛрдВ рдиреЗ рдЫрд╣ рд╣реИрдВрдбрд╢реЗрдХ ( рдкреГрдердХреНрдХрд░рдг рдХреЗ рдЫрд╣ рдбрд┐рдЧреНрд░реА ) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ - рдпрд╣ рдПрдХ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рд╕реА рднреА рджреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╛рдВрдЪ рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдЪрд┐рддреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛рдиреА рджреЛ рдордирдорд╛рдиреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо 6 рд╣реИрдВрдбрд╢реЗрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреГрдереНрд╡реА рдкрд░ рдордиреБрд╖реНрдпред рдЧреНрд░рд╛рдл рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ: рдбреЗрдЯрд┐рдВрдЧ рдЧреНрд░рд╛рдл рдХрд╛ рд╡реНрдпрд╛рд╕ рдкреГрдереНрд╡реА рдкрд░ рдХрд┐рд╕реА рднреА рджреЛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП 6 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рд╣рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд рд╢реАрд░реНрд╖ рдХреЗ рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдПрдХ рдЪреМрдбрд╝рд╛рдИ-рдкрд╣рд▓реА рдЦреЛрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рджрд┐рдХреНрдЬрд╕реНрдЯреНрд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 def getBFS(root: VertexId) = { val initialGraph = graph.mapVertices((id, _) => if (id == root) 0.0 else Double.PositiveInfinity) val bfs = initialGraph.pregel(Double.PositiveInfinity, maxIterations = 10)( (_, attr, msg) => math.min(attr, msg), triplet => { if (triplet.srcAttr != Double.PositiveInfinity) { Iterator((triplet.dstId, triplet.srcAttr + 1)) } else { Iterator.empty } }, (a, b) => math.min(a, b)).cache() bfs } 

рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ - рдЖрдкрдХреЗ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдореЗрд░реЗ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП 10 рдореИрдВ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдорд┐рд▓рд╛ред рдЕрдЧрд▓рд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗрдВ рдФрд░ рдПрдХ рдордирдорд╛рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ 100 рдорд╛рди рд▓реЗрдВ:

 def degreeOfSeparation(root: VertexId): Array[(VertexId, DegreeOfSeparation)] = { getBFS(root).vertices.join(verts).take(100) } 

рдЕрдм рд╣рдо рджрд┐рдП рдЧрдП рд╢реАрд░реНрд╖ рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЧреНрд░реА рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рджреЛ рдордирдорд╛рдирд╛ рдХреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдбрд┐рдЧреНрд░реА рднреА рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

 def degreeOfSeparationTwoUser(firstUser: VertexId, secondUser: VertexId) = { getBFS(firstUser) .vertices .filter { case (vertexId, _) => vertexId == secondUser } .collect.map { case (_, degree) => degree } } 

рдмреЙрдХреНрд╕ рд╕реЗ рд╕реНрдкрд╛рд░реНрдХ рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рдЖрдкрдХреЛ рдЧреНрд░рд╛рдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдл рдХреЗ рдЬреБрдбрд╝реЗ рдШрдЯрдХ (рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдШрдЯрдХ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 def getMostConnectedUsers(amount: Int): Array[(VertexId, ConnectedUser)] = { graph.degrees.join(verts) .sortBy({ case (_, (userName, _)) => userName }, ascending = false) .take(amount) } 

рдпрд╛ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рддреНрд░рд┐рднреБрдЬ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬреИрд╕реЗ рдПрдХ рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рддреНрд░рд┐рдХреЛрдг рдЧрдгрдирд╛):

 def socialGraphTriangleCount = graph.triangleCount() 

рдкреЗрдЬ рд░реИрдВрдХ


рдкреЗрдЬрд░реИрдВрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реНрдЯреИрдирдлреЛрд░реНрдб рд╕реНрдирд╛рддрдХ рдЫрд╛рддреНрд░реЛрдВ рд▓реИрд░реА рдкреЗрдЬ рдФрд░ рд╕рд░реНрдЧреЗрдИ рдмреНрд░рд┐рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛ред рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдиреНрдп рд╕рднреА рдХреЗ рдмреАрдЪ рдорд╣рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рдЯреНрд╡рд┐рдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЙрдЪреНрдЪ рд░реЗрдЯрд┐рдВрдЧ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП, рд╡рд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦреЛрдЬ рдЗрдВрдЬрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рдореЗрдВ рдкреЗрдЬрд░реИрдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рд╕реНрдерд┐рд░ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд░реЗрдЯрд┐рдВрдЧ рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рди рд╣реЛ рдЬрд╛рдПред

рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 def dynamicRanks(socialGraph: SocialGraph, tolerance: Double) = socialGraph.graph.pageRank(tol = tolerance).vertices def staticRanks(socialGraph: SocialGraph, tolerance: Double) = socialGraph.graph.staticPageRank(numIter = 20).vertices 

рдирд┐рд╖реНрдХрд░реНрд╖


рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╣рдордиреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣рд╛рдБ рд╣рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдПрдЧреНрдЬреЗрд░ рдбреАрдЬрдХрд╕реНрдЯреНрд░рд╛ рдХреЗ рдЙрджреНрдзрд░рдг рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдкрд╛рд░реНрдХ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рдмреЛрдЭ рдФрд░ рдмреЛрдЭ рдХреЛ рд▓реЗрдХрд░ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рддрд░рд┐рдд рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдХреНрд▓рд╕реНрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ : Hadoop YARN, Apache Mesos (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк), рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi415939/


All Articles