SpringBoot入门实战:SpringBoot整合Apache Hadoop

1.背景介绍

Spring Boot 是一个用于构建 Spring 应用程序的优秀框架。它的目标是简化开发人员的工作,让他们专注于编写业务代码,而不是为 Spring 应用程序设置和配置。Spring Boot 提供了许多功能,如自动配置、依赖管理、嵌入式服务器等,使得开发人员可以更快地构建和部署 Spring 应用程序。

Apache Hadoop 是一个开源的分布式存储和分析框架,它可以处理大量数据并提供高度可扩展性。Hadoop 由两个主要组件组成:Hadoop Distributed File System(HDFS)和MapReduce。HDFS 是一个分布式文件系统,它将数据分成多个块,并在多个节点上存储。MapReduce 是一个分布式数据处理模型,它将数据分成多个部分,并在多个节点上进行处理。

Spring Boot 和 Apache Hadoop 的整合可以让开发人员更轻松地构建和部署 Hadoop 应用程序。Spring Boot 提供了许多用于与 Hadoop 集成的功能,如 Hadoop 客户端、HDFS 存储、MapReduce 任务等。

在本文中,我们将讨论如何使用 Spring Boot 整合 Apache Hadoop。我们将讨论 Spring Boot 的核心概念和联系,核心算法原理和具体操作步骤,以及如何编写具体的代码实例。我们还将讨论未来的发展趋势和挑战,并回答一些常见问题。

2.核心概念与联系

在本节中,我们将讨论 Spring Boot 和 Apache Hadoop 的核心概念,以及它们之间的联系。

2.1 Spring Boot

Spring Boot 是一个用于构建 Spring 应用程序的框架。它的目标是简化开发人员的工作,让他们专注于编写业务代码,而不是为 Spring 应用程序设置和配置。Spring Boot 提供了许多功能,如自动配置、依赖管理、嵌入式服务器等,使得开发人员可以更快地构建和部署 Spring 应用程序。

Spring Boot 的核心概念包括:

  • 自动配置:Spring Boot 提供了许多自动配置功能,可以让开发人员更快地构建和部署 Spring 应用程序。自动配置可以自动配置 Spring 应用程序的各个组件,如数据源、缓存、安全性等。
  • 依赖管理:Spring Boot 提供了依赖管理功能,可以让开发人员更轻松地管理应用程序的依赖关系。依赖管理可以自动下载和配置应用程序的依赖关系,并确保它们之间的兼容性。
  • 嵌入式服务器:Spring Boot 提供了嵌入式服务器功能,可以让开发人员更轻松地部署 Spring 应用程序。嵌入式服务器可以自动启动和配置应用程序的服务器,并确保它们之间的兼容性。

2.2 Apache Hadoop

Apache Hadoop 是一个开源的分布式存储和分析框架,它可以处理大量数据并提供高度可扩展性。Hadoop 由两个主要组件组成:Hadoop Distributed File System(HDFS)和MapReduce。

Hadoop 的核心概念包括:

  • Hadoop Distributed File System(HDFS):HDFS 是一个分布式文件系统,它将数据分成多个块,并在多个节点上存储。HDFS 提供了高度可扩展性和容错性,可以处理大量数据。
  • MapReduce:MapReduce 是一个分布式数据处理模型,它将数据分成多个部分,并在多个节点上进行处理。MapReduce 提供了高度并行性和可扩展性,可以处理大量数据。

2.3 Spring Boot 与 Apache Hadoop 的联系

Spring Boot 和 Apache Hadoop 的整合可以让开发人员更轻松地构建和部署 Hadoop 应用程序。Spring Boot 提供了许多用于与 Hadoop 集成的功能,如 Hadoop 客户端、HDFS 存储、MapReduce 任务等。

Spring Boot 的 Hadoop 集成可以让开发人员更轻松地使用 Hadoop 进行数据处理。Spring Boot 提供了 Hadoop 客户端,可以让开发人员更轻松地与 Hadoop 进行交互。Spring Boot 还提供了 HDFS 存储功能,可以让开发人员更轻松地存储和访问 Hadoop 数据。Spring Boot 还提供了 MapReduce 任务功能,可以让开发人员更轻松地编写和执行 Hadoop 任务。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

在本节中,我们将讨论 Spring Boot 和 Apache Hadoop 的核心算法原理,以及如何编写具体的代码实例。

3.1 Spring Boot 与 Apache Hadoop 的整合

Spring Boot 和 Apache Hadoop 的整合可以让开发人员更轻松地构建和部署 Hadoop 应用程序。Spring Boot 提供了许多用于与 Hadoop 集成的功能,如 Hadoop 客户端、HDFS 存储、MapReduce 任务等。

3.1.1 Hadoop 客户端

Spring Boot 提供了 Hadoop 客户端功能,可以让开发人员更轻松地与 Hadoop 进行交互。Hadoop 客户端可以让开发人员创建、删除、列出 Hadoop 文件和目录等操作。

Hadoop 客户端的核心类包括:

  • FileSystem:FileSystem 类是 Hadoop 客户端的核心类,它可以让开发人员创建、删除、列出 Hadoop 文件和目录等操作。FileSystem 类提供了许多用于与 HDFS 进行交互的方法,如 create、delete、list 等。
  • Path:Path 类是 Hadoop 客户端的核心类,它可以让开发人员表示 Hadoop 文件和目录的路径。Path 类提供了许多用于构建和解析 Hadoop 文件和目录路径的方法,如 getName、getParent、getFileName 等。

3.1.2 HDFS 存储

Spring Boot 提供了 HDFS 存储功能,可以让开发人员更轻松地存储和访问 Hadoop 数据。HDFS 存储可以让开发人员将数据存储在 Hadoop 集群中,并在多个节点上进行处理。

HDFS 存储的核心类包括:

  • FileSystem:FileSystem 类是 HDFS 存储的核心类,它可以让开发人员创建、删除、列出 Hadoop 文件和目录等操作。FileSystem 类提供了许多用于与 HDFS 进行交互的方法,如 create、delete、list 等。
  • Path:Path 类是 HDFS 存储的核心类,它可以让开发人员表示 Hadoop 文件和目录的路径。Path 类提供了许多用于构建和解析 Hadoop 文件和目录路径的方法,如 getName、getParent、getFileName 等。
  • FSDataInputStream:FSDataInputStream 类是 HDFS 存储的核心类,它可以让开发人员读取 Hadoop 文件的内容。FSDataInputStream 类提供了许多用于读取 Hadoop 文件内容的方法,如 read、skip、available 等。
  • FSDataOutputStream:FSDataOutputStream 类是 HDFS 存储的核心类,它可以让开发人员写入 Hadoop 文件的内容。FSDataOutputStream 类提供了许多用于写入 Hadoop 文件内容的方法,如 write、flush、close 等。

3.1.3 MapReduce 任务

Spring Boot 提供了 MapReduce 任务功能,可以让开发人员更轻松地编写和执行 Hadoop 任务。MapReduce 任务可以让开发人员将大量数据分成多个部分,并在多个节点上进行处理。

MapReduce 任务的核心类包括:

  • Job:Job 类是 MapReduce 任务的核心类,它可以让开发人员创建、删除、提交、取消等 MapReduce 任务。Job 类提供了许多用于与 MapReduce 进行交互的方法,如 configure、submit、cancel 等。
  • JobConf:JobConf 类是 MapReduce 任务的核心类,它可以让开发人员配置 MapReduce 任务的参数。JobConf 类提供了许多用于配置 MapReduce 任务参数的方法,如 setInputPath、setOutputPath、setMapper、setReducer 等。
  • FileSplit:FileSplit 类是 MapReduce 任务的核心类,它可以让开发人员将 Hadoop 文件分成多个部分,并在多个节点上进行处理。FileSplit 类提供了许多用于构建和解析 Hadoop 文件分区的方法,如 getPath、getStart、getLength 等。
  • LongWritable:LongWritable 类是 MapReduce 任务的核心类,它可以让开发人员表示 Hadoop 文件的长度。LongWritable 类提供了许多用于构建和解析 Hadoop 文件长度的方法,如 get、toString、hashCode 等。
  • Text:Text 类是 MapReduce 任务的核心类,它可以让开发人员表示 Hadoop 文件的内容。Text 类提供了许多用于构建和解析 Hadoop 文件内容的方法,如 get、toString、hashCode 等。

3.2 核心算法原理

在本节中,我们将讨论 Spring Boot 和 Apache Hadoop 的核心算法原理。

3.2.1 Hadoop 文件系统

Hadoop 文件系统(HDFS)是一个分布式文件系统,它将数据分成多个块,并在多个节点上存储。HDFS 提供了高度可扩展性和容错性,可以处理大量数据。

HDFS 的核心算法原理包括:

  • 数据分区:HDFS 将数据分成多个块,并在多个节点上存储。数据分区可以让 HDFS 提供高度可扩展性和容错性。
  • 数据重复:HDFS 将数据的多个副本存储在多个节点上。数据重复可以让 HDFS 提供高度可用性和容错性。
  • 数据访问:HDFS 提供了高速缓存和数据访问功能,可以让 HDFS 提供高速访问和高度可扩展性。

3.2.2 MapReduce 模型

MapReduce 是一个分布式数据处理模型,它将数据分成多个部分,并在多个节点上进行处理。MapReduce 提供了高度并行性和可扩展性,可以处理大量数据。

MapReduce 的核心算法原理包括:

  • 数据分区:MapReduce 将数据分成多个部分,并在多个节点上进行处理。数据分区可以让 MapReduce 提供高度并行性和可扩展性。
  • 数据处理:MapReduce 将数据的多个部分分别处理,并在多个节点上进行处理。数据处理可以让 MapReduce 提供高度并行性和可扩展性。
  • 数据汇总:MapReduce 将数据的多个部分汇总,并在多个节点上进行处理。数据汇总可以让 MapReduce 提供高度并行性和可扩展性。

3.3 具体操作步骤

在本节中,我们将讨论如何编写具体的代码实例。

3.3.1 Hadoop 客户端

要使用 Hadoop 客户端,首先需要创建一个 Hadoop 客户端实例。然后,可以使用 Hadoop 客户端实例的方法来创建、删除、列出 Hadoop 文件和目录等操作。

例如,要创建一个 Hadoop 文件,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop/test.txt");
FSDataOutputStream out = fs.create(path);
out.write("Hello, World!".getBytes());
out.close();

要删除一个 Hadoop 文件,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop/test.txt");
fs.delete(path, true);

要列出一个 Hadoop 目录下的文件和目录,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop");
FileStatus[] statuses = fs.listStatus(path);
for (FileStatus status : statuses) {
    System.out.println(status.getPath());
}

3.3.2 HDFS 存储

要使用 HDFS 存储,首先需要创建一个 HDFS 存储实例。然后,可以使用 HDFS 存储实例的方法来创建、删除、列出 Hadoop 文件和目录等操作。

例如,要创建一个 HDFS 文件,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop/test.txt");
FSDataOutputStream out = fs.create(path);
out.write("Hello, World!".getBytes());
out.close();

要删除一个 HDFS 文件,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop/test.txt");
fs.delete(path, true);

要列出一个 HDFS 目录下的文件和目录,可以使用以下代码:

FileSystem fs = FileSystem.get(new Configuration());
Path path = new Path("/user/hadoop");
FileStatus[] statuses = fs.listStatus(path);
for (FileStatus status : statuses) {
    System.out.println(status.getPath());
}

3.3.3 MapReduce 任务

要使用 MapReduce 任务,首先需要创建一个 MapReduce 任务实例。然后,可以使用 MapReduce 任务实例的方法来配置 MapReduce 任务参数,并提交 MapReduce 任务。

例如,要创建一个 MapReduce 任务,可以使用以下代码:

Job job = Job.getInstance(new Configuration(), "wordcount");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job, new Path("/user/hadoop/input"));
FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/output"));

要提交一个 MapReduce 任务,可以使用以下代码:

boolean success = job.waitForCompletion(true);
if (success) {
    System.out.println("MapReduce 任务成功");
} else {
    System.out.println("MapReduce 任务失败");
}

4.具体代码实例及详细解释

在本节中,我们将提供具体的代码实例,并提供详细的解释。

4.1 Hadoop 客户端

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HadoopClient {
    public static void main(String[] args) throws Exception {
        // 创建 Hadoop 客户端实例
        FileSystem fs = FileSystem.get(new Configuration());

        // 创建 Hadoop 文件
        Path path = new Path("/user/hadoop/test.txt");
        FSDataOutputStream out = fs.create(path);
        out.write("Hello, World!".getBytes());
        out.close();

        // 删除 Hadoop 文件
        fs.delete(path, true);

        // 列出 Hadoop 目录下的文件和目录
        Path dirPath = new Path("/user/hadoop");
        FileStatus[] statuses = fs.listStatus(dirPath);
        for (FileStatus status : statuses) {
            System.out.println(status.getPath());
        }

        // 关闭 Hadoop 客户端实例
        fs.close();
    }
}

解释:

  • 首先,我们创建了一个 Hadoop 客户端实例,并使用 Hadoop 客户端实例的方法来创建、删除、列出 Hadoop 文件和目录等操作。
  • 然后,我们创建了一个 Hadoop 文件,并使用 FSDataOutputStream 类来写入文件内容。
  • 接着,我们删除了一个 Hadoop 文件,并使用 fs.delete 方法来删除文件。
  • 最后,我们列出了一个 Hadoop 目录下的文件和目录,并使用 FileStatus 类来获取文件和目录的信息。

4.2 HDFS 存储

import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsStorage {
    public static void main(String[] args) throws Exception {
        // 创建 HDFS 存储实例
        FileSystem fs = FileSystem.get(new Configuration());

        // 创建 HDFS 文件
        Path path = new Path("/user/hadoop/test.txt");
        FSDataOutputStream out = fs.create(path);
        out.write("Hello, World!".getBytes());
        out.close();

        // 删除 HDFS 文件
        fs.delete(path, true);

        // 列出 HDFS 目录下的文件和目录
        Path dirPath = new Path("/user/hadoop");
        FileStatus[] statuses = fs.listStatus(dirPath);
        for (FileStatus status : statuses) {
            System.out.println(status.getPath());
        }

        // 关闭 HDFS 存储实例
        fs.close();
    }
}

解释:

  • 首先,我们创建了一个 HDFS 存储实例,并使用 HDFS 存储实例的方法来创建、删除、列出 Hadoop 文件和目录等操作。
  • 然后,我们创建了一个 HDFS 文件,并使用 FSDataOutputStream 类来写入文件内容。
  • 接着,我们删除了一个 HDFS 文件,并使用 fs.delete 方法来删除文件。
  • 最后,我们列出了一个 HDFS 目录下的文件和目录,并使用 FileStatus 类来获取文件和目录的信息。

4.3 MapReduce 任务

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.map.WordCountMapper;
import org.apache.hadoop.mapreduce.lib.reduce.WordCountReducer;

public class WordCount {
    public static void main(String[] args) throws Exception {
        // 创建 MapReduce 任务实例
        Job job = Job.getInstance(new Configuration(), "wordcount");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        // 设置 MapReduce 任务参数
        FileInputFormat.setInputPaths(job, new Path("/user/hadoop/input"));
        FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/output"));

        // 提交 MapReduce 任务
        boolean success = job.waitForCompletion(true);
        if (success) {
            System.out.println("MapReduce 任务成功");
        } else {
            System.out.println("MapReduce 任务失败");
        }
    }
}

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable offset, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] words = line.split(" ");
        for (String word : words) {
            context.write(new Text(word), new IntWritable(1));
        }
    }
}

解释:

  • 首先,我们创建了一个 MapReduce 任务实例,并使用 MapReduce 任务实例的方法来配置 MapReduce 任务参数,并提交 MapReduce 任务。
  • 然后,我们设置了 MapReduce 任务参数,包括 MapReduce 任务的 Jar 包路径、Mapper 类、Reducer 类、输入格式、输出格式、输出键类、输出值类等。
  • 接着,我们设置了 MapReduce 任务的输入路径和输出路径。
  • 最后,我们提交了 MapReduce 任务,并判断 MapReduce 任务是否成功。

5.未来发展与挑战

在本节中,我们将讨论 Spring Boot 与 Apache Hadoop 的整合的未来发展与挑战。

5.1 未来发展

  • 更高效的数据处理:随着数据规模的增加,Spring Boot 与 Apache Hadoop 的整合将需要更高效的数据处理能力,以满足业务需求。
  • 更强大的分布式计算:随着分布式计算的发展,Spring Boot 与 Apache Hadoop 的整合将需要更强大的分布式计算能力,以满足业务需求。
  • 更好的用户体验:随着用户数量的增加,Spring Boot 与 Apache Hadoop 的整合将需要更好的用户体验,以满足业务需求。

5.2 挑战

  • 技术挑战:随着数据规模的增加,Spring Boot 与 Apache Hadoop 的整合将面临技术挑战,如如何更高效地处理大数据,如何更好地分布式计算等。
  • 业务挑战:随着业务需求的变化,Spring Boot 与 Apache Hadoop 的整合将面临业务挑战,如如何更好地满足业务需求,如何更好地适应业务变化等。
  • 人才挑战:随着业务需求的增加,Spring Boot 与 Apache Hadoop 的整合将面临人才挑战,如如何培养更多的专业人士,如何吸引更多的专业人士等。

6.附录:常见问题与解答

在本节中,我们将回答一些常见问题。

6.1 Spring Boot 与 Apache Hadoop 整合的优势

Spring Boot 与 Apache Hadoop 的整合可以为开发者提供以下优势:

  • 更简单的集成:Spring Boot 提供了简单的集成方式,使得开发者可以更简单地将 Hadoop 集成到 Spring 应用程序中。
  • 更高效的开发:Spring Boot 提供了许多工具和库,使得开发者可以更高效地开发 Hadoop 应用程序。
  • 更好的可扩展性:Spring Boot 提供了可扩展性的设计,使得开发者可以更好地扩展 Hadoop 应用程序。

6.2 Spring Boot 与 Apache Hadoop 整合的局限性

Spring Boot 与 Apache Hadoop 的整合也存在一些局限性:

  • 依赖性管理:Spring Boot 与 Apache Hadoop 的整合可能会导致依赖性管理的问题,如冲突的库版本等。
  • 性能问题:Spring Boot 与 Apache Hadoop 的整合可能会导致性能问题,如内存占用、网络延迟等。
  • 学习曲线:Spring Boot 与 Apache Hadoop 的整合可能会增加学习曲线,如需要学习 Spring Boot 和 Hadoop 的相关知识等。

7.参考文献

  1. Spring Boot 官方文档:https://spring.io/projects/spring-boot
  2. Apache Hadoop 官方文档:https://hadoop.apache.org/docs/current/
  3. Spring Boot 与 Apache Hadoop 整合示例:https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-hadoop
  4. Spring Boot 与 Apache Hadoop 整合教程:https://www.tutorialspoint.com/spring_boot/spring_boot_hadoop.htm
  5. Spring Boot 与 Apache Hadoop 整合实践:https://www.baeldung.com/spring-boot-hadoop-integration
  6. Spring Boot 与 Apache Hadoop 整合实例:https://www.mkyong.com/spring-boot/spring-boot-hadoop-integration/
  7. Spring Boot 与 Apache Hadoop 整合案例:https://www.javacodegeeks.com/2018/02/spring-boot-hadoop-integration-example.html
  8. Spring Boot 与 Apache Hadoop 整合教程:https://www.geeksforgeeks.org/spring-boot-hadoop-integration/
  9. Spring Boot 与 Apache Hadoop 整合实例:https://www.journaldev.com/22100/spring-boot-hadoop-integration-example
  10. Spring Boot 与 Apache Hadoop 整合教程:https://www.edureka.co/blog/spring-boot-hadoop-integration/
  11. Spring Boot 与 Apache Hadoop 整合案例:https://www.javatpoint.com/spring-boot-hadoop-integration
  12. Spring Boot 与 Apache Hadoop 整合教程:https://www.tutorialkart.com/spring-boot/spring-boot-hadoop-integration/
  13. Spring Boot 与 Apache Hadoop 整合实例:https://www.tutorialspoint.com/spring_boot/spring_boot_hadoop.htm
  14. Spring Boot 与 Apache Hadoop 整合教程:https://www.javatpoint.com/spring-boot-hadoop-integration
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容