、说明

  本文主要讲述采集猫眼电影用户评论进行分析,相关爬虫采集程序可以爬取多个电影评论。

  运行环境:Win10/Python3.5。

  分析工具:jieba、wordcloud、pyecharts、matplotlib。

  基本流程:下载内容 ---> 分析获取关键数据 ---> 保存本地文件 ---> 分析本地文件制作图表

  注意:本文所有图文和源码仅供学习,请勿他用,转发请注明出处!

  本文主要参考:https://mp.weixin.qq.com/s/mTxxkwRZPgBiKC3Sv-jo3g

  

二、开始采集

  2.1、分析数据接口:

    为了健全数据样本,数据直接从移动端接口进行采集,连接如下,其中橙色部分为猫眼电影ID,修改即可爬取其他电影。

    链接地址:http://m.maoyan.com/mmdb/comments/movie/.json?v=yes&offset=15&startTime=

    

    

    接口返回的数据如下,主要采集(昵称、城市、评论、评分和时间),用户评论在 json['cmts'] 中:

    

  2.2、爬虫程序核心内容(详细可以看后面源代码):

    >启动脚本需要的参数如下(脚本名+猫眼电影ID+上映日期+数据保存的文件名):.\myMovieComment.py 2016-11-16 myCmts2.txt

    

    >下载html内容:download(self, url),通过python的requests模块进行下载,将下载的数据转成json格式  

  1. def download(self, url):
  2. """下载html内容"""
  3.  
  4. print("正在下载URL: "+url)
  5. # 下载html内容
  6. response = requests.get(url, headers=self.headers)
  7.  
  8. # 转成json格式数据
  9. if response.status_code == 200:
  10. return response.json()
  11. else:
  12. # print(html.status_code)
  13. print('下载数据为空!')
  14. return ""

    

    >然后就是对已下载的内容进行分析,就是取出我们需要的数据:

  1. def parse(self, content):
  2. """分析数据"""
  3.  
  4. comments = []
  5. try:
  6. for item in content['cmts']:
  7. comment = {
  8. 'nickName': item['nickName'], # 昵称
  9. 'cityName': item['cityName'], # 城市
  10. 'content': item['content'], # 评论内容
  11. 'score': item['score'], # 评分
  12. 'startTime': item['startTime'], # 时间
  13. }
  14. comments.append(comment)
  15.  
  16. except Exception as e:
  17. print(e)
  18.  
  19. finally:
  20. return comments

    >将分析出来的数据,进行本地保存,方便后续的分析工作: 

  1. def save(self, data):
  2. """写入文件"""
  3.  
  4. print("保存数据,写入文件中...")
  5. self.save_file.write(data)

   

    > 爬虫的核心控制也即爬虫的程序启动入口,管理上面几个方法的有序执行:

  1. def start(self):
  2. """启动控制方法"""
  3.  
  4. print("爬虫开始...\r\n")
  5.  
  6. start_time = self.start_time
  7. end_time = self.end_time
  8.  
  9. num = 1
  10. while start_time > end_time:
  11. print("执行次数:", num)
  12. # 1、下载html
  13. content = self.download(self.target_url + str(start_time))
  14.  
  15. # 2、分析获取关键数据
  16. comments = ''
  17. if content != "":
  18. comments = self.parse(content)
  19.  
  20. if len(comments) <= 0:
  21. print("本次数据量为:0,退出爬取!\r\n")
  22. break
  23.  
  24. # 3、写入文件
  25. res = ''
  26. for cmt in comments:
  27. res += "%s###%s###%s###%s###%s\n" % (cmt['nickName'], cmt['cityName'], cmt['content'], cmt['score'], cmt['startTime'])
  28. self.save(res)
  29.  
  30. print("本次数据量:%s\r\n" % len(comments))
  31.  
  32. # 获取最后一条数据的时间 ,然后减去一秒
  33. start_time = datetime.strptime(comments[len(comments) - 1]['startTime'], "%Y-%m-%d %H:%M:%S") + timedelta(seconds=-1)
  34. # start_time = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
  35.  
  36. # 休眠3s
  37. num += 1
  38. time.sleep(3)
  39.  
  40. self.save_file.close()
  41. print("爬虫结束...")

    

  2.3 数据样本,最终爬取将近2万条数据,每条记录的每个数据使用 ### 进行分割:

  

