国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

PySpark源碼解析,教你用Python搞定大規(guī)模數(shù)據(jù)分析

共 15791字,需瀏覽 32分鐘

 ·

2021-04-13 22:50

相較于Scala語言而言,Python具有其獨有的優(yōu)勢及廣泛應(yīng)用性,因此Spark也推出了PySpark,在框架上提供了利用Python語言的接口,為數(shù)據(jù)科學(xué)家使用該框架提供了便利。


眾所周知,Spark 框架主要是由 Scala 語言實現(xiàn),同時也包含少量 Java 代碼。Spark 面向用戶的編程接口,也是 Scala。然而,在數(shù)據(jù)科學(xué)領(lǐng)域,Python 一直占據(jù)比較重要的地位,仍然有大量的數(shù)據(jù)工程師在使用各類 Python 數(shù)據(jù)處理和科學(xué)計算的庫,例如 numpy、Pandas、scikit-learn 等。同時,Python 語言的入門門檻也顯著低于 Scala。

為此,Spark 推出了 PySpark,在 Spark 框架上提供一套 Python 的接口,方便廣大數(shù)據(jù)科學(xué)家使用。本文主要從源碼實現(xiàn)層面解析 PySpark 的實現(xiàn)原理,包括以下幾個方面:


  • PySpark 的多進程架構(gòu);

  • Python 端調(diào)用 Java、Scala 接口;

  • Python Driver 端 RDD、SQL 接口;

  • Executor 端進程間通信和序列化;

  • Pandas UDF;

  • 總結(jié)。


PySpark項目地址:https://github.com/apache/spark/tree/master/python








1、PySpark 的多進程架構(gòu)


PySpark 采用了 Python、JVM 進程分離的多進程架構(gòu),在 Driver、Executor 端均會同時有 Python、JVM 兩個進程。當(dāng)通過 spark-submit 提交一個 PySpark 的 Python 腳本時,Driver 端會直接運行這個 Python 腳本,并從 Python 中啟動 JVM;而在 Python 中調(diào)用的 RDD 或者 DataFrame 的操作,會通過 Py4j 調(diào)用到 Java 的接口。

在 Executor 端恰好是反過來,首先由 Driver 啟動了 JVM 的 Executor 進程,然后在 JVM 中去啟動 Python 的子進程,用以執(zhí)行 Python 的 UDF,這其中是使用了 socket 來做進程間通信。總體的架構(gòu)圖如下所示:


2、Python Driver 如何調(diào)用 Java 的接口


上面提到,通過 spark-submit 提交 PySpark 作業(yè)后,Driver 端首先是運行用戶提交的 Python 腳本,然而 Spark 提供的大多數(shù) API 都是 Scala 或者 Java 的,那么就需要能夠在 Python 中去調(diào)用 Java 接口。這里 PySpark 使用了 Py4j 這個開源庫。當(dāng)創(chuàng)建 Python 端的 SparkContext 對象時,實際會啟動 JVM,并創(chuàng)建一個 Scala 端的 SparkContext 對象。代碼實現(xiàn)在 python/pyspark/context.py:

def _ensure_initialized(cls, instance=None, gateway=None, conf=None):
    """
    Checks whether a SparkContext is initialized or not.
    Throws error if a SparkContext is already running.
    """

    with SparkContext._lock:
        if not SparkContext._gateway:
            SparkContext._gateway = gateway or launch_gateway(conf)
            SparkContext._jvm = SparkContext._gateway.jvm


在 launch_gateway (python/pyspark/java_gateway.py) 中,首先啟動 JVM 進程:

SPARK_HOME = _find_spark_home()
# Launch the Py4j gateway using Spark's run command so that we pick up the
# proper classpath and settings from spark-env.sh
on_windows = platform.system() == "Windows"
script = "./bin/spark-submit.cmd" if on_windows else "./bin/spark-submit"
command = [os.path.join(SPARK_HOME, script)]


然后創(chuàng)建 JavaGateway 并 import 一些關(guān)鍵的 class:

gateway = JavaGateway(
        gateway_parameters=GatewayParameters(port=gateway_port, auth_token=gateway_secret,
                                             auto_convert=True))
# Import the classes used by PySpark
java_import(gateway.jvm, "org.apache.spark.SparkConf")
java_import(gateway.jvm, "org.apache.spark.api.java.*")
java_import(gateway.jvm, "org.apache.spark.api.python.*")
java_import(gateway.jvm, "org.apache.spark.ml.python.*")
java_import(gateway.jvm, "org.apache.spark.mllib.api.python.*")
# TODO(davies): move into sql
java_import(gateway.jvm, "org.apache.spark.sql.*")
java_import(gateway.jvm, "org.apache.spark.sql.api.python.*")
java_import(gateway.jvm, "org.apache.spark.sql.hive.*")
java_import(gateway.jvm, "scala.Tuple2")

拿到 JavaGateway 對象,即可以通過它的 jvm 屬性,去調(diào)用 Java 的類了,例如:
gateway = JavaGateway()

gateway = JavaGateway()
jvm = gateway.jvm
l = jvm.java.util.ArrayList()


然后會繼續(xù)創(chuàng)建 JVM 中的 SparkContext 對象:

def _initialize_context(self, jconf):
    """
    Initialize SparkContext in function to allow subclass specific initialization
    """

    return self._jvm.JavaSparkContext(jconf)

# Create the Java SparkContext through Py4J
self._jsc = jsc or self._initialize_context(self._conf._jconf)

3、Python Driver 端的 RDD、SQL 接口

在 PySpark 中,繼續(xù)初始化一些 Python 和 JVM 的環(huán)境后,Python 端的 SparkContext 對象就創(chuàng)建好了,它實際是對 JVM 端接口的一層封裝。和 Scala API 類似,SparkContext 對象也提供了各類創(chuàng)建 RDD 的接口,和 Scala API 基本一一對應(yīng),我們來看一些例子。

def newAPIHadoopFile(self, path, inputFormatClass, keyClass, valueClass, keyConverter=None,
                     valueConverter=None, conf=None, batchSize=0)
:
    jconf = self._dictToJavaMap(conf)
    jrdd = self._jvm.PythonRDD.newAPIHadoopFile(self._jsc, path, inputFormatClass, keyClass,
                                                valueClass, keyConverter, valueConverter,
                                                jconf, batchSize)
    return RDD(jrdd, self)

可以看到,這里 Python 端基本就是直接調(diào)用了 Java/Scala 接口。而 PythonRDD (core/src/main/scala/org/apache/spark/api/python/PythonRDD.scala),則是一個 Scala 中封裝的伴生對象,提供了常用的 RDD IO 相關(guān)的接口。另外一些接口會通過 self._jsc 對象去創(chuàng)建 RDD。其中 self._jsc 就是 JVM 中的 SparkContext 對象。拿到 RDD 對象之后,可以像 Scala、Java API 一樣,對 RDD 進行各類操作,這些大部分都封裝在 python/pyspark/rdd.py 中。


這里的代碼中出現(xiàn)了 jrdd 這樣一個對象,這實際上是 Scala 為提供 Java 互操作的 RDD 的一個封裝,用來提供 Java 的 RDD 接口,具體實現(xiàn)在 core/src/main/scala/org/apache/spark/api/java/JavaRDD.scala 中。可以看到每個 Python 的 RDD 對象需要用一個 JavaRDD 對象去創(chuàng)建。


對于 DataFrame 接口,Python 層也同樣提供了 SparkSession、DataFrame 對象,它們也都是對 Java 層接口的封裝,這里不一一贅述。


4、Executor 端進程間通信和序列化


對于 Spark 內(nèi)置的算子,在 Python 中調(diào)用 RDD、DataFrame 的接口后,從上文可以看出會通過 JVM 去調(diào)用到 Scala 的接口,最后執(zhí)行和直接使用 Scala 并無區(qū)別。而對于需要使用 UDF 的情形,在 Executor 端就需要啟動一個 Python worker 子進程,然后執(zhí)行 UDF 的邏輯。那么 Spark 是怎樣判斷需要啟動子進程的呢?


在 Spark 編譯用戶的 DAG 的時候,Catalyst Optimizer 會創(chuàng)建 BatchEvalPython 或者 ArrowEvalPython 這樣的 Logical Operator,隨后會被轉(zhuǎn)換成 PythonEvals 這個 Physical Operator。在 PythonEvals(sql/core/src/main/scala/org/apache/spark/sql/execution/SparkStrategies.scala)中:

object PythonEvals extends Strategy {
  override def apply(plan: LogicalPlan): Seq[SparkPlan] = plan match {
    case ArrowEvalPython(udfs, output, child, evalType) =>
      ArrowEvalPythonExec(udfs, output, planLater(child), evalType) :: Nil
    case BatchEvalPython(udfs, output, child) =>
      BatchEvalPythonExec(udfs, output, planLater(child)) :: Nil
    case _ =>
      Nil
  }
}


創(chuàng)建了 ArrowEvalPythonExec 或者 BatchEvalPythonExec,而這二者內(nèi)部會創(chuàng)建 ArrowPythonRunner、PythonUDFRunner 等類的對象實例,并調(diào)用了它們的 compute 方法。由于它們都繼承了 BasePythonRunner,基類的 compute 方法中會去啟動 Python 子進程:

def compute(
      inputIterator: Iterator[IN],
      partitionIndex: Int,
      context: TaskContext): Iterator[OUT] = {
  // ......

  val worker: Socket = env.createPythonWorker(pythonExec, envVars.asScala.toMap)
  // Start a thread to feed the process input from our parent's iterator
  val writerThread = newWriterThread(env, worker, inputIterator, partitionIndex, context)
  writerThread.start()
  val stream = new DataInputStream(new BufferedInputStream(worker.getInputStream, bufferSize))

  val stdoutIterator = newReaderIterator(
    stream, writerThread, startTime, env, worker, releasedOrClosed, context)
  new InterruptibleIterator(context, stdoutIterator)


這里 env.createPythonWorker 會通過 PythonWorkerFactory(core/src/main/scala/org/apache/spark/api/python/PythonWorkerFactory.scala)去啟動 Python 進程。Executor 端啟動 Python 子進程后,會創(chuàng)建一個 socket 與 Python 建立連接。所有 RDD 的數(shù)據(jù)都要序列化后,通過 socket 發(fā)送,而結(jié)果數(shù)據(jù)需要同樣的方式序列化傳回 JVM。


對于直接使用 RDD 的計算,或者沒有開啟 spark.sql.execution.arrow.enabled 的 DataFrame,是將輸入數(shù)據(jù)按行發(fā)送給 Python,可想而知,這樣效率極低。


在 Spark 2.2 后提供了基于 Arrow 的序列化、反序列化的機制(從 3.0 起是默認開啟),從 JVM 發(fā)送數(shù)據(jù)到 Python 進程的代碼在 sql/core/src/main/scala/org/apache/spark/sql/execution/python/ArrowPythonRunner.scala。這個類主要是重寫了 newWriterThread 這個方法,使用了 ArrowWriter 向 socket 發(fā)送數(shù)據(jù):

val arrowWriter = ArrowWriter.create(root)
val writer = new ArrowStreamWriter(root, null, dataOut)
writer.start()

while (inputIterator.hasNext) {
val nextBatch = inputIterator.next()

while (nextBatch.hasNext) {
    arrowWriter.write(nextBatch.next())
}

arrowWriter.finish()
writer.writeBatch()
arrowWriter.reset()

可以看到,每次取出一個 batch,填充給 ArrowWriter,實際數(shù)據(jù)會保存在 root 對象中,然后由 ArrowStreamWriter 將 root 對象中的整個 batch 的數(shù)據(jù)寫入到 socket 的 DataOutputStream 中去。ArrowStreamWriter 會調(diào)用 writeBatch 方法去序列化消息并寫數(shù)據(jù),代碼參考 ArrowWriter.java#L131。

protected ArrowBlock writeRecordBatch(ArrowRecordBatch batch) throws IOException {
  ArrowBlock block = MessageSerializer.serialize(out, batch, option);
  LOGGER.debug("RecordBatch at {}, metadata: {}, body: {}",
      block.getOffset(), block.getMetadataLength(), block.getBodyLength());
  return block;
}

在 MessageSerializer 中,使用了 flatbuffer 來序列化數(shù)據(jù)。flatbuffer 是一種比較高效的序列化協(xié)議,它的主要優(yōu)點是反序列化的時候,不需要解碼,可以直接通過裸 buffer 來讀取字段,可以認為反序列化的開銷為零。我們來看看 Python 進程收到消息后是如何反序列化的。


Python 子進程實際上是執(zhí)行了 worker.py 的 main 函數(shù) (python/pyspark/worker.py):

if __name__ == '__main__':
    # Read information about how to connect back to the JVM from the environment.
    java_port = int(os.environ["PYTHON_WORKER_FACTORY_PORT"])
    auth_secret = os.environ["PYTHON_WORKER_FACTORY_SECRET"]
    (sock_file, _) = local_connect_and_auth(java_port, auth_secret)
    main(sock_file, sock_file)


這里會去向 JVM 建立連接,并從 socket 中讀取指令和數(shù)據(jù)。對于如何進行序列化、反序列化,是通過 UDF 的類型來區(qū)分:

eval_type = read_int(infile)
if eval_type == PythonEvalType.NON_UDF:
    func, profiler, deserializer, serializer = read_command(pickleSer, infile)
else:
    func, profiler, deserializer, serializer = read_udfs(pickleSer, infile, eval_type)

在 read_udfs 中,如果是 PANDAS 類的 UDF,會創(chuàng)建 ArrowStreamPandasUDFSerializer,其余的 UDF 類型創(chuàng)建 BatchedSerializer。我們來看看 ArrowStreamPandasUDFSerializer(python/pyspark/serializers.py):

def dump_stream(self, iterator, stream):
    import pyarrow as pa
    writer = None
    try:
        for batch in iterator:
            if writer is None:
                writer = pa.RecordBatchStreamWriter(stream, batch.schema)
            writer.write_batch(batch)
    finally:
        if writer is not None:
            writer.close()

def load_stream(self, stream):
    import pyarrow as pa
    reader = pa.ipc.open_stream(stream)
    for batch in reader:
        yield batch

可以看到,這里雙向的序列化、反序列化,都是調(diào)用了 PyArrow 的 ipc 的方法,和前面看到的 Scala 端是正好對應(yīng)的,也是按 batch 來讀寫數(shù)據(jù)。對于 Pandas 的 UDF,讀到一個 batch 后,會將 Arrow 的 batch 轉(zhuǎn)換成 Pandas Series。

def arrow_to_pandas(self, arrow_column):
    from pyspark.sql.types import _check_series_localize_timestamps

    # If the given column is a date type column, creates a series of datetime.date directly
    # instead of creating datetime64[ns] as intermediate data to avoid overflow caused by
    # datetime64[ns] type handling.
    s = arrow_column.to_pandas(date_as_object=True)

    s = _check_series_localize_timestamps(s, self._timezone)
    return s

def load_stream(self, stream):
    """
    Deserialize ArrowRecordBatches to an Arrow table and return as a list of pandas.Series.
    """

    batches = super(ArrowStreamPandasSerializer, self).load_stream(stream)
    import pyarrow as pa
    for batch in batches:
        yield [self.arrow_to_pandas(c) for c in pa.Table.from_batches([batch]).itercolumns()]


5、Pandas UDF


前面我們已經(jīng)看到,PySpark 提供了基于 Arrow 的進程間通信來提高效率,那么對于用戶在 Python 層的 UDF,是不是也能直接使用到這種高效的內(nèi)存格式呢?答案是肯定的,這就是 PySpark 推出的 Pandas UDF。區(qū)別于以往以行為單位的 UDF,Pandas UDF 是以一個 Pandas Series 為單位,batch 的大小可以由 spark.sql.execution.arrow.maxRecordsPerBatch 這個參數(shù)來控制。這是一個來自官方文檔的示例:

def multiply_func(a, b):
    return a * b

multiply = pandas_udf(multiply_func, returnType=LongType())

df.select(multiply(col("x"), col("x"))).show()

上文已經(jīng)解析過,PySpark 會將 DataFrame 以 Arrow 的方式傳遞給 Python 進程,Python 中會轉(zhuǎn)換為 Pandas Series,傳遞給用戶的 UDF。在 Pandas UDF 中,可以使用 Pandas 的 API 來完成計算,在易用性和性能上都得到了很大的提升。


6、總結(jié)


PySpark 為用戶提供了 Python 層對 RDD、DataFrame 的操作接口,同時也支持了 UDF,通過 Arrow、Pandas 向量化的執(zhí)行,對提升大規(guī)模數(shù)據(jù)處理的吞吐是非常重要的,一方面可以讓數(shù)據(jù)以向量的形式進行計算,提升 cache 命中率,降低函數(shù)調(diào)用的開銷,另一方面對于一些 IO 的操作,也可以降低網(wǎng)絡(luò)延遲對性能的影響。


然而 PySpark 仍然存在著一些不足,主要有:


  • 進程間通信消耗額外的 CPU 資源;

  • 編程接口仍然需要理解 Spark 的分布式計算原理;

  • Pandas UDF 對返回值有一定的限制,返回多列數(shù)據(jù)不太方便。





Databricks 提出了新的 Koalas 接口來使得用戶可以以接近單機版 Pandas 的形式來編寫分布式的 Spark 計算作業(yè),對數(shù)據(jù)科學(xué)家會更加友好。而 Vectorized Execution 的推進,有望在 Spark 內(nèi)部一切數(shù)據(jù)都是用 Arrow 的格式來存放,對跨語言支持將會更加友好。同時也能看到,在這里仍然有很大的性能、易用性的優(yōu)化空間,這也是我們平臺近期的主要發(fā)力方向之一。

陳緒,匯量科技(Mobvista)高級算法科學(xué)家,負責(zé)匯量科技大規(guī)模數(shù)據(jù)智能計算引擎和平臺的研發(fā)工作。在此之前陳緒是阿里巴巴高級技術(shù)專家,負責(zé)阿里集團大規(guī)模機器學(xué)習(xí)平臺的研發(fā)。

瀏覽 101
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 黄色片视频在线观看| 日韩毛片在线视频x| 成人亚洲性情网站www在线| 中文字幕综合在线| 广州媚黑妇系列视频在线| 亚洲一级a| 大香蕉老师| 亚洲精品久久久久久久久蜜桃| 成人午夜在线| 17c.白丝喷水自慰| 91精品国产综合久久久不打电影| 精品无码一区二区三区四区久久久软件 | 九九热在线精品视频| 在线色网站| 色色视频在线观看| 九九九精品视频| 性爱无码视频| 蜜芽人妻在线| 男女一区二区| 潮喷在线观看| 欧美老熟妇乱大交XXXXX| 色情视频在线观看| 尹人香蕉久久| 高清无码视频免费版本在线观看 | 九九热无码| 91麻豆电影| 91丨九色丨熟女泻火| 中文一区| 在线观看国产免费视频| www天天操| 青娱乐成人在线视频| 韩国gogogo高清在线完整版| 国产免费av片| 日韩成人在线播放| 91最新在线播放| 亚洲免费观看高清完整| 成人理伦A级A片在线论坛| 九九热精| 久久久久久久国产精品| 久久精品免费看| 亚洲天堂三级片| 日韩无码内射| 国产亚洲欧美在线| 午夜成人福利视频| 久久午夜无码人妻精品蜜桃冫| 欧美日韩在线视频免费| 丁香五月大香蕉| 一级AV| 欧美A级黄片| 日韩免费不卡| 99在线视频精品| 1插菊花综合网| 草碰在线视频| 安徽妇搡BBBB搡BBBB按摩| 七十路の高齢熟女千代子| 午夜操| 亚洲天堂网2025| 大香蕉综合视频| 国产又粗又长的视频| 超碰自拍私拍二区三区区| 亚洲一区视频在线| 蜜臀久久99精品久久久兰草影视 | 日韩AV成人电影| www香蕉成人片com| 亚洲另类av| 久操亚洲| 波多野结衣AV在线播放| 美女啪啪网站| 免费成人一级片| 人人妻人人爽人人操| 永久免费看A人片无码精| 在线黄色视频网站| 国产剧情在线| 欧美怡春院| 亚洲色图欧美| 狠狠草狠狠干| 国产无码成人电影| 操女人大逼| 免费一级黄色视频| 麻豆毛片| 在线观看视频亚洲| 成人A片在线观看| 日韩操比视频| 青娱乐国产视频| 大香蕉99| 欧美精品乱码99久久蜜桃| 欧美老熟妇乱大交XXXXX| 欧洲毛片基地c区| 日韩人妻无码电影| 欧美五月婷婷| 热re99久久精品国产99热| 国产三级国产三级国产| 成人AV电影在线观看| 午夜日逼网站| 电影91久久久| www.有码99| 男人天堂色男人| 亚洲国产精品久久久久婷婷老年 | 欧美日韩国产在线观看| 人妻HDHDHD96XXXX| 亚洲骚逼| 人妻无码在线观看| 国产情侣在线视频| 菊花插综合网| 亚洲高清无码视频在线| gogogo高清在线观看免费直播中国 | 粉嫩99精品99久久久久久夜| 亚洲福利视频电影精| 中文字幕成人网站| 国产精品视频免费| 二区三区视频| 午夜看黄| 97干网| 天天撸天天操| 日韩av综合| 激情开心五月天| 久久高清亚洲| 伊人久久大香线蕉av一区| 亚洲精品18在线观看| 国产91在线亚洲| 日韩精品一区二区三免费视频| 丰满人妻一区二区三区视频54| 四虎网站| 亚洲天堂手机在线| 青榴视频免费观看| 伊人久久香| 日本黄色影视| 久草精品视频| 国产精品三级在线| 国产精品久久无码| 欧美东京热视频| 俺来也俺也啪WWW色| 一本免费视频| 97人人爽人人爽人人人| 91无码人妻东京热精品一区| 日本黄色免费| 91网站在线观看视频| 国产免费黄色电影| 无码不卡中文字幕| 丁香五月综合| 亚洲.欧美.丝袜.中文.综合| 日韩一欧美| 亚洲综合久| 国产特黄级AAAAA片免| 五月天伊人| 免费看黄色录像| www.91自拍| 晚上碰视频| 少妇精品无码一区二区免费视频| 日韩AV无码一区二区三区| 水果派解说A∨无码区| A级毛片在线观看| 日韩干网| 韩国成人啪啪无码高潮| 西西4444大胆无码视频| 免费看欧美日黄片| 蜜桃视频在线入口www| 国外操逼视频| 精品国产无码怀孕| 日韩国产| 51成人免费| 依人成人| 国产91探花精品一区二区| 日韩无码网站| 日韩AV中文字幕在线| 在线一区视频| AV免费网站| 日韩在线观看视频网站| 亚洲日本一区二区三区| 在线中文字幕视频| 免费A在线观看| 国产理论视频在线观看| 欧美手机在线视频| 久操青青| 五月丁香婷婷久久| 国产熟妇婬乱一区二区| 色婷婷国产精品综合在线观看| 五月丁香六月情| 一级特黄大片录像i| 99精品视频国产| 人妻无码HEYZO少妇精品| 荫蒂添出高潮A片视频| 一本加勒比HEZYO东京热无码| 国产欧美综合视频| 中国操逼视频| 欧美特大黄| av天天操| 黄网国产手机在线观看| www免费视频在线观看播放 | 操中国老女人| 视频在线一区| 亚洲欧洲天堂| 欧美一级黄片免费看| 国产激情小视频| 亚洲欧美国产视频| 丁香婷婷五月基地| 久久成人A片| 91人人澡人人爽人人看| 国产真实露脸乱子伦对白高清视频| 97午夜福利视频| 成人123区| 黄色片在线免费看| 久久久噜噜噜| 一插菊花综合| 9l人人澡人人妻人人精品| 亚洲综合激情五月久久| 亚洲精品婷婷| 亚洲理伦| 激情无码精品| 一卡二卡在线视频| 国产主播精品| 亚洲AV无码国产精品| av网站免费观看| 黄色操逼大片| 国产精品v欧美精品v日韩精品| 国产毛片一照区| 国产777777| 日本精品在线视频| 水蜜桃视频在线| 荫蒂添到高潮免费视频| 亚洲小电影在线观看| 欧美,日韩,日| 国产乱伦电影| AV网站在线播放| 久久综合伊人777777| 想要xx视频| 少妇BBBB| 精品蜜桃秘一区二区三区观看| 欧美成人A片| 特级西西444www高清| 欧美高清视频| 精品一区二区三区免费| 日日夜夜精选视频| 操逼地址| 精品视频久久久久久| 欧美成人在线视频| 日本成人电影| 少妇搡BBBB搡BBB搡造水爽 | 国精品无码人妻一区二区三区| 蜜桃久久久亚洲精| 2026无码视频| 在线观看无码| 99热超碰| 伊人色五月| 西西人体大胆ww4444| 日韩性做爰免费A片AA片| 国产午夜激情视频| 免费伊人大香蕉| A级视频免费观看| 在线日韩一区二区| 操人| 一级黄片学生妹| 露脸偷拍AV2025| 日韩高清无码免费| 日韩加勒比| 日韩中文字幕av| 成人在线视频播放| 人人妻人人澡人人爽人人DVD | 欧美天天性爱| 91黑人丨人妻丨国产丨| 国产乱子伦精品久久| 99re在线精品| 日本wwwwww| 欧美一级特黄A片免费观看| 小黄片在线免费观看| 国产午夜精品视频| 一级成人片在线观看| 中文字幕免| 999精品视频在线| 色999在线播放视频| 成人片成人网久久蜜桃臀| 在线无码播放| 人人爽人人操| av黄色| 欧美色小说| 欧美操逼网| 亚洲无码中文字幕在线观看| 麻豆性爱| 白虎高清无码大尺度免费在线观看| 久青草视频| 欧美操操操| 黄色内射在线播放| 精品一区二区三区蜜桃臀www | 免费人成在线观看视频播放| 日韩在线91| 日本啪啪网站| 12—13女人毛片毛片| 台湾毛片| 婷婷综合素质二区| 亚洲精品秘一区二区三小| 亚洲精品久久久蜜桃| 丰满人妻精品一区二区在线| 中文字幕国产在线| 欧美熟妇精品一级A片视色| 欧美性精品| 亚洲日韩中文字幕在线观看| 成人视频网站18| 蜜桃91精品秘入口| 久久日韩操| 中国最大成人网站| 国产精品伦子伦免费视频| 干老女人逼| 老太老熟女城中层露脸60| 成人网站无码| 毛片91| 久久精品大香蕉| 成年人黄色片| 亚洲一区二区视频| 北条麻妃一区二区三区-免费免费高清观看 | 老太色HD色老太HD| 午夜成人在线观看| 美女被操网站| 亚洲国产高清在线观看视频| 久久久人妻无码精品蜜桃| 亚洲jiZZjiZZ日本少妇| 日韩中文无码电影| 婷婷五月天性爱| www.日韩无码| 九九无码视频| 国产一区二区三区在线| 偷拍九九热| 在线中文AV| 午夜福利电影AV| 91精品无码视频| 亚欧洲精品在线视频免费观看| 99久视频| 殴美老妇BBBBBBBBB| 欧洲黑人成人A版免费视频| 西西444WWW无码视频软件| 色哟哟网站| 成年人免费视频在线观看| 人妻体内射精一区二区三区| AAA免费视频| 亚洲无码第一页| 黑人干亚洲人| 毛片1| 九九综合伊人7777777| 亚洲性视频| 久久精品欧美| www.777熟女人妻| 蜜臀AV午夜精品| 波多野结衣91| 午夜激情av| 免费看欧美成人A片| 91成人一区二区| 爱操综合| 国产成人小视频| 亚洲任你操超碰在线| 无码人妻丰满熟妇区17水蜜桃| 国内精品内射| 无码人妻精品一区二区三千菊电影| 天堂中文在线观看| 在线观看免费欧美操逼视频| 99热这里是精品| 超碰97在线免费| 成人三级在线| 亚洲国产区| 开心激情网五月天| 久久久777| 永久免费看片视频5355| 波多野结衣AV在线观看| 老湿机福利视频| 日韩一区无码| 手机在线成人视频| 老师搡BBBB搡BBB| 性无码一区二区三区无码免费| 天天干天天摸| 999这里只有精品| 桃色五月天| 国产欧美在线| 久久影院av| 欧美黄片一区| 五月激情综合网| 免费黄色Av| 狠狠干网站| 男女www| 日韩成人AV在线播放| 亚洲AV无码成人精品区在线欢看 | 三级无码视频| 亚洲天堂中文| 国产性爱精品| 亚洲一区二区三区无码| 久久高清亚洲| 国产黄色性爱视频| 久久久三级片| 一级特黄A片| 北条麻妃无码精品AV| 中文字幕高清在线中文字幕中文字幕 | 久久久偷拍视频| 操在线视频| 欧美日韩一区二区三区| 无码一区二区区| 国产欧美精品一区二区色综合 | 五月天婷婷视频| 午夜视频无码| 午夜激情五月天| 中日美朝美女一级片免费看 | 91久久香蕉囯产熟女线看蜜桃| 日鸡吧链接| 特级西西西88大胆无码| 嫩草在线观看| 免费视频在线观看黄| 3d动漫精品H区XXXXX区| 五月天综合网| 九九视频网| 成人性爱网站| 大香蕉色婷婷| 操日本逼| 中国一级黄色A片| 四虎亚洲无码| 国产成人免费观看| 亚洲视频1区| 新妺妺窝窝777777野外| 黄色大片AV| 黄色视频网站在线看| 人人色人人摸| japanese在线观看| 蜜桃视频网站| 婷婷综合欧美| 翔田千里AV在线| 91成人在线影院| 中文字幕人成人乱码亚洲电影| 一级片黄色免费| 国产精品高潮无套内谢| 四虎无码丰满人妻| 美女极度色诱图片www视频| 人人操人人摸人人| 精品一区二区三区无码| 成人欧美大片黄18| 人人舔人人爱| 黄色成人视频| 色播视频在线观看| 国产成人一区二区三区| 黄色视频在线观看地址| 一区二区三区四区五区在线| 粉嫩99精品99久久久久久特污| 免费在线观看黄色| 日本黄色免费在线观看| 中文字幕视频一区| 草榴在线视频| 猫咪视频大全视频| 蜜臀久久久| 丁香五月激情中文字幕| 日韩欧美123| 国产无码乱伦内射| 91超碰久久在线| 国产6区| 99精品视频免费看| 久久久偷拍视频| 色播五月婷婷| 九九热这里有精品| 91精东传媒果冻传媒| h片在线免费观看视频| 秋霞精品一区二区三区| 亚洲日本高清| 国产又粗又长又硬又大毛苴茸图片 | 亚洲草比视频网| 国精产品久拍自产在线网站| 久久天堂av| 国产乱子伦一区二区三精品| 欧美午夜性爱视频| 无码精品一区| 人成无码| 国产免费精彩视频| 中文字幕精品亚洲熟女| 成人精品一区二区无码| 青草福利视频| 午夜福利影片| 国产熟妇搡BBBB搡BBBB搡| 网站你懂得| 伊人网av| 丰满无码| 亚洲日韩中文字幕在线| 亚洲无码色色| 无码人妻丰满熟妇精品区| 三级成人无码| www.97av| 成人A片在线播放| 在线视频一区二区三区| 中文字幕99页| 女公务员人妻呻吟求饶| 狠狠狠狠狠狠| TheAV精尽人亡av| 日韩aaa| 久久久久免费| 91乱| 在线观看免费欧美操逼视频| 欧美成人h| 亚欧洲精品在线视频| 自拍偷拍一区二区三区| 啪啪免费网站| 欧美成人精品欧美一级| 激情五月婷婷网| 久9热| 麻豆激情| 亚洲乱伦图| 91成人免费电影片| 香蕉久久久| 超碰在线网站| 国产精品久久久久无码AV| 成人肏逼视频在线| 东方av在线观看| 国产成人自拍偷拍视频| 天天天天天天天天干| 操逼视频免费在线观看| 久久艹久久| 国产3p绿帽骚妻视频| 久热久| 黄色福利在线观看| 狠狠色五月亚洲91| 青娱乐成人在线视频| 国产海角视频| 香蕉伊人在线| 91麻豆福利视频| 成人不卡在线| 亚洲图片中文字幕| 露脸偷拍AV2025| 2021无码| 亚洲a网| 伊人婷婷大香蕉| 国产一区二区三区视频在线| 亚洲中文视频| 久久成人片| AV高清| 国产精品一区二区免费| 青青热视频| 日本在线播放| 无码人妻一区二区三区线花季传件| 乱子伦国产精品www| 国产成人无码精免费视频| 亚洲精品三级在线观看| www.黄片| 俺来也俺也去| 一级特黄AAAA片| 91久久免费视频| www.五月天.con| 东北骚妇大战黑人视频| 11孩岁女精品A片BBB| 中文字幕av在线播放| 亚洲日韩Av无码中文字幕美国| 九九午夜| 爆乳乱伦| 91二区三区| 成人做爱黄片| 亚洲第一香蕉视频| 无码国产精品一区二区| 亚洲高清无码中文字幕| 婷婷五月丁香色| 久久精品国产亚洲AV成人婷婷| 天天日日日干| 九月婷婷综合| 白峰美羽人妻AND-499| 国产十欧洲十美国+亚洲一二三区在线午夜| 亚洲中文字| 日韩午夜| 大香蕉手机在线视频| 能看的AV网站| AAA久久| 91干逼| 北条麻妃一区二区三区在线播放| 欧美AⅤ视频| 看A片在线| 精品国产久久久久| 在线免费AV片| 婷婷激情五月天丁香| 有码在线播放| 波多野结衣AV在线| 日韩中文在线观看| 日韩精品成人在线| 欧美精产国品一区二区区别| 男人日女人视频| 国产卡一卡二| www.婷婷色| 大香蕉免费在线观看| 国产wwwww| 天天爽天天射| 91嫩逼| 五月婷婷六月香| JlZZJLZZ亚洲美女18| 国产99自拍| 精品永久免费| 天天拍天天射| 可以免费观看的毛片| 91视频高清无码| 免费无码婬片AAAA片在线蜜芽| 7x7x7x人成免费观学生视频| 操逼123首页| 人人夜夜人人| 欧美色色视频| 久久久久久久网| 91麻豆一区| 18禁看网站| 在线观看av资源| 国产小视频在线免费观看| 男女黄色免费网站| 成人在线激情| 九九九欧美| 国产午夜视频在线| 色综合中文字幕| 欧美三级美国一级| 青青操网站| 中文无码日本一级A片久久影视| 日韩无码一区二区三区四区| 免费黄色一级片| 无码电影网站| 国产精品一二| 毛片一区| 欧美爱| 亚洲理论在线| 日韩AV资源网| 欧美一级a视频免费放| 国产中文字幕波多| 99国产热| A在线免费观看| 在线操逼| 另类一区| 三级片大香蕉| 日本精品视频| 九九热无码| 亚洲日韩精品欧美一区二区yw| 中文字幕日韩美| 日韩三级网| 色激情五月天| 欧美一级黄色A片| 91偷拍视频| 日韩女人性爱| 日韩精品无码av| 久久久精品一区| 小明成人免费视频| 亚洲欧美日韩色图| 在线看黄片| 成人A毛片| 无码小黄片| 另类TS人妖一区二区三区| 日韩爆乳在线| 永久免费看片视频| 91精品一区二区| 91视频网站| 在线看黄网| A级免费视频| 激情五月婷婷五月| h片在线看| 乱婬妺妺躁爽A片| 久久日韩操| 操逼地址| 五月天婷婷激情视频| 成人无码三级| 亚洲色图在线观看| 国产成人小视频在线观看| 91久九九| 人人草人人澡| 成人在线中文字幕| 麻豆传媒嫂子| 无码在线视频播放| 国产成人自拍视频在线观看| 毛多水多丰满女人A片| 亚洲在线中文字幕| 91人妻无码精品| 黄色操逼大片| 天天爽天天射| 无码一级| 亚洲欧美在线成人| 亚洲乱伦电影| 国产成人av在线播放| 国产精品乱码毛片在线人与| 日本久久成人| 久久精品www人人爽人人| 亚洲狼人综合| 99热精品免费在线观看| 国产欧美综合三级伦| 天堂AV在线免费观看| 7799精品视频| 欧美老妇日韩| 动漫操逼视频| 亚洲涩情91日韩一区二区| 日本韩国无码视频| 91精品国产麻豆国产自产在线| 日韩超碰| 日韩av成人| 亚洲中文字幕观看| 高清无码视频免费观看| 国产精品51麻豆cm传媒| 免费观看在线无码视频| 97人人草| 精品国产乱码久久久久夜深人妻| 色综合久久88色综合| 超碰在线观看99| 成年人视频网站| 在线伊人网| 五月天激情性爱| 在线无码视频| 99国产一区| 91人人人| 快播激情小说| 大帝av| 色男人色天堂| 亚洲中文字幕无码爆乳av| AV网站在线免费观看| 91成人亚洲| 天天草天天日| 日韩久久视频| 加勒比无码人妻| 无码av免费| 丰满欧美熟妇免费视频| 东方AV免费在线观看| 国产欧美日韩一区二区三区| 亚洲AV网站| 久久永久免费| AV在线免费观看网站| 精品乱子伦一区二区三区毛| 色色影音先锋| 色噜噜狠狠色综无码久久合欧美| 友田真希一级婬片A片| 日韩操B视频| 好吊视频一区二区三区红桃视频you | 日韩一区二区三区在线观看| www在线视频| 久久精品国产99精品国产亚洲性色| 欧美老女人操逼群| 黄色片视频免费| 亚洲日本中文字幕| 日韩精品一区二区亚洲AV观看| 人善交精品一区二区三区| 久草中文在线视频| 小黄片在线看| 手机在线成人视频| 一区二区三区免费在线观看| 亚洲成人在线| 蜜桃久久av一区| 大香蕉网址| 国产免费一级特黄A片| 亚洲日韩久久| www激情| 丁香六月天| 天堂成人网站| 亚洲欧美性爱视频| jizz在线观看免费视频| 国精产品一区一区三区四川| 免费AV资源在线观看| 欧美色色色色色| 国产精品成人3p一区二区三区| 日批视频在线观看| 日韩vA| 成人无码日韩| 成人影片在线观看18| 色婷婷色五月| 91成全在线| 性久久久久久| 四虎成人精品永久免费AV九九| 日韩黄色AV| 无码直播| 国产av影视| 久久人人操人人| 亚欧精品久久久久久久久久久| 国产手机精品视频| 午夜av免费在线| 特级西西人体WWWWW| 伊人性视频| 大香蕉尹在线| 国产精品人人人人| 国产a片| 伊大香蕉| 殴美色色网| 3344在线观看免费下载视频| 调教人妻视频| 日韩精品久久久久久久| www.久久精品视频| 国产精品久久777777是什么意思| 亚洲色无码| 精品国产免费观看久久久_久久天天| 狠狠躁18三区二区一区免费人| 青草青青视频| 成人午夜无码福利视频| A级毛片视频| 国产久久视频| 东北老女人操逼视频| 亚洲精品成人无码熟妇在线| 不卡av在线| 人与禽一级A片一区二区三区| 国产三级片在线观看| jizz国产精品| 在线三级av| 无码在线免费| 嫰BBB槡BBBB槡BBBB| 日日夜夜天天综合| 豆花视频| 亚洲人成小说| 精品女同一区二区三区四区外站在线| 中文在线字幕电视剧免费平台 | 四虎在线视频观看96| 午夜AV无码| 久久成人福利| 91丨豆花丨成人熟女| 不卡免费视频| 成人一区视频| 91丝袜足交| 国产精品网站在线观看| 一区二区三区水蜜桃| 亚洲蜜桃av一区| 91成人视频在线播放| 久久天堂AV综合合色蜜桃网| 国产一区二区久久| 久久成人片| 91肏屄视频| 亚洲综合网在线观看| 99在线视频观看| 性爱福利视频| 亚洲另类图片小说| 成人色播播| 91人妻人人爽人人爽| 久久成人国产| 无码在线播| 日韩中文字幕在线| 久久天天操| 停停六综合| 久久天堂av| 亚洲一级片| 高清无码在线观看免费| 亚洲色操| 国产一级黄色毛片| 偷拍三区| 丁香五月影院| 91视频你懂的| 69国产成人精品二区| 高清中字无码| 天天av天天av天天爽| 成人一卡二卡| 欧美黄色免费在线观看| 日本色情视频网站| 精品福利在线观看| 日本一级片在线观看| 爱草在线| 亚洲国产成人av| 成人影视1-23| 黄色A片网站| 黄色成人网站在线播放| 囯产一级a一级a免费视频| 国产福利免费视频| 91大神免费观看| 欧美性精品| 国产成人无码区亚洲A片356p | 九九精品国产| 一级黄色免费看| 男人的天堂一区| 久色婷婷在线| 大香蕉一级红色片青青河边草| 国产精品99久久久久的广告情况 | 国精产品秘成人一区二| 色婷婷久综合久久一本国产AV| 激情五月天色色| 2026无码视频| 天天综合91| 久久女人视频| 毛片91| 色婷婷在线影院| 日韩国产免费| 日韩v亚洲| 欧美黄色网视频| 亚洲男人天堂| 在线免费观看黄色| AV资源在线播放| 在线中文字幕AV| 欧美自拍| 久久中文字幕人妻| 欧美AAAAAAAA| 国产精品久久久久久最猛| 屁屁影院国产第一页| 99精品视频在线| 免费高清无码视频| 国产欧美一区二区三区四区| 五月天综合| 特黄av| 欧美亚洲日韩在线观看| www.豆花社区成人| 色99在线| 五月天国产视频| 亚洲一级二级片| 日韩图片区小说视频区日| 欧美成人A片在线观看| 亚洲成人高清| 中文国产| 国产精品TV| 2014天堂网| 不卡AV在线| 日本少妇无码| 亚洲无码一级| 欧美精品91| 暖暖无码| 一级欧美一级日韩片| 新妺妺窝窝777777野外| 欧美成人超碰| 亚洲国产激情视频| 十八禁视频在线观看网站.www | 国产理论视频在线观看| 看欧美黄片| 人妻超碰在线| 亚洲区无码| 欧美久草蜜桃视频| 18禁网站在线看| 婷婷色情网|