日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PigPen:用Clojure写MapReduce Introducing PigPen: Map-Reduce for Clojure

發(fā)布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PigPen:用Clojure写MapReduce Introducing PigPen: Map-Reduce for Clojure 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

It is our pleasure to release?PigPen?to the world today. PigPen is map-reduce for?Clojure. It compiles toApache Pig, but you don’t need to know much about Pig to use it.

What is PigPen?

  • A map-reduce language that looks and behaves like clojure.core
  • The ability to write map-reduce queries as programs, not scripts
  • Strong support for unit tests and iterative development

Note: If you are not familiar at all with?Clojure, we strongly recommend that you try a tutorial?here,?here, orhere?to understand some of the?basics.

Really, yet another map-reduce language?

If you know Clojure, you already know PigPen

The primary goal of PigPen is to take language out of the equation. PigPen operators are designed to be as close as possible to the Clojure equivalents. There are no special user defined functions (UDFs). Define Clojure functions, anonymously or named, and use them like you would in any Clojure program.

Here’s the proverbial word count:

(require '[pigpen.core :as pig])(defn word-count [lines](->> lines(pig/mapcat #(-> % first(clojure.string/lower-case)(clojure.string/replace #"[^\w\s]" "")(clojure.string/split #"\s+")))(pig/group-by identity)(pig/map (fn [[word occurrences]] [word (count occurrences)]))))

This defines a function that returns a PigPen query expression. The query takes a sequence of lines and returns the frequency that each word appears. As you can see, this is just the word count logic. We don’t have to conflate external concerns, like where our data is coming from or going to.

Will it compose?

Yep - PigPen queries are written as function compositions - data in, data out. Write it once and avoid the copy & paste routine.

Here we use our word-count function (defined above), along with a load and store command, to make a PigPen query:

(defn word-count-query [input output](->>(pig/load-tsv input)(word-count)(pig/store-tsv output)))

This function returns the PigPen representation of the query. By itself, it won’t do anything - we have to execute it locally or generate a script (more on that later).

You like unit tests? Yeah, we do that

With PigPen, you can mock input data and write a unit test for your query. No more crossing your fingers & wondering what will happen when you submit to the cluster. No more separate files for test input & output.

Mocking data is really easy. With?pig/return?and?pig/constantly, you can inject arbitrary data as a starting point for your script.

A common pattern is to use?pig/take?to sample a few rows of the actual source data. Wrap the result withpig/return?and you’ve got mock data.

(use 'clojure.test)(deftest test-word-count(let [data (pig/return [["The fox jumped over the dog."]["The cow jumped over the moon."]])](is (= (pig/dump (word-count data))[["moon" 1]["jumped" 2]["dog" 1]["over" 2]["cow" 1]["fox" 1]["the" 4]]))))

The?pig/dump?operator runs the query locally.

Closures (yes, the kind with an S)

Parameterizing your query is trivial. Any in-scope function parameters or let bindings are available to use in functions.

(defn reusable-fn [lower-bound data](let [upper-bound (+ lower-bound 10)](pig/filter (fn [x] (< lower-bound x upper-bound)) data)))

Note that?lower-bound?and?upper-bound?are present when we generate the script, and are made available when the function is executed within the cluster.

So how do I use it?

Just tell PigPen where to write the query as a Pig script:

(pig/write-script "word-count.pig"(word-count-query "input.tsv" "output.tsv"))

And then you have a Pig script which you can submit to your cluster. The script uses?pigpen.jar, an uberjar with all of the dependencies, so make sure that is submitted with it. Another option is to build an uberjar for your project and submit that instead. Just rename it prior to submission. Check out the tutorial for how to build an uberjar.

As you saw before, we can also use?pig/dump?to run the query locally and return Clojure data:

=> (def data (pig/return [["The fox jumped over the dog."]["The cow jumped over the moon."]])) #'pigpen-demo/data=> (pig/dump (word-count data)) [["moon" 1] ["jumped" 2] ["dog" 1] ["over" 2] ["cow" 1] ["fox" 1] ["the" 4]]

If you want to get started now, check out?getting started & tutorials.

Why do I need Map-Reduce?

Map-Reduce is useful for processing data that won’t fit on a single machine. With PigPen, you can process massive amounts of data in a manner that mimics working with data locally. Map-Reduce accomplishes this by distributing the data across potentially thousands of nodes in a cluster. Each of those nodes can process a small amount of the data, all in parallel, and accomplish the task much faster than a single node alone. Operations such as join and group, which require coordination across the dataset, are computed by partitioning the data with a common join key. Each value of the join key is then sent to a specific machine. Once that machine has all of the potential values, it can then compute the join or do other interesting work with them.

To see how PigPen does joins, let’s take a look at?pig/cogroup. Cogroup takes an arbitrary number of data sets and groups them all by a common key. Say we have data that looks like this:

foo:{:id 1, :a "abc"}{:id 1, :a "def"}{:id 2, :a "abc"}bar:[1 42][2 37][2 3.14]baz:{:my_id "1", :c [1 2 3]]}

If we want to group all of these by?id, it looks like this:

(pig/cogroup (foo by :id)(bar by first)(baz by #(-> % :my_id Long/valueOf))(fn [id foos bars bazs] ...))

The first three arguments are the datasets to join. Each one specifies a function that is applied to the source data to select the key. The last argument is a function that combines the resulting groups. In our example, it would be called twice, with these arguments:

[1 ({:id 1, :a "abc"}, {:id 1, :a "def"})([1 42])({:my_id "1", :c [1 2 3]]})] [2 ({:id 2, :a "abc"})([2 37] [2 3.14])()]

As you can see, this consolidates all of the values with an id of 1, all of the values with 2, etc. Each different key value can then be processed independently on different machines. By default, keys are not required to be present in all sources, but there are options that can make them required.

Hadoop provides a very low-level interface for doing map-reduce jobs, but it’s also very limited. It can only run a single map-reduce pair at a time as it has no concept of data flow or a complex query. Pig adds a layer of abstraction on top of Hadoop, but at the end of the day, it’s still a scripting language. You are still required to use UDFs (user defined functions) to do interesting tasks with your data. PigPen furthers that abstraction by making map-reduce available as a first class language.

If you are new to map-reduce, we encourage you to learn more?here.

Motivations for creating PigPen

  • Code reuse.?We want to be able to define a piece of logic once, parameterize it, and reuse it for many different jobs.
  • Consolidate our code.?We don’t like switching between a script and a UDF written in different languages. We don’t want to think about mapping between differing data types in different languages.
  • Organize our code.?We want our code in multiple files, organized how we want - not dictated by the job it belongs to.
  • Unit testing.?We want our sample data inline with our unit tests. We want our unit tests to test the business logic of our jobs without complications of loading or storing data.
  • Fast iteration.?We want to be able to trivially inject mock data at any point in our jobs. We want to be able to quickly test a query without waiting for a JVM to start.
  • Name what you want to.?Most map-reduce languages force too many names and schemas on intermediate products. This can make it really difficult to mock data and test isolated portions of jobs. We want to organize and name our business logic as we see fit - not as dictated by the language.
  • We’re done writing scripts; we’re ready to start programming!

Note: PigPen is?not?a Clojure wrapper for writing Pig scripts you can hand edit. While it’s entirely possible, the resulting scripts are not intended for human consumption.

Design & Features

PigPen was designed to match Clojure as closely as possible. Map-reduce is functional programming, so why not use an awesome functional programming language that already exists? Not only is there a lower learning curve, but most of the concepts translate very easily to big data.

In PigPen, queries are manipulated as expression trees. Each operation is represented as a map of information about what behavior is desired. These maps can be nested together to build a tree representation of a complex query. Each command also contains references to its ancestor commands. When executed, that query tree is converted into a directed acyclic query graph. This allows for easy merging of duplicate commands, optimizing sequences of related commands, and instrumenting the query with debug information.

Optimization

De-duping

When we represent our query as a graph of operations, de-duping them is trivial. Clojure provides value-equality, meaning that if two objects have the same content, they are equal. If any two operations have the same representation, then they are in fact identical. No care has to be taken to avoid duplicating commands when writing the query - they’re all optimized before executing it.

For example, say we have the following query:

(let [even-squares (->>(pig/load-clj "input.clj")(pig/map (fn [x] (* x x)))(pig/filter even?)(pig/store-clj "even-squares.clj"))odd-squares (->>(pig/load-clj "input.clj")(pig/map (fn [x] (* x x)))(pig/filter odd?)(pig/store-clj "odd-squares.clj"))](pig/script even-squares odd-squares))

In this query, we load data from a file, compute the square of each number, and then split it into even and odd numbers. Here’s what a graph of this operation would look like:

This matches our query, but it’s doing some extra work. It’s loading the same?input.clj?file twice and computing the squares of all of the numbers twice. This might not seem like a lot of work, but when you do it on a lot of data, simple operations really add up. To optimize this query, we look for operations that are identical. At first glance it looks like our operation to compute squares might be a good candidate, but they actually have different parents so we can’t merge them yet. We can, however, merge the load functions because they don’t have any parents and they load the same file.

Now our graph looks like this:

Now we’re loading the data once, which will save some time, but we’re still doing the squares computation twice. Since we now have a single load command, our map operations are now identical and can be merged:

Now we have an optimized query where each operation is unique. Because we always merge commands one at a time, we know that we’re not going to change the logic of the query. You can easily generate queries within loops without worrying about duplicated execution - PigPen will only execute the unique parts of the query.

Serialization

After we’re done processing data in Clojure, our data must be serialized into a binary blob so Pig can move it around between machines in a cluster. This is an expensive, but essential step for PigPen. Luckily, many consecutive operations in a script can often be packed together into a single operation. This saves a lot of time by not serializing and deserializing the data when we don’t need to. For example, any consecutive?map,filter, and?mapcat?operations can be re-written as a single?mapcat?operation.

Let’s look at some examples to illustrate this:

In this example, we start with a serialized (blue) value, 4, deserialize it (orange), apply our map function, and re-serialize the value.

Now let’s try a slightly more complex (and realistic) example. In this example, we apply a?map,?mapcat, andfilter?operation.

If you haven’t used it before,?mapcat?is an operation where we apply a function to a value and that function returns a sequence of values. That sequence is then ‘flattened’ and each single value is fed into the next step. In Clojure, it’s the result of combining?map?and?concat. In Scala, this is called?flatMap?and in c# it’s called?selectMany.

In the diagram below, the flow on the left is our query before the optimization; the right is after the optimization. We start with the same value, 4, and calculate the square of the value; same as the first example. Then we take our value and apply a function that decrements the value, returns the value, and increments the value. Pig then takes this set of values and flattens them, making each one an input to the next step. Note that we had to serialize and deserialize the data when interacting with Pig. The third and final step is to filter the data; in this example we’re retaining only odd values. As you can see, we end up serializing and deserializing the data in between each step.

The right hand side shows the result of the optimization. Put simply, each operation now returns a sequence of elements. Our map operation returns a sequence of one element, 16, our mapcat remains the same, and our filter returns a sequence of zero or one elements. By making these commands more uniform, we can merge them more easily. We end up flattening more sequences of values within the set of commands, but there is no serialization cost between steps. While it looks more complex, this optimization results in much faster execution of each if these steps.

Testing, Local Execution, and Debugging

Iterative development, testing, and debuggability are key tenants of PigPen. When you have jobs that can run for days at a time, the last thing you need is an unexpected bug to show up in the eleventh hour. PigPen has a local execution mode that’s powered by?rx. This allows us to write unit tests for our queries. We can then know with very high confidence that something will not crash when run and will actually return the expected results. Even better, this feature allows for iterative development of queries.

Typically, we start with just a few records of the source data and use that to populate a unit test. Because PigPen returns data in the REPL, we don’t have to go elsewhere to build our test data. Then, using the REPL, we add commands to map, filter, join, and reduce the mock data as required; each step of the way verifying that the result is what we expect. This approach produces more reliable results than building a giant monolithic script and crossing your fingers. Another useful pattern is to break up large queries into smaller functional units. Map-reduce queries tend to explode and contract the source data by orders of magnitude. When you try to test the script as a whole, you often have to start with a very large amount of data to end up with just a few rows. By breaking the query into smaller parts, you can test the first part, which may take 100 rows to produce two; and then test the second part by using those two rows as a template to simulate 100 more fake ones.

Debug mode has proven to be really useful for fixing the unexpected. When enabled, it will write to disk the result of every operation in the script, in addition to the normal outputs. This is very useful in an environment such as Hadoop, where you can’t step through code and hours may pass in between operations. Debug mode can also be coupled with a graph-viz visualization of the execution graph. You can then visually associate what it plans to do with the actual output of each operation.

To enable debug mode, see the options for?pig/write-script?and?pig/generate-script. It will write the extra debug output to the folder specified.

Example of debug mode enabled:

(pig/write-script {:debug "/debug-output/"} "my-script.pig" my-pigpen-query)

To enable visualization, take a look at?pig/show?and?pig/dump&show

Example of visualization:

(pig/show my-pigpen-query) ;; Shows a graph of the query (pig/dump&show my-pigpen-query) ;; Shows a graph and runs it locally

Extending PigPen

One nice feature of PigPen is that it’s easy to build your own operators. For example, we built set and multi-set operators such as difference and intersection. These are just variants of other operations like co-group, but it’s really nice to define them once, test them thoroughly, and not have to think about the logic behind a multiset intersection of n sets ever again.

This is useful for more complex operators as well. We have a reusable statistics operator that computes the sum, avg, min, max, sd, and quantiles for a set of data. We also have a pivot operator that groups dimensional fields in the data and counts each group.

While each of these by themselves are simple operations, when you abstract them out of your query, your query starts to become a lot smaller and simpler. When your query is smaller and simpler, you can spend more time focusing on the actual logic of the problem you’re trying to solve instead of re-writing basic statistics each time. What you’re doing becomes clearer, every step of the way.

Why Pig?

We chose Pig because we didn’t want to re-implement all of the optimization work that has gone into Pig already. If you take away the language, Pig does an excellent job of moving big data around. Our strategy was to use Pig’s DataByteArray binary format to move around serialized Clojure data. In most cases, we found that Pig didn’t need to be aware of the underlying types present in the data. Byte arrays can be compared trivially and quickly, so for joins and groupings, Pig simply needs to compare the serialized blob. We get Clojure’s great value equality for free as equivalent data structures produce the same serialized output. Unfortunately, this doesn’t hold true for sorting data. The sorted order of a binary blob is far less than useful, and doesn’t match the sorted order of the native data. To sort data, we must fall back to the host language, and as such, we can only sort on simple types. This is one of very few places where Pig has imposed a limitation on PigPen.

We did evaluate other languages before deciding to build PigPen. The first requirement was that it was an actual programming language, not just a scripting language with UDFs. We briefly evaluated?Scalding, which looks very promising, but our team primarily uses Clojure. It could be said that PigPen is to Clojure what Scalding is to Scala.?Cascalog?is usually the go-to language for map-reduce in Clojure, but from past experiences, datalog has proven less than useful for everyday tasks. There’s a complicated new syntax and concepts to learn, aligning variable names to do implicit joins is not always ideal, misplaced ordering of operations can often cause big performance problems, datalog will flatten data structures (which can be wasteful), and composition can be a mind bender.

We also evaluated a few options to use as a host language for PigPen. It would be possible to build a similar abstraction on top of Hive, but schematizing every intermediate product doesn’t fit well with the Clojure ideology. Also, Hive is similar to SQL, making translation from a functional language more difficult. There’s an impedance mismatch between relational models like SQL and Hive and functional models like Clojure or Pig. In the end, the most straightforward solution was to write an abstraction over Pig.

Future Work

Currently you can reference in-scope local variables within code that is executed remotely, as shown above. One limitation to this feature is that the value must be serializable. This has the downside of not being able to utilize compiled functions - you can’t get back the source code that created them in the first place. This means that the following won’t work:

(defn foo [x] ...)(pig/map foo)

In this situation, the compiler will inform you that it doesn’t recognize?foo. We’re playing around with different methods for requiring code remotely, but there are some nuances to this problem. Blindly loading the code that was present when the script was generated is an easy option, but it might not be ideal if that code accidentally runs something that was only intended to run locally. Another option would be for the user to explicitly specify what to load remotely, but this poses challenges as well, such as an elegant syntax to express what should be loaded. Everything we’ve tried so far is a little clunky and?jar hell?with Hadoop doesn’t make it any easier. That said, any code that’s available can be loaded from within any user function. If you upload your uberjar, you can then use a?require?statement to load other arbitrary code.

So far, performance in PigPen doesn’t seem to be an issue. Long term, if performance issues crop up, it will be relatively easy to migrate to running PigPen directly on Hadoop (or similar) without changing the abstraction. One of the key performance features we still have yet to build is incremental aggregation. Pig refers to this as algebraic operators (also referenced by Rich Hickey?here?as combining functions). These are operations that can compute partial intermediate products over aggregations. For example, say we want to take the average of a LOT of numbers - so many that we need map-reduce. The naive approach would be to move all of the numbers to one machine and compute the average. A better approach would be to partition the numbers, compute the sum and count of each of these smaller sets, and then use those intermediate products to compute the final average. The challenge for PigPen will be to consume many of these operations within a single function. For example, say we have a set of numbers and we want to compute the count, sum, and average. Ideally, we would want to define each of these computations independently as algebraic operations and then use them together over the same set of data, having PigPen do the work of maintaining a set of intermediate products. Effectively, we need to be able to compose and combine these operations while retaining their efficiency.

We use a number of other Pig & Hadoop tools at Netflix that will pair nicely with PigPen. We have some prototypes for integration with?Genie, which adds a?pig/submit?operator. There’s also a loader for?Aegisthus data?in the works. And PigPen works with?Lipstick?as the resulting scripts are Pig scripts.

Conclusion

PigPen has been a lot of fun to build and we hope it’s even more fun to use. For more information on getting started with PigPen and some tutorials, check out the?tutorial, or to contribute, take a look at our Github page:?https://github.com/Netflix/PigPen

There are three distinct audiences for PigPen, so we wrote three different tutorials:

  • Those coming from the Clojure community who want to do map-reduce:?PigPen for Clojure users
  • Those coming from the Pig community who want to use Clojure:?PigPen for Pig users
  • And a general tutorial for anybody wanting to learn it all:?PigPen Tutorial

If you know both Clojure and Pig, you’ll probably find all of the tutorials interesting.

The full API documentation is located?here

And if you love big data, check out our?jobs.

from:http://techblog.netflix.com/search/label/Map-Reduce

總結(jié)

以上是生活随笔為你收集整理的PigPen:用Clojure写MapReduce Introducing PigPen: Map-Reduce for Clojure的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

六月丁香激情综合色啪小说 | 欧美日韩国产一区二区三区 | 人人干在线观看 | 国产精品久久久久毛片大屁完整版 | 日韩视频免费观看高清完整版在线 | 中文字幕在线观看2018 | 亚洲精品tv久久久久久久久久 | 国产99色 | 丁香影院在线 | 国产美女精品视频 | 欧美日韩国产伦理 | free,性欧美| 精品国产福利在线 | 综合久久精品 | 中文一区在线观看 | 亚洲精品国产自产拍在线观看 | 三级午夜片 | 在线观看av的网站 | 国产福利网站 | 久久这里只有精品首页 | 亚洲激情在线观看 | 国产女人免费看a级丨片 | 成人午夜在线观看 | 成人黄色在线 | 一区二区三区三区在线 | 色综合欧洲 | 性色av一区二区 | 日韩欧美91| a资源在线 | 色婷婷97| 国产精品精品国产婷婷这里av | 久久免费看 | 欧美日韩视频在线观看一区二区 | 免费在线观看av的网站 | 狠狠色噜噜狠狠狠合久 | 丝袜美女视频网站 | 天天草网站| 丝袜美腿在线 | 手机av在线免费观看 | 国产精品一区二区三区四区在线观看 | 亚洲一区二区三区四区精品 | 久久经典国产 | 婷婷久久一区 | 国产手机视频在线观看 | 黄色三级av | 国产高清成人在线 | 免费久久99精品国产婷婷六月 | 黄色av影院| 国产精品一区二区 91 | 日韩av电影免费观看 | 久久影视一区 | av免费福利| 高清av在线免费观看 | 欧美精品一区二区在线播放 | 久爱综合 | 久久久久久久久久电影 | 最新国产精品拍自在线播放 | 国产中文字幕网 | 亚洲精品视频免费在线观看 | 精品久久一区二区三区 | 中文字幕精品久久 | 99精品国产福利在线观看免费 | 天堂av色婷婷一区二区三区 | 国产又粗又长又硬免费视频 | 日批视频在线 | 欧美在线99 | 中文字幕在线不卡国产视频 | 天天做日日爱夜夜爽 | 在线草| 91资源在线播放 | 精品毛片在线 | 中文字幕黄色 | 色多多在线观看 | 久久久久久久av麻豆果冻 | 日本资源中文字幕在线 | 91九色网址 | 国产精品入口66mio女同 | www.啪啪.com | 欧美日高清视频 | 国内精品久久久久久久久久清纯 | 中文在线中文资源 | 日本黄色免费观看 | 日日爽天天操 | 国产原创在线观看 | 激情综合五月婷婷 | 国产精品成人在线 | 精品视频在线视频 | 精品在线观看视频 | 狠狠的干狠狠的操 | 日本亚洲国产 | 中文字幕在线观看免费高清完整版 | 日韩视频精品在线 | 超碰97免费在线 | 在线免费看黄色 | 中文字幕在线一区二区三区 | 午夜视频一区二区 | 国产精品久久久久久久久久白浆 | 久久无码精品一区二区三区 | 中文字幕在线播出 | 99r在线精品 | 激情网第四色 | 不卡电影一区二区三区 | 国产精品女视频 | 免费看特级毛片 | 国产精品理论片在线播放 | 亚洲理论电影网 | 国产区免费在线 | 亚洲成年人在线播放 | 99在线精品视频 | 国产精品18久久久久久不卡孕妇 | 一级片免费观看 | 国产青草视频在线观看 | www色av| 午夜免费福利视频 | 人人爽人人爽人人爽人人爽 | 成av在线 | 国产精品白虎 | 亚洲精品乱码久久久久久蜜桃91 | 国产精品视频久久久 | 一级黄色电影网站 | 中文在线a√在线 | 人人澡人摸人人添学生av | 中文字幕中文字幕在线中文字幕三区 | 国产激情电影综合在线看 | 亚洲精品欧洲精品 | 97精品国产97久久久久久久久久久久 | 久久99久久99久久 | 精品视频久久久久久 | 欧美福利网址 | 五月婷婷激情 | 午夜视频福利 | 最近2019中文免费高清视频观看www99 | 免费看搞黄视频网站 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品视频永久免费播放 | 国产成人一区二区啪在线观看 | 在线观看av麻豆 | av九九九| 99久久精品国产免费看不卡 | 久久激情视频网 | 免费日韩av片 | 欧美精品二 | 免费av小说 | www.天天操 | 很黄很黄的网站免费的 | 99综合影院在线 | 毛片二区 | 超碰在线天天 | 日韩专区中文字幕 | 欧美日韩电影在线播放 | 日韩欧美视频 | 欧美亚洲xxx | 日日躁天天躁 | 91福利视频免费 | 国产短视频在线播放 | 91精品1区 | 久久免费看毛片 | 色婷五月天| 国产91精品欧美 | 国产免费久久 | 国产另类av | 99av国产精品欲麻豆 | 亚洲免费av一区二区 | 伊在线视频 | 国产免费嫩草影院 | 欧美精品一区在线 | 精品免费观看 | 国产亚洲小视频 | 国产一区二区三区高清播放 | 国产精品免费视频一区二区 | 粉嫩av一区二区三区四区在线观看 | 色综合婷婷久久 | 天天操网址| 久久伊人综合 | 久久久久成人精品亚洲国产 | 日韩电影在线观看一区二区 | 久久9视频 | 亚洲国产理论片 | 99久久99久久精品免费 | 少妇性色午夜淫片aaaze | 欧美成年人在线视频 | 欧美精品久久久久久 | 亚欧日韩av | 国产婷婷一区二区 | 视频一区二区视频 | 色天堂在线视频 | 伊人婷婷激情 | 黄色性av| 色综合网在线 | 久久久久久麻豆 | 国产精品美女久久久久久久 | 婷婷丁香在线 | 久久精品中文字幕 | 久久久国产精品亚洲一区 | a色视频 | 夜色资源网 | 亚洲午夜在线视频 | 日韩精品中文字幕av | 日韩欧美精品在线观看 | 日韩在线观看免费 | 中文字幕在线专区 | 国产成人久久精品77777综合 | 在线免费视频a | 97看片网| 国产99re | 久久综合色影院 | 中文字幕一区av | 国产麻豆精品久久一二三 | 亚洲最大在线视频 | 韩国av免费观看 | 日韩在线中文字幕视频 | 日本午夜在线观看 | 99久久夜色精品国产亚洲96 | 亚洲精品日韩一区二区电影 | 欧美不卡视频在线 | 伊人午夜| 国模精品一区二区三区 | 深爱婷婷久久综合 | 狠狠狠色丁香婷婷综合激情 | 天天操操操操操操 | 精品亚洲免费 | 精品久久久免费视频 | 91精品一区二区在线观看 | 亚洲在线成人精品 | 婷色| 成片视频免费观看 | 深爱激情五月网 | 日韩免费网址 | 操操操av | 国产在线97 | 欧美亚洲三级 | 五月婷婷黄色网 | 91精品国产成 | 国产精品电影一区 | 日本久久精品 | 亚洲国产午夜精品 | 欧美亚洲国产日韩 | 日本高清中文字幕有码在线 | 久久艹影院 | 国产精品99精品 | 成年人视频在线免费 | 亚洲视频免费在线看 | 91av手机在线观看 | 97视频人人澡人人爽 | 91伊人久久大香线蕉蜜芽人口 | 视频三区在线 | av成人免费网站 | 国产精品日韩 | 亚洲激情在线视频 | 欧美精品一区二区三区四区在线 | 黄色电影在线免费观看 | 国产免费久久av | 免费av在线| 久久久国产99久久国产一 | 99色在线观看视频 | 人人澡人人添人人爽一区二区 | 五月天欧美精品 | 懂色av一区二区在线播放 | 在线日本v二区不卡 | 麻豆一二 | 亚洲欧洲精品一区二区精品久久久 | 久久国产精品一区二区三区 | 成人久久亚洲 | 九九综合在线 | 日本性久久 | 日韩欧美精品免费 | 在线观看精品视频 | 亚洲综合精品在线 | 正在播放国产精品 | 91精品一 | 99久久婷婷 | 在线视频日韩精品 | 欧美日韩69 | 免费成人在线观看 | 黄免费在线观看 | 色综合久久久久 | 中文字幕 国产视频 | 五月婷婷操 | 久久亚洲私人国产精品va | 婷婷av网站 | 国产精品麻豆99久久久久久 | 日韩视频免费 | 国产精品久久艹 | 欧美日韩在线看 | 中文字幕欧美三区 | 免费精品国产va自在自线 | 日韩精品黄 | 欧美精品在线观看免费 | 黄色av免费 | 亚洲色图27p| 亚洲欧洲精品一区 | 99久久夜色精品国产亚洲 | 青青草国产免费 | 美女激情影院 | 日韩69av | 国产婷婷 | 91在线精品秘密一区二区 | 天天爽夜夜操 | 久久综合婷婷国产二区高清 | 国产美女被啪进深处喷白浆视频 | 免费看精品久久片 | 成人黄色小说视频 | 日本中文字幕电影在线免费观看 | 中文字幕精品一区 | 亚洲国产中文字幕在线 | 国产视频中文字幕 | 六月婷色 | 亚洲国内精品在线 | 免费观看日韩 | 视频二区在线视频 | 五月天久久婷 | 午夜久久网 | 成人午夜精品福利免费 | aaa日本高清在线播放免费观看 | 最近高清中文字幕在线国语5 | 日韩黄色大片在线观看 | 久草在线免费在线观看 | 久草在线资源观看 | 国产精品涩涩屋www在线观看 | 最新国产精品拍自在线播放 | 国产日韩在线观看一区 | 国产在线成人 | 超碰97在线看 | 日韩在线观看不卡 | 天天爱天天干天天爽 | 久久a视频 | 在线国产不卡 | 久久久国产精品人人片99精片欧美一 | 国模一二三区 | 91免费视频黄 | 黄色三级av | 91精品视频一区二区三区 | 日韩精品不卡在线 | 97国产超碰 | www日韩精品| 中文字幕在线久一本久 | 极品久久久久久久 | 在线观看国产日韩欧美 | 亚洲精品国精品久久99热 | 久久精品视频18 | 天堂av在线7| 黄色成品视频 | 色综合久久综合网 | 91人人爽久久涩噜噜噜 | 欧美色图视频一区 | a在线免费观看视频 | 在线观看免费日韩 | 国产精品私人影院 | 一区二区三区在线播放 | 日韩中文久久 | 一区二区三区中文字幕在线观看 | 欧美日韩99 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 99精品一区二区三区 | 91av在线看| 深夜免费福利 | 狠狠的干狠狠的操 | 五月婷婷操 | 丁香六月五月婷婷 | 亚洲最大成人免费网站 | 99精品欧美一区二区 | av中文字幕免费在线观看 | 天天伊人网| 在线观看你懂的网站 | 天天干天天爽 | 久久免费国产电影 | 亚洲国产精品电影 | 国产成人精品一区二区三区福利 | 欧美大荫蒂xxx | 国产精品久久久久久久久久久久午 | 天天爽夜夜爽精品视频婷婷 | 人人要人人澡人人爽人人dvd | 99精品视频免费看 | 国产黄色精品视频 | 国产亚洲精品久久久久久电影 | 狠狠综合 | 96香蕉视频 | 欧美日韩国产在线一区 | 91在线你懂的 | 欧美精品久久久久久久久久丰满 | www.香蕉| 欧美一区二区三区激情视频 | 97超碰人人澡人人 | 精品久久五月天 | 97超视频在线观看 | 超碰免费97 | av先锋影音少妇 | 久久国产午夜精品理论片最新版本 | 日韩啪啪小视频 | 久久久久久久久久久久电影 | 99av国产精品欲麻豆 | 国产精品丝袜久久久久久久不卡 | 深夜福利视频一区二区 | 亚洲色图27p| 日韩 精品 一区 国产 麻豆 | 奇米四色影狠狠爱7777 | 成年人电影免费在线观看 | 日韩av电影免费在线观看 | 免费精品视频在线观看 | 国产精品免费在线播放 | 国产成人av综合色 | 色久综合| 麻豆传媒一区二区 | 久久免费在线 | 一区三区视频在线观看 | 日韩特级毛片 | 国产亚洲精品福利 | 日本在线中文在线 | 日韩一区二区三免费高清在线观看 | 日韩女同一区二区三区在线观看 | 国产中文字幕亚洲 | av黄色免费在线观看 | 亚洲国产成人精品在线观看 | 久久99最新地址 | 伊人天天| 美女av在线免费 | 婷婷视频在线观看 | 国产精品ⅴa有声小说 | 热久久视久久精品18亚洲精品 | 国产不卡在线观看 | 国语自产偷拍精品视频偷 | 亚洲乱码精品久久久久 | 91.精品高清在线观看 | 99在线精品免费视频九九视 | 五月天婷亚洲天综合网鲁鲁鲁 | 深夜成人av | 婷婷在线色 | 欧美激情第28页 | 在线天堂日本 | 99精品视频在线观看播放 | 精品国产伦一区二区三区观看体验 | 国产精品精 | 日本乱视频 | 亚洲aⅴ乱码精品成人区 | 免费看的黄色 | 精品国产视频一区 | 狠狠色丁香婷婷综合视频 | 伊人永久在线 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 91在线免费播放 | 99精品在线观看视频 | 中文字幕日韩伦理 | 亚洲黄在线观看 | 色综合久久网 | 在线观看一区二区精品 | 日本动漫做毛片一区二区 | 精品乱码一区二区三四区 | 久操视频在线 | 亚洲最新在线 | 99精品免费久久久久久久久日本 | 麻豆传媒一区二区 | 人人射人人| 国产亚洲激情视频在线 | 91免费视频黄 | 开心激情综合网 | 久久精品国产一区二区电影 | 在线观看久久 | 91系列在线 | 欧美精品小视频 | 91精品国产网站 | 久久a v电影 | 国产精在线 | 国产白浆视频 | 国产黄色片久久久 | 五月激情丁香图片 | 精品电影一区二区 | 日本中文字幕在线 | av免费看在线 | 一本一道久久a久久精品蜜桃 | 综合久久综合久久 | 天天射天天射天天 | 成人在线网站观看 | 国产视频精品免费播放 | 一级黄色大片 | 免费看色网站 | 五月婷在线视频 | 碰碰影院| 国产色爽| 中文字幕视频在线播放 | 香蕉视频在线免费 | a√天堂中文在线 | 91麻豆精品国产91久久久久久久久 | 狠狠的操狠狠的干 | av在线电影网站 | 51久久成人国产精品麻豆 | 欧美极品少妇xbxb性爽爽视频 | 国产精品专区h在线观看 | 中文字幕精品www乱入免费视频 | 狠狠操狠狠插 | 精品久久久久久国产偷窥 | 中文字幕一区二区三区四区久久 | 国产视频一二区 | 在线观看亚洲精品 | 国产色一区 | 国产裸体永久免费视频网站 | 女人高潮一级片 | 天天艹天天操 | 最新av中文字幕 | 久久久精品网 | 成人av一区二区在线观看 | 免费成视频 | 欧美激精品 | 99精彩视频| 国产 在线 高清 精品 | 国产资源免费 | 97超视频免费观看 | 午夜精品三区 | 中文字幕在线观 | 成人在线免费视频观看 | 国内精品久久久久久久影视麻豆 | av片在线看 | 久久人人爽人人人人片 | 中文在线a√在线 | 91九色porny蝌蚪主页 | 91麻豆精品国产91久久久无限制版 | 天天天色综合 | 四虎8848免费高清在线观看 | 一本色道久久综合亚洲二区三区 | 久久久人人人 | 免费观看性生活大片 | 日韩成人邪恶影片 | 97国产一区二区 | 国产成人av网址 | 亚洲精品美女在线观看播放 | 九九在线视频免费观看 | 国产 色 | 国产91丝袜在线播放动漫 | 久久在视频 | 91污视频在线 | 欧美性超爽 | 国产精品一区二区在线免费观看 | 成人国产电影在线观看 | 欧美日韩中文国产一区发布 | 久久久久成人精品 | 狠狠干夜夜 | 亚洲激情久久 | 日日夜夜精品免费 | 久久视频国产 | 日日夜夜91 | 日韩欧美精品一区二区三区经典 | 精品国产一区二区三区久久久蜜月 | 91亚色在线观看 | 亚洲三级在线 | 国产裸体视频网站 | 免费亚洲黄色 | 日韩二区三区在线观看 | 日韩中文字幕免费 | 免费在线一区二区三区 | 国产成人综合精品 | 亚洲成人家庭影院 | 久久美女视频 | 六月丁香婷婷在线 | 日韩色一区二区三区 | 国产美女免费视频 | av成人动漫在线观看 | 国产成人三级在线 | 欧美 日韩 性 | 91激情视频在线播放 | 福利在线看片 | 色av婷婷 | 麻豆视频网址 | 久草在线观看 | 国产不卡视频在线 | 成人免费观看电影 | 国产精品久久久久久999 | 91丨九色丨蝌蚪丰满 | 天天摸天天操天天舔 | 九九九视频在线 | 9999免费视频 | 久久国产美女视频 | 97精品国产91久久久久久 | 狠狠久久婷婷 | free,性欧美 九九交易行官网 | av网站免费看 | 中文资源在线播放 | av3级在线 | 久久理论电影 | 91在线永久 | 成人免费在线播放视频 | 亚洲免费视频在线观看 | 69夜色精品国产69乱 | 欧美精品久久久久久久亚洲调教 | 久久激情小说 | 91 中文字幕 | 国产视频二 | 91在线网站| 一二三区高清 | 亚洲最新av网站 | 亚州人成在线播放 | 五月婷婷影院 | 国产美女在线观看 | 成人一级片在线观看 | 黄色大片入口 | 精品999在线| 午夜久久成人 | 亚洲欧美视频一区二区三区 | 亚洲综合一区二区精品导航 | 日韩大片在线播放 | 午夜色大片在线观看 | 91成人天堂久久成人 | 少妇bbbb搡bbbb桶 | 27xxoo无遮挡动态视频 | 亚洲欧洲精品一区二区 | 91资源在线免费观看 | 国产精品一区二区免费看 | 国内亚洲精品 | 亚洲精品国产精品国自产在线 | 色综合久久天天 | 91精品成人 | 日韩av中文在线 | 国产主播大尺度精品福利免费 | 天天色综合1 | 欧美日韩亚洲在线观看 | 成人va天堂| 久久久久久美女 | 日本女人逼 | 九色91在线 | 13日本xxxxxⅹxxx20 | 五月婷婷亚洲 | 亚洲第一av在线 | va视频在线| 日韩视频一区二区三区 | 久久er99热精品一区二区三区 | 久久高清国产 | 精品99免费视频 | 97超在线视频 | 日韩免费高清 | 国产一二三四在线观看视频 | 国产黄a三级三级三级三级三级 | 久久中文字幕导航 | 色综合天天综合 | 亚洲高清资源 | 亚洲成免费 | 中文字幕亚洲精品在线观看 | 最新成人在线 | 婷婷久草 | 日韩一级成人av | 黄毛片在线观看 | 天天干天天怕 | 在线播放国产一区二区三区 | 美女视频久久久 | www免费视频com━ | 久久国产精品久久w女人spa | 91片黄在线观看 | 最近中文字幕免费 | 97小视频| 在线观看久久久久久 | 97久久精品午夜一区二区 | 香蕉视频啪啪 | 爱爱av网| 欧美日韩一区三区 | 色综合久久66 | 曰韩精品 | 亚洲天堂激情 | 午夜精品999 | 精品中文字幕在线观看 | 久久久国产精华液 | 国产激情久久久 | 日韩欧美一区二区在线播放 | 欧美日韩一区二区三区在线免费观看 | 波多野结衣亚洲一区二区 | 欧美日韩一区二区三区不卡 | 中文字幕亚洲情99在线 | 亚洲成人精品在线观看 | 精品日韩av | 亚洲精品美女久久久 | 久久久影院官网 | 在线导航av | 91亚洲国产成人久久精品网站 | 亚洲一一在线 | 国产自偷自拍 | 五月网婷婷 | 国产一线天在线观看 | 国产尤物在线观看 | 色偷偷网站视频 | www最近高清中文国语在线观看 | 国产精品免费视频久久久 | 亚洲深爱激情 | 久久亚洲综合色 | www国产精品com | 看黄色.com| 久久国色夜色精品国产 | 一区二区三区视频在线 | 欧美日韩高清一区二区三区 | avwww在线 | 精品久久久久免费极品大片 | 伊人网av | 久久xxxx | 天天操天天吃 | 国产精品视频 | 久久99在线观看 | 国产女v资源在线观看 | 国内精品久久天天躁人人爽 | 精品国产乱码 | 视色网站 | 国产精品久久久久久久久久白浆 | 国产精品在线看 | 天天天天色综合 | 国产精品美女久久 | 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美大片www | 一本大道久久精品懂色aⅴ 五月婷社区 | 国产乱码精品一区二区三区介绍 | 亚州人成在线播放 | a资源在线 | 久久久免费观看视频 | av免费在线观看1 | www.夜色321.com| 成 人 a v天堂| 99色网站 | 亚洲精品在线一区二区 | 午夜av一区二区三区 | 日本最大色倩网站www | 波多野结衣最新 | 日韩欧美在线高清 | 中文字幕视频观看 | 国产精品久久久久久久久大全 | 国产色网站| 国产午夜精品一区二区三区 | 午夜国产影院 | 国产精品精品国产色婷婷 | 激情网婷婷 | 久久精品综合视频 | 日韩手机视频 | 中文字幕乱码亚洲精品一区 | 精品成人a区在线观看 | 亚洲国产免费网站 | 精品久久久久久久久久久院品网 | av在线一二三区 | 亚洲免费在线看 | 婷婷精品进入 | 久青草视频在线观看 | 国产蜜臀av | 一区二区在线电影 | 国产欧美在线一区 | 亚洲国产免费看 | 婷婷丁香久久五月婷婷 | 久久精品国产一区二区电影 | 中文字幕亚洲欧美日韩2019 | 97超视频在线观看 | 国产小视频你懂的在线 | 97香蕉超级碰碰久久免费软件 | 亚洲欧美成人 | 午夜精品电影 | 天天搞天天 | 国产黄色片一级三级 | 国产精品久久一区二区三区, | 国产日韩中文字幕在线 | 福利网址在线观看 | 又黄又刺激又爽的视频 | 麻豆久久久| 正在播放国产精品 | 亚洲传媒在线 | 天天操天天操天天操 | 综合色站导航 | 免费成人在线视频网站 | 欧美精品中文字幕亚洲专区 | 久久av网址 | 日韩av中文字幕在线免费观看 | 白丝av在线 | 日韩在线不卡视频 | 日韩在线视频在线观看 | 草免费视频 | 久久精品观看 | 日韩在线视频国产 | 美女网站色 | 伊人色**天天综合婷婷 | 在线观看日韩av | 久草视频播放 | 超碰99在线| 久久无码精品一区二区三区 | 欧美激情精品久久久久久免费 | 你操综合 | 最近中文字幕完整高清 | 91片网 | 正在播放国产一区 | 最新国产精品拍自在线播放 | 一级α片免费看 | 精品久久久久久一区二区里番 | 三级黄免费看 | 欧洲激情在线 | 免费高清无人区完整版 | 欧美网站黄色 | 粉嫩av一区二区三区四区五区 | 久久精品久久久精品美女 | 午夜在线免费观看视频 | 天天干夜夜想 | 欧美日本一二三 | 国语自产偷拍精品视频偷 | 免费成人结看片 | 国产高清在线一区 | 亚洲视频电影在线 | 天天干视频在线 | 日韩欧美视频免费看 | 成人在线视频在线观看 | 欧美日韩在线观看视频 | 91人人澡人人爽人人精品 | 一本到视频在线观看 | 午夜精品久久一牛影视 | 亚洲九九影院 | 玖玖玖影院| wwwwwww黄 | av在线免费播放 | 色网站中文字幕 | 欧洲精品久久久久毛片完整版 | 在线免费观看欧美日韩 | av一本久道久久波多野结衣 | 色窝资源| 欧美极度另类 | 东方av免费在线观看 | 日本一区二区三区免费观看 | 免费看的视频 | 国产毛片在线 | 日韩成人精品一区二区 | 狠狠干网址| 在线一区观看 | 国产剧情久久 | 亚洲一级黄色片 | 天天天天天天干 | 在线精品视频免费播放 | 日韩欧美精选 | 国产一级视频免费看 | 91精品在线视频观看 | 黄色a大片| 一区二区电影网 | 国产高清在线不卡 | 欧美激情第28页 | 99国产精品 | 亚洲成人中文在线 | 午夜在线免费视频 | 免费看一及片 | 免费在线观看一区二区三区 | 国产小视频在线免费观看 | 国产亚洲亚洲 | 久久精品99国产精品日本 | 91高清在线看 | 亚洲精品国产精品国自产观看浪潮 | 免费看网站在线 | 91在线观看视频 | 91黄色免费网站 | 欧美精品中文 | 韩国中文三级 | 伊人永久在线 | 在线播放第一页 | 国产1区2 | 日韩专区在线 | 成人在线免费小视频 | 国产最新在线观看 | 午夜精品中文字幕 | 在线观看第一页 | 亚洲成人一二三 | 午夜手机看片 | 97精品国产一二三产区 | 999视频在线播放 | 国产精品99免视看9 国产精品毛片一区视频 | 亚洲日本va在线观看 | 中文字幕精品一区二区三区电影 | 91中文在线观看 | 国产伦精品一区二区三区免费 | 久久久国产精品电影 | 美女免费视频一区二区 | 国产探花在线看 | av成人免费在线 | 亚洲成人黄色在线 | 奇米网在线观看 | 在线观看亚洲国产精品 | 国产手机在线观看视频 | 国产精品 日本 | 日本中出在线观看 | 免费av观看| 国产精品高潮在线观看 | 欧美日韩精品久久久 | 国产中文字幕视频在线观看 | 婷婷av网 | 99精品国产福利在线观看免费 | 久久视频精品在线观看 | 探花系列在线 | 国产专区视频在线观看 | 亚洲欧美婷婷六月色综合 | 久久人人爽人人爽人人片av免费 | 久艹在线观看视频 | 国产一级精品在线观看 | 99久久精品日本一区二区免费 | av成人黄色 | 在线 国产 日韩 | 99热这里精品 | 亚洲精品综合欧美二区变态 | 香蕉影视在线观看 | www.亚洲精品视频 | 欧美日产在线观看 | 亚洲精品www| 久久免费视频5 | 蜜桃视频成人在线观看 | 日韩欧在线 | av经典在线| 欧美专区日韩专区 | 在线观看深夜视频 | 亚洲 精品在线视频 | 久久精品1区| 日本少妇久久久 | 国产 中文 日韩 欧美 | 成人理论电影 | 亚洲 欧美日韩 国产 中文 | 中文字幕视频观看 | 久久成人在线视频 | 99国产精品视频免费观看一公开 | 97视频在线免费播放 | 亚洲免费视频在线观看 | 久久深夜| 一区二区欧美日韩 | 精品美女久久久久 | 午夜精品视频一区 | 在线亚洲成人 | 激情婷婷色 | 99热只有精品在线观看 | 天天做天天射 | 精品一区二区在线看 | 欧美在线1 | 四虎影视4hu4虎成人 | 欧美精品亚州精品 | 日韩欧美在线视频一区二区 | 91精品在线免费观看 | 亚洲va欧美va | 国产精品成人av电影 | 久久在线观看视频 | 中文乱幕日产无线码1区 | 91桃色在线免费观看 | 久久精品超碰 | 中文字幕 国产视频 | 午夜视频在线瓜伦 | av中文天堂| 91网在线 | 日本婷婷色 | a级免费观看 | 天操夜夜操 | 黄色一级大片在线免费看国产一 | 黄色视屏在线免费观看 | 最新国产中文字幕 | 中文字幕av在线播放 | 在线精品视频免费观看 | av中文字幕网址 | 免费在线观看av网址 | 麻豆影视网站 | 美女一二三区 | 不卡视频在线看 | 亚洲国产精品电影在线观看 | 在线观看mv的中文字幕网站 | 欧美男同视频网站 | 日韩在线观看 | 国产黑丝一区二区 | 久草免费看 | 久久久国产精品免费 | 婷婷色在线视频 | 福利网址在线观看 | 成人h动漫在线看 | 国产精品一区二区62 | 视频在线99 | 久久综合欧美 | 97在线看 | 国产精品一级在线 | 国产精品一级在线 | 久久久香蕉视频 | 在线观看国产亚洲 | 正在播放国产精品 | 91麻豆国产福利在线观看 | 午夜久久福利 | 一级a性色生活片久久毛片波多野 | 免费麻豆网站 | 精品99视频 | 97超碰资源总站 | av高清在线观看 | 又黄又爽又色无遮挡免费 | 人人干人人超 | 黄污视频网站 | 国产成人久久精品一区二区三区 | 国产成人高清 | 美女视频黄网站 | 日韩午夜小视频 | 成人三级黄色 | 一级特黄av | 国产高清无线码2021 | 日本精品视频网站 | 日韩黄色免费在线观看 | 日韩免费一二三区 | 国产二区视频在线 | 日韩在线观看一区二区三区 | 亚洲天堂网站视频 | 日韩免费在线一区 | 久久爽久久爽久久av东京爽 | 99人成在线观看视频 | 中文字幕一区二区三区四区 | 99激情网 | 免费亚洲精品视频 | 日本黄色免费在线 | 免费av看片| 天天干天天想 | 亚洲区色 | 婷婷激情五月综合 |