三、图形化分析数据

  3.1、制作观众城市分布热点图,(pyecharts-geo):

    从图表可以轻松看出,用户主要分布地区,主要以沿海一些发达城市群为主:

    

  1. def createCharts(self):
  2. """生成图表"""
  3.  
  4. # 读取数据,格式:[{"北京", 10}, {"上海",10}]
  5. data = self.readCityNum()
  6.  
  7. # 1 热点图
  8. geo1 = Geo("《无名之辈》观众位置分布热点图", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600, background_color="#404A59")
  9.  
  10. attr1, value1 = geo1.cast(data)
  11.  
  12. geo1.add("", attr1, value1, type="heatmap", visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15, is_visualmap=True, is_piecewise=False, visual_split_number=10)
  13. geo1.render("files/无名之辈-观众位置热点图.html")
  14.  
  15. # 2 位置图
  16. geo2 = Geo("《无名之辈》观众位置分布", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600,
  17. background_color="#404A59")
  18.  
  19. attr2, value2 = geo1.cast(data)
  20. geo2.add("", attr2, value2, visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15,
  21. is_visualmap=True, is_piecewise=False, visual_split_number=10)
  22. geo2.render("files/无名之辈-观众位置图.html")
  23.  
  24. # 3、top20 柱状图
  25. data_top20 = data[:20]
  26. bar = Bar("《无名之辈》观众来源排行 TOP20", "数据来源:猫眼,Fly采集", title_pos="center", width="100%", height=600)
  27. attr, value = bar.cast(data_top20)
  28. bar.add('', attr, value, is_visualmap=True, visual_range=[0, 3500], visual_text_color="#FFF", is_more_utils=True, is_label_show=True)
  29. bar.render("files/无名之辈-观众来源top20.html")
  30.  
  31. print("图表生成完成")

  3.2、制作观众人数TOP20的柱形图,(pyecharts-bar):

    

  3.3、制作评论词云,(jieba、wordcloud):

    

    生成词云核心代码:

  1. def createWordCloud(self):
  2. """生成评论词云"""
  3. comments = self.readAllComments() #
  4.  
  5. # 使用 jieba 分词
  6. commens_split = jieba.cut(str(comments), cut_all=False)
  7. words = ''.join(commens_split)
  8.  
  9. # 给词库添加停止词
  10. stopwords = STOPWORDS.copy()
  11. stopwords.add("电影")
  12. stopwords.add("一部")
  13. stopwords.add("无名之辈")
  14. stopwords.add("一部")
  15. stopwords.add("一个")
  16. stopwords.add("有点")
  17. stopwords.add("觉得")
  18.  
  19. # 加载背景图片
  20. bg_image = plt.imread("files/2048_bg.png")
  21.  
  22. # 初始化 WordCloud
  23. wc = WordCloud(width=1200, height=600, background_color='#FFF', mask=bg_image, font_path='C:/Windows/Fonts/STFANGSO.ttf', stopwords=stopwords, max_font_size=400, random_state=50)
  24.  
  25. # 生成,显示图片
  26. wc.generate_from_text(words)
  27. plt.imshow(wc)
  28. plt.axis('off')
  29. plt.show()

    

四、修改pyecharts源码

  4.1、样本数据的城市简称与数据集完整城市名匹配不上:

    使用位置热点图时候,由于采集数据城市是一些简称,与pyecharts的已存在数据的城市名对不上, 所以对源码进行一些修改,方便匹配一些简称。

    黔南 => 黔南布依族苗族自治州

    模块自带的全国主要市县经纬度在:[python安装路径]\Lib\site-packages\pyecharts\datasets\city_coordinates.json

    由于默认情况下,一旦城市名不能完全匹配就会报异常,程序会停止,所以对源码修改如下(报错方法为 Geo.add()),其中添加注析为个人修改部分:

  1. def get_coordinate(self, name, region="中国", raise_exception=False):
  2. """
  3. Return coordinate for the city name.
  4.  
  5. :param name: City name or any custom name string.
  6. :param raise_exception: Whether to raise exception if not exist.
  7. :return: A list like [longitude, latitude] or None
  8. """
  9. if name in self._coordinates:
  10. return self._coordinates[name]
  11.  
  12. coordinate = get_coordinate(name, region=region)
  13.  
  14. # [ 20181204 添加
  15. # print(name, coordinate)
  16. if coordinate is None:
  17. # 如果字典key匹配不上,尝试进行模糊查询
  18. search_res = search_coordinates_by_region_and_keyword(region, name)
  19. # print("###",search_res)
  20. if search_res:
  21. coordinate = sorted(search_res.values())[0]
  22. # 20181204 添加 ]
  23.  
  24. if coordinate is None and raise_exception:
  25. raise ValueError("No coordinate is specified for {}".format(name))
  26.  
  27. return coordinate

   

    相应的需要对 __add()方法进行如下修改:

  

五、附录-源码

  *说明:源码为本人所写,数据来源为猫眼,全部内容仅供学习,拒绝其他用途!转发请注明出处!

  5.1 采集源码

  1. # -*- coding:utf-8 -*-
  2.  
  3. import requests
  4. from datetime import datetime, timedelta
  5. import os
  6. import time
  7. import sys
  8.  
  9. class MaoyanFilmReviewSpider:
  10. """猫眼影评爬虫"""
  11.  
  12. def __init__(self, url, end_time, filename):
  13. # 头部
  14. self.headers = {
  15. 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
  16. }
  17.  
  18. # 目标URL
  19. self.target_url = url
  20.  
  21. # 数据获取时间段,start_time:截止日期,end_time:上映时间
  22. now = datetime.now()
  23.  
  24. # 获取当天的 零点
  25. self.start_time = now + timedelta(hours=-now.hour, minutes=-now.minute, seconds=-now.second)
  26. self.start_time = self.start_time.replace(microsecond=0)
  27. self.end_time = datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
  28.  
  29. # 打开写入文件, 创建目录
  30. self.save_path = "files/"
  31. if not os.path.exists(self.save_path):
  32. os.makedirs(self.save_path)
  33. self.save_file = open(self.save_path + filename, "a", encoding="utf-8")
  34.  
  35. def download(self, url):
  36. """下载html内容"""
  37.  
  38. print("正在下载URL: "+url)
  39. # 下载html内容
  40. response = requests.get(url, headers=self.headers)
  41.  
  42. # 转成json格式数据
  43. if response.status_code == 200:
  44. return response.json()
  45. else:
  46. # print(html.status_code)
  47. print('下载数据为空!')
  48. return ""
  49.  
  50. def parse(self, content):
  51. """分析数据"""
  52.  
  53. comments = []
  54. try:
  55. for item in content['cmts']:
  56. comment = {
  57. 'nickName': item['nickName'], # 昵称
  58. 'cityName': item['cityName'], # 城市
  59. 'content': item['content'], # 评论内容
  60. 'score': item['score'], # 评分
  61. 'startTime': item['startTime'], # 时间
  62. }
  63. comments.append(comment)
  64.  
  65. except Exception as e:
  66. print(e)
  67.  
  68. finally:
  69. return comments
  70.  
  71. def save(self, data):
  72. """写入文件"""
  73.  
  74. print("保存数据,写入文件中...")
  75. self.save_file.write(data)
  76.  
  77. def start(self):
  78. """启动控制方法"""
  79.  
  80. print("爬虫开始...\r\n")
  81.  
  82. start_time = self.start_time
  83. end_time = self.end_time
  84.  
  85. num = 1
  86. while start_time > end_time:
  87. print("执行次数:", num)
  88. # 1、下载html
  89. content = self.download(self.target_url + str(start_time))
  90.  
  91. # 2、分析获取关键数据
  92. comments = ''
  93. if content != "":
  94. comments = self.parse(content)
  95.  
  96. if len(comments) <= 0:
  97. print("本次数据量为:0,退出爬取!\r\n")
  98. break
  99.  
  100. # 3、写入文件
  101. res = ''
  102. for cmt in comments:
  103. res += "%s###%s###%s###%s###%s\n" % (cmt['nickName'], cmt['cityName'], cmt['content'], cmt['score'], cmt['startTime'])
  104. self.save(res)
  105.  
  106. print("本次数据量:%s\r\n" % len(comments))
  107.  
  108. # 获取最后一条数据的时间 ,然后减去一秒
  109. start_time = datetime.strptime(comments[len(comments) - 1]['startTime'], "%Y-%m-%d %H:%M:%S") + timedelta(seconds=-1)
  110. # start_time = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
  111.  
  112. # 休眠3s
  113. num += 1
  114. time.sleep(3)
  115.  
  116. self.save_file.close()
  117. print("爬虫结束...")
  118.  
  119. if __name__ == "__main__":
  120. # 确保输入参数
  121. if len(sys.argv) != 4:
  122. print("请输入相关参数:[moveid]、[上映日期]和[保存文件名],如:xxx.py 42962 2018-11-09 text.txt")
  123. exit()
  124.  
  125. # 猫眼电影ID
  126. mid = sys.argv[1] # "1208282" # "42964"
  127. # 电影上映日期
  128. end_time = sys.argv[2] # "2018-11-16" # "2018-11-09"
  129. # 每次爬取条数
  130. offset = 15
  131. # 保存文件名
  132. filename = sys.argv[3]
  133.  
  134. spider = MaoyanFilmReviewSpider(url="http://m.maoyan.com/mmdb/comments/movie/%s.json?v=yes&offset=%d&startTime=" % (mid, offset), end_time="%s 00:00:00" % end_time, filename=filename)
  135. # spider.start()
  136.  
  137. spider.start()
  138. # t1 = "2018-11-09 23:56:23"
  139. # t2 = "2018-11-25"
  140. #
  141. # res = datetime.strptime(t1, "%Y-%m-%d %H:%M:%S") + timedelta(days=-1)
  142. # print(type(res))

MaoyanFilmReviewSpider.py

  5.2 分析制图源码

  1. # -*- coding:utf-8 -*-
  2. from pyecharts import Geo, Bar, Bar3D
  3. import jieba
  4. from wordcloud import STOPWORDS, WordCloud
  5. import matplotlib.pyplot as plt
  6.  
  7. class ACoolFishAnalysis:
  8. """无名之辈 --- 数据分析"""
  9. def __init__(self):
  10. pass
  11.  
  12. def readCityNum(self):
  13. """读取观众城市分布数量"""
  14. d = {}
  15.  
  16. with open("files/myCmts2.txt", "r", encoding="utf-8") as f:
  17. row = f.readline()
  18.  
  19. while row != "":
  20. arr = row.split('###')
  21.  
  22. # 确保每条记录长度为 5
  23. while len(arr) < 5:
  24. row += f.readline()
  25. arr = row.split('###')
  26.  
  27. # 记录每个城市的人数
  28. if arr[1] in d:
  29. d[arr[1]] += 1
  30. else:
  31. d[arr[1]] = 1 # 首次加入字典,为 1
  32.  
  33. row = f.readline()
  34.  
  35. # print(len(comments))
  36. # print(d)
  37.  
  38. # 字典 转 元组数组
  39. res = []
  40. for ks in d.keys():
  41. if ks == "":
  42. continue
  43. tmp = (ks, d[ks])
  44. res.append(tmp)
  45.  
  46. # 按地点人数降序
  47. res = sorted(res, key=lambda x: (x[1]),reverse=True)
  48. return res
  49.  
  50. def readAllComments(self):
  51. """读取所有评论"""
  52. comments = []
  53.  
  54. # 打开文件读取数据
  55. with open("files/myCmts2.txt", "r", encoding="utf-8") as f:
  56. row = f.readline()
  57.  
  58. while row != "":
  59. arr = row.split('###')
  60.  
  61. # 每天记录长度为 5
  62. while len(arr) < 5:
  63. row += f.readline()
  64. arr = row.split('###')
  65.  
  66. if len(arr) == 5:
  67. comments.append(arr[2])
  68.  
  69. # if len(comments) > 20:
  70. # break
  71. row = f.readline()
  72.  
  73. return comments
  74.  
  75. def createCharts(self):
  76. """生成图表"""
  77.  
  78. # 读取数据,格式:[{"北京", 10}, {"上海",10}]
  79. data = self.readCityNum()
  80.  
  81. # 1 热点图
  82. geo1 = Geo("《无名之辈》观众位置分布热点图", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600, background_color="#404A59")
  83.  
  84. attr1, value1 = geo1.cast(data)
  85.  
  86. geo1.add("", attr1, value1, type="heatmap", visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15, is_visualmap=True, is_piecewise=False, visual_split_number=10)
  87. geo1.render("files/无名之辈-观众位置热点图.html")
  88.  
  89. # 2 位置图
  90. geo2 = Geo("《无名之辈》观众位置分布", "数据来源:猫眼,Fly采集", title_color="#FFF", title_pos="center", width="100%", height=600,
  91. background_color="#404A59")
  92.  
  93. attr2, value2 = geo1.cast(data)
  94. geo2.add("", attr2, value2, visual_range=[0, 1000], visual_text_color="#FFF", symbol_size=15,
  95. is_visualmap=True, is_piecewise=False, visual_split_number=10)
  96. geo2.render("files/无名之辈-观众位置图.html")
  97.  
  98. # 3、top20 柱状图
  99. data_top20 = data[:20]
  100. bar = Bar("《无名之辈》观众来源排行 TOP20", "数据来源:猫眼,Fly采集", title_pos="center", width="100%", height=600)
  101. attr, value = bar.cast(data_top20)
  102. bar.add('', attr, value, is_visualmap=True, visual_range=[0, 3500], visual_text_color="#FFF", is_more_utils=True, is_label_show=True)
  103. bar.render("files/无名之辈-观众来源top20.html")
  104.  
  105. print("图表生成完成")
  106.  
  107. def createWordCloud(self):
  108. """生成评论词云"""
  109. comments = self.readAllComments() #
  110.  
  111. # 使用 jieba 分词
  112. commens_split = jieba.cut(str(comments), cut_all=False)
  113. words = ''.join(commens_split)
  114.  
  115. # 给词库添加停止词
  116. stopwords = STOPWORDS.copy()
  117. stopwords.add("电影")
  118. stopwords.add("一部")
  119. stopwords.add("无名之辈")
  120. stopwords.add("一部")
  121. stopwords.add("一个")
  122. stopwords.add("有点")
  123. stopwords.add("觉得")
  124.  
  125. # 加载背景图片
  126. bg_image = plt.imread("files/2048_bg.png")
  127.  
  128. # 初始化 WordCloud
  129. wc = WordCloud(width=1200, height=600, background_color='#FFF', mask=bg_image, font_path='C:/Windows/Fonts/STFANGSO.ttf', stopwords=stopwords, max_font_size=400, random_state=50)
  130.  
  131. # 生成,显示图片
  132. wc.generate_from_text(words)
  133. plt.imshow(wc)
  134. plt.axis('off')
  135. plt.show()
  136.  
  137. if __name__ == "__main__":
  138. demo = ACoolFishAnalysis()
  139. demo.createWordCloud()

[Python] 通过采集两万条数据,对《无名之辈》影评分析的更多相关文章

  1. [Python] 通过采集23万条数据,对《哪吒》影评分析

    一.说明 数据来源:猫眼: 运行环境:Win10/Python3.7 和 Win7/Python3.5: 分析工具:jieba.WorldCloud.pyecharts和matplotlib: 程序基 ...

  2. EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!

    一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...

  3. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据

    又是一年双十一了,不知道从什么时候开始,双十一从“光棍节”变成了“双十一购物狂欢节”,最后一个属于单身狗的节日也成功被攻陷,成为了情侣们送礼物秀恩爱的节日. 翻着安静到死寂的聊天列表,我忽然惊醒,不行 ...

  4. QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)

    如何使QTreeView快速显示1000万条数据,并且内存占用量少呢?这个问题困扰我很久,在网上找了好多相关资料,都没有找到合理的解决方案,今天在这里把我的解决方案提供给朋友们,供大家相互学习. 我开 ...

  5. 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒

    链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...

  6. Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)

    SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.例如:向数据库中插入100万条数 ...

  7. 使用hibernate在5秒内插入11万条数据,你觉得可能吗?

    需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...

  8. JavaScript如何一次性展示几万条数据

    有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案. 有的说直接循环遍历生成 ...

  9. Mvc+Dapper+存储过程分页10万条数据

    10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...

随机推荐

  1. Jenkins-slave分布式环境构建与并行WebUi自动化测试项目

    前言 之前搭建过selenium grid的分布式环境,今天我们再来搭建一次Jenkins的分布式环境:jenkins-slave Jenkins的Master-Slave分布式架构主要是为了解决Je ...

  2. vuex快速入门

    vuex是什么? vuex是一个专门为vue.js应用程序开发的状态管理模式. vuex默认的五种基本的对象: state:存储状态(可以理解为变量)可以从计算属性中返回某个状态 getters:通常 ...

  3. 【MySQL】服务无法启动(Mac)

    如图所示: 点击 Start MySQL Server 没反应-- 终端输入 mysql 命令时报错如下: ERROR 2002 (HY000): Can't connect to local MyS ...

  4. angular6组件通信

    此文章是用markdown书写,赋值全部到vscode打开即可. # Angular组件通信 ## .父组件传递数据到子组件 - `@Input`:属性绑定,父组件向子组件传递数据 ```js // ...

  5. 夯实Java基础(九)——final关键字

    1.前言 Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的. final从字面意 ...

  6. Hadoop学习(8)-scala环境配置及简单使用

    学习scala的原因主要是因为以后要学习spark. scala是运行在java虚拟机上的,它是一种面向对象和函数式编程结合的语言,并兼容java程序 相对于java更简单 安装scala前提你要保证 ...

  7. xpath定位的一些方法

  8. DevOps实施历程-v1.0

    ​    有AF项目的成功案例(DevOps实施历程-半自动化),公司新项目全部依此为模板,实现了从代码到安装的自动化流水线,为此我输出了Jenkins自动化指南.AF项目指南等文档,方便大家查阅和参 ...

  9. Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群

    一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...

  10. java并发编程(十七)----(线程池)java线程池架构和原理

    前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类.我们先从他开始分析 ...