??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品亚洲人成在线,亚洲精品人成网在线播放影院,亚洲一级毛片视频http://m.tkk7.com/tjyhy590/zh-cnSun, 11 May 2025 17:27:30 GMTSun, 11 May 2025 17:27:30 GMT60POI操作Excelhttp://m.tkk7.com/tjyhy590/archive/2020/03/20/435285.html鸉K鸉KFri, 20 Mar 2020 02:13:00 GMThttp://m.tkk7.com/tjyhy590/archive/2020/03/20/435285.htmlhttp://m.tkk7.com/tjyhy590/comments/435285.htmlhttp://m.tkk7.com/tjyhy590/archive/2020/03/20/435285.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/435285.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/435285.html org.apache.poi poi 3.17 注:(x)3.17版本是支持jdk6的最后版? 二、HSSF概况   HSSF 是Horrible SpreadSheet Format的羃写,通过HSSFQ你可以用纯Java代码来读取、写入、修改Excel文g。HSSF 取操作提供了两类APIQusermodel和eventusermodelQ即“用户模型”?#8220;事g-用户模型”? 三?POI EXCEL文档l构c? HSSFWorkbook excel文档对象 HSSFSheet excel的sheet HSSFRow excel的行 HSSFCell excel的单元格 HSSFFont excel字体 HSSFName 名称 HSSFDataFormat 日期格式 HSSFHeader sheet? HSSFFooter sheet? HSSFCellStyle cell样式 HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息? 四、EXCEL的读写操? 1、读?#8220;区域数据.xls”q储存于list集合中,“区域数据.xls”如下? public List importXLS(){ ArrayList list = new ArrayList<>(); try {      //1、获取文件输入流      InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");      //2、获取Excel工作对? HSSFWorkbook workbook = new HSSFWorkbook(inputStream);      //3、得到Excel工作表对? HSSFSheet sheetAt = workbook.getSheetAt(0); //4、@环读取表格数?      for (Row row : sheetAt) {        //首行Q即表头Q不d if (row.getRowNum() == 0) { continue; } //d当前行中单元格数据,索引?开?        String areaNum = row.getCell(0).getStringCellValue(); String province = row.getCell(1).getStringCellValue(); String city = row.getCell(2).getStringCellValue(); String district = row.getCell(3).getStringCellValue(); String postcode = row.getCell(4).getStringCellValue(); Area area = new Area(); area.setCity(city); area.setDistrict(district); area.setProvince(province);        area.setPostCode(postcode); list.add(area); }      //5、关闭流 workbook.close(); } catch (IOException e) { e.printStackTrace(); }   return list; } 2、导出数据到“区域数据.xls”文g中,面数据如下图:(x) public void exportExcel() throws IOException { Page page = areaService.pageQuery(null); List list = page.getContent(); //1.在内存中创徏一个excel文g HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); //2.创徏工作? HSSFSheet sheet = hssfWorkbook.createSheet(); //3.创徏标题? HSSFRow titlerRow = sheet.createRow(0); titlerRow.createCell(0).setCellValue("?); titlerRow.createCell(1).setCellValue("?); titlerRow.createCell(2).setCellValue("?); titlerRow.createCell(3).setCellValue("邮编"); titlerRow.createCell(4).setCellValue("?); titlerRow.createCell(5).setCellValue("城市~码"); //4.遍历数据,创徏数据? for (Area area : list) { //获取最后一行的行号 int lastRowNum = sheet.getLastRowNum(); HSSFRow dataRow = sheet.createRow(lastRowNum + 1); dataRow.createCell(0).setCellValue(area.getProvince()); dataRow.createCell(1).setCellValue(area.getCity()); dataRow.createCell(2).setCellValue(area.getDistrict()); dataRow.createCell(3).setCellValue(area.getPostcode()); dataRow.createCell(4).setCellValue(area.getShortcode()); dataRow.createCell(5).setCellValue(area.getCitycode()); } //5.创徏文g? String fileName = "区域数据l计.xls"; //6.获取输出对? HttpServletResponse response = ServletActionContext.getResponse(); ServletOutputStream outputStream = response.getOutputStream(); //7.获取mimeType ServletContext servletContext = ServletActionContext.getServletContext(); String mimeType = servletContext.getMimeType(fileName); //8.获取览器信?Ҏ(gu)件名q行重新~码 HttpServletRequest request = ServletActionContext.getRequest(); fileName = FileUtils.filenameEncoding(fileName, request); //9.讄信息? response.setContentType(mimeType); response.setHeader("Content-Disposition","attachment;filename="+fileName); //10.写出文g,关闭? hssfWorkbook.write(outputStream); hssfWorkbook.close(); } 工具c? public class FileUtils { public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { String agent = request.getHeader("User-Agent"); //获取览? if (agent.contains("Firefox")) { BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else if(agent.contains("MSIE")) { filename = URLEncoder.encode(filename, "utf-8"); } else if(agent.contains ("Safari")) { filename = new String (filename.getBytes ("utf-8"),"ISO8859-1"); } else { filename = URLEncoder.encode(filename, "utf-8"); } return filename; } } 写出xls文gQ? 五?EXCEL常用操作Ҏ(gu) 1?得到Excel常用对象 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); //得到Excel工作对? HSSFWorkbook wb = new HSSFWorkbook(fs); //得到Excel工作表对? HSSFSheet sheet = wb.getSheetAt(0); //得到Excel工作表的? HSSFRow row = sheet.getRow(i); //得到Excel工作表指定行的单元格 HSSFCell cell = row.getCell((short) j); cellStyle = cell.getCellStyle();//得到单元格样? 2、徏立Excel常用对象 HSSFWorkbook wb = new HSSFWorkbook();//创徏Excel工作对? HSSFSheet sheet = wb.createSheet("new sheet");//创徏Excel工作表对? HSSFRow row = sheet.createRow((short)0); //创徏Excel工作表的? cellStyle = wb.createCellStyle();//创徏单元格样? row.createCell((short)0).setCellStyle(cellStyle); //创徏Excel工作表指定行的单元格 row.createCell((short)0).setCellValue(1); //讄Excel工作表的? 3、设|sheet名称和单元格内容 wb.setSheetName(1, "W一张工作表",HSSFCell.ENCODING_UTF_16); cell.setEncoding((short) 1); cell.setCellValue("单元格内?); 4、取得sheet的数? wb.getNumberOfSheets() 5?Ҏ(gu)index取得sheet对象 HSSFSheet sheet = wb.getSheetAt(0); 6、取得有效的行数 int rowcount = sheet.getLastRowNum(); 7、取得一行的有效单元g? row.getLastCellNum(); 8、单元格值类型读? cell.setCellType(HSSFCell.CELL_TYPE_STRING); //讄单元gؓ(f)STRINGcd cell.getNumericCellValue();//d为数值类型的单元格内? 9、设|列宽、行? sheet.setColumnWidth((short)column,(short)width); row.setHeight((short)height); 10、添加区域,合ƈ单元? Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo ,(short)columnTo);//合ƈ从第rowFrom行columnFrom? sheet.addMergedRegion(region);// 到rowTo行columnTo的区? //得到所有区? sheet.getNumMergedRegions() 11、保存Excel文g FileOutputStream fileOut = new FileOutputStream(path); wb.write(fileOut); 12、根据单元格不同属性返回字W串数? public String getCellStringValue(HSSFCell cell) {   String cellValue = "";   switch (cell.getCellType()) {     case HSSFCell.CELL_TYPE_STRING://字符串类?         cellValue = cell.getStringCellValue();         if(cellValue.trim().equals("")||cellValue.trim().length()<=0)           cellValue=" ";         break;     case HSSFCell.CELL_TYPE_NUMERIC: //数值类?         cellValue = String.valueOf(cell.getNumericCellValue());         break;     case HSSFCell.CELL_TYPE_FORMULA: //公式         cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);         cellValue = String.valueOf(cell.getNumericCellValue());         break;     case HSSFCell.CELL_TYPE_BLANK:         cellValue=" ";         break;     case HSSFCell.CELL_TYPE_BOOLEAN:         break;     case HSSFCell.CELL_TYPE_ERROR:         break;     default:         break;   }   return cellValue; } 13、常用单元格Ҏ(gu)格式 HSSFCellStyle style = wb.createCellStyle(); style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边? style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边? style.setBorderRight(HSSFCellStyle.BORDER_THIN);//双? style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边? 14、设|字体和内容位置 HSSFFont f = wb.createFont(); f.setFontHeightInPoints((short) 11);//字号 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 style.setFont(f); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 style.setRotation(short rotation);//单元格内容的旋{的角? HSSFDataFormat df = wb.createDataFormat(); style1.setDataFormat(df.getFormat("0.00%"));//讄单元格数据格? cell.setCellFormula(string);//l单元格讑օ? style.setRotation(short rotation);//单元格内容的旋{的角? 15、插入图? //先把读进来的囄攑ֈ一个ByteArrayOutputStream中,以便产生ByteArray ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); ImageIO.write(bufferImg,"jpg",byteArrayOut); //读进一个excel模版 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); fs = new POIFSFileSystem(fos); //创徏一个工作薄 HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 16、调整工作表位置 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("format sheet"); HSSFPrintSetup ps = sheet.getPrintSetup(); sheet.setAutobreaks(true); ps.setFitHeight((short)1); ps.setFitWidth((short)1);

鸉K 2020-03-20 10:13 发表评论
]]>
python操作文g存在的问题解军_?/title><link>http://m.tkk7.com/tjyhy590/archive/2019/05/14/433783.html</link><dc:creator>鸉K</dc:creator><author>鸉K</author><pubDate>Tue, 14 May 2019 15:04:00 GMT</pubDate><guid>http://m.tkk7.com/tjyhy590/archive/2019/05/14/433783.html</guid><wfw:comment>http://m.tkk7.com/tjyhy590/comments/433783.html</wfw:comment><comments>http://m.tkk7.com/tjyhy590/archive/2019/05/14/433783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tjyhy590/comments/commentRss/433783.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tjyhy590/services/trackbacks/433783.html</trackback:ping><description><![CDATA[ 1、在学习(fn)从文件读取数据中Q写了个CZ代码Q读取不在同一个目录的file.txtQ运行后报这个Python OSError: [Errno 22] Invalid argument:错误Q? Q?Q、首先,在F盘的python_stu中新增了一个file.txtQ同时在F盘的python_stu文g目录底下新增一个file文g夹,里面有个file_reader.py来读取python_stu文g目录底下的file.txtQ代码分别如下:(x) file.txtQ? 试 试2 试3 file_reader.pyQ? with open('F:\python_stu\file.txt') as file_obj: contents = file_obj.read(); print(contents.rstrip()); Q?Q、运行后报错Q? Q?Q、出现这U错误的原因是由于读取不到这个文Ӟ看Traceback报的错误Q最后一行,很明显读取不到file.txtQ前面的F:\\python_stu没错Q后面的名称怎么变了Q还是x0cile.txt? Q?Q、解军_法,可修改上q第一行代码ؓ(f)Q? with open('F:\python_stu/file.txt') as file_obj: 或者:(x) with open('F:/python_stu/file.txt') as file_obj: 或者:(x) with open('F://python_stu//file.txt') as file_obj: 又或者:(x) with open('F:\\python_stu\\file.txt') as file_obj: q有一些我׃附上了,上面W一U方式不l一Q最好不要用Q用l一的方式,而且有时候还有注意一些{义字W,比如 \tQ\n也会(x)D报错? <img src ="http://m.tkk7.com/tjyhy590/aggbug/433783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tjyhy590/" target="_blank">鸉K</a> 2019-05-14 23:04 <a href="http://m.tkk7.com/tjyhy590/archive/2019/05/14/433783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hadoop-2.4.1学习(fn)之QJM HA的自动故障{U?/title><link>http://m.tkk7.com/tjyhy590/archive/2017/08/13/432740.html</link><dc:creator>鸉K</dc:creator><author>鸉K</author><pubDate>Sun, 13 Aug 2017 10:49:00 GMT</pubDate><guid>http://m.tkk7.com/tjyhy590/archive/2017/08/13/432740.html</guid><wfw:comment>http://m.tkk7.com/tjyhy590/comments/432740.html</wfw:comment><comments>http://m.tkk7.com/tjyhy590/archive/2017/08/13/432740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/tjyhy590/comments/commentRss/432740.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/tjyhy590/services/trackbacks/432740.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">前面学习(fn)了用命令hdfs haadmin -failover手动q行故障转移Q在该模式下Q即使现役NameNode已经失效Q系l也不会(x)自动从现役NameNode转移到待机NameNodeQ下面学?fn)如何配|部|HA自动q行故障转移。自动故障{UMؓ(f)HDFS部v增加了两个新lgQZooKeeper和ZKFailoverControllerQZKFCQ进E。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客L(fng)故障的高可用服务。HA的自动故障{UM赖于ZooKeeper的以下功能:(x)</p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><ul style="font-family: Arial; background-color: #ffffff;"><li>故障(g):(x)集群中的每个NameNode在ZooKeeper中维护了一个持久会(x)话,如果机器崩溃QZooKeeper中的?x)话终止,ZooKeeper通知另一个NameNode需要触发故障{UR?/li><li>现役NameNode选择QZooKeeper提供了一个简单的机制用于唯一的选择一个节点ؓ(f)active状态。如果目前现役NameNode崩溃Q另一个节点可能从ZooKeeper获得Ҏ(gu)的排外锁以表明它应该成ؓ(f)现役NameNode?/li></ul><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       ZKFC是自动故障{UM的另一个新lgQ是ZooKeeper的客L(fng)Q也监视和管理NameNode的状态。每个运行NameNode的主Zq行了一个ZKFCq程QZKFC负责Q?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><ul style="font-family: Arial; background-color: #ffffff;"><li>健康监测QZKFC使用一个健h查命令定期地ping与之在相同主机的NameNodeQ只要该NameNode?qing)时地回复健L(fng)态,ZKFC认ؓ(f)该节Ҏ(gu)健康的。如果该节点崩溃Q冻l或q入不健L(fng)态,健康监测器标识该节点为非健康的?/li><li>ZooKeeper?x)话理Q当本地NameNode是健L(fng)QZKFC保持一个在ZooKeeper中打开的会(x)话。如果本地NameNode处于active状态,ZKFC也保持一个特D的znode锁,该锁使用了ZooKeeper对短暂节点的支持Q如果会(x)话终止,锁节点将自动删除?/li><li>ZZooKeeper的选择Q如果本地NameNode是健L(fng)Q且ZKFC发现没有其它的节点当前持有znode锁,它将p取该锁。如果成功,则它已经赢得了选择Qƈ负责q行故障转移q程以它的本地NameNode为active。故障{U进城与前面描述的手动故障{Uȝ|首先如果必要保护之前的现役NameNodeQ然后本地NameNode转换为active状态?/li></ul><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在典型部|中QZooKeeper守护q程q行在三个或者五个节点上Q但׃ZooKeeper本n需要较?yu)的资源Q所以将ZooKeeper部v在与现役NameNode和待机NameNode相同的主ZQ还可以ZooKeeper部vCYARN的ResourceManager相同的节点上。徏议配|ZooKeeper数据存储在与HDFS元数据不同的盘上以得到最好的性能和隔L。在配置自动故障转移之前需要先停掉集群Q目前在集群q行时还不可能将手动故障转移的安装{换ؓ(f)自动故障转移的安装。接下来看看如何配置HA的自动故障{UR首先在hdfs-site.xml中添加下面的参数Q该参数的值默认ؓ(f)falseQ?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><div bg_html"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[html]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 487px; top: 1010px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;"><span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>dfs.ha.automatic-failover.enabled<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>true<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;"><span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在core-site.xml文g中添加下面的参数Q该参数的gؓ(f)ZooKeeper服务器的地址QZKFC用该地址?/p><div bg_html"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[html]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 487px; top: 1174px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;"><span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>ha.zookeeper.quorum<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span> <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;"><span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在HA或者HDFS联盟中,上面的两个参数还需要以NameServiceID为后~Q比如dfs.ha.automatic-failover.enabled.mycluster。除了上面的两个参数外,q有其它几个参数用于自动故障转移Q比如ha.zookeeper.session-timeout.msQ但对于大多数安装来说都不是必须的?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在添加了上述的配|参数后Q下一步就是在ZooKeeper中初始化要求的状态,可以在Q一NameNode中运行下面的命o(h)实现该目的,该命令将在ZooKeeper中创建znodeQ?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><div bg_java"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[java]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 485px; top: 1398px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">$ hdfs zkfc -formatZK  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在启用自动故障{Uȝ集群中,start-dfs.sh脚本在Mq行NameNode的主Z自动启动ZKFC守护q程Q一旦ZKFC启动完毕Q它们将自动选择一个NameNode为现役NameNode。如果手动管理集中的服务,需要在每台q行NameNode的主Z手动启动ZKFCQ命令ؓ(f)Q?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><div bg_java"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[java]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 485px; top: 1534px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">hadoop-daemon.sh start zkfc  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">hdfs zkfc  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       如果正在q行一个安全的集群Q可能想保存储在ZooKeeper中的信息也是安全的,q将L恶意的客L(fng)修改ZooKeeper中的元数据或者潜在地触发一个错误的故障转移。ؓ(f)了保护ZooKeeper中的信息Q首先在core-site.xml中添加下面的参数Q?/p><div bg_html"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[html]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 487px; top: 1688px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;"><span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>ha.zookeeper.auth<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>@/path/to/zk-auth.txt<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;"> <span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;"> <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>ha.zookeeper.acl<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">name</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">   <span style="color: blue; font-weight: bold;"><</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>@/path/to/zk-acl.txt<span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">value</span><span style="color: blue; font-weight: bold;">></span>  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;"> <span style="color: blue; font-weight: bold;"></</span><span style="color: blue; font-weight: bold;">property</span><span style="color: blue; font-weight: bold;">></span>  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       参数g的@字符表示参数g存在@后的盘文g中。第一个配|文件指定了ZooKeeper的认证列表,其格式与ZK CLI使用的相同,例如Qdigest:hdfs-zkfcs:mypasswordQ其中h(hun)dfs-zkfcs为ZooKeeper的用户名Qmypassword为密码。其ơ用下面的命o(h)认证生成一个ZooKeeper讉K控制列表Q?/p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><div bg_java"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[java]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 485px; top: 1976px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">$ java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-<span style="color: #c00000;">3.4</span>.<span style="color: #c00000;">2</span>.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider hdfs-zkfcs:mypassword  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;">output: hdfs-zkfcs:mypassword->hdfs-zkfcs:P/OQvnYyU/nF/mGYvB/xurX8dYs=   </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;"></p><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       拯->之后的字W串q添加digest:前缀Q然后粘贴到zk-acls.txt中,例如Qdigest:hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=:rwcda。要想ACLs生效Q需要再ơ运行zkfc –formatZK。最后可能像下面q样在ZK CLI中验证ACLsQ?/p><div bg_java"="" style="width: 936.531px; overflow-y: hidden; position: relative;"><div><div style="border-left-color: #999999;"><strong>[java]</strong> <a title="view plain" target="_blank">view plain</a><span data-mod="popu_168"> <a title="copy" target="_blank">copy</a><div style="position: absolute; left: 485px; top: 2148px; width: 27px; height: 15px; z-index: 99;"></div></span><span data-mod="popu_169"> <a title="print" target="_blank">print</a></span><a title="?" target="_blank">?</a></div></div><ol start="1"><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">[zk: localhost:<span style="color: #c00000;">2181</span>(CONNECTED) <span style="color: #c00000;">1</span>] getAcl /hadoop-ha  </li><li style="border-left-color: #999999; background-color: #f5fae2; color: #555555; line-height: 18px;"><span style="color: red;">'digest,'</span>hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=  </li><li style="border-left-color: #999999; background-color: #f5fae2; line-height: 18px;">: cdrwa  </li></ol></div><p style="margin: 0px; padding: 0px; font-family: Arial; background-color: #ffffff;">       在安装完成自动故障{UdQ或?dng)R?a title="软g试知识? target="_blank" style="color: #df3434; text-decoration: none; font-weight: bold;">试</a>一下。首先定位现役NameNodeQ可以通过讉KNameNode的web面来确定哪个NameNode是active状态的。一旦确定了处于active状态的NameNodeQ就需要在该节点上刉点故障Q比如用命令kill -9 <pid of NN>模拟JVM崩溃Q或重启L或拔掉网U来模拟不同的中断。一旦触发了自动故障转移Q另一个NameNode应该自动在几U钟内变为active状态。检到故障q触发故障{Uȝ参数ha.zookeeper.session-timeout.ms控制Q该参数Zcore-site.xml中,默认?U。如果测试不成功Q可能是配置问题Q检查ZKFC和NameNodeq程的日志以q一步诊断问题,通常错误都是很明昄?/p><img src ="http://m.tkk7.com/tjyhy590/aggbug/432740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/tjyhy590/" target="_blank">鸉K</a> 2017-08-13 18:49 <a href="http://m.tkk7.com/tjyhy590/archive/2017/08/13/432740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yarn 调度器Scheduler详解http://m.tkk7.com/tjyhy590/archive/2017/08/05/432722.html鸉K鸉KFri, 04 Aug 2017 16:35:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/08/05/432722.htmlhttp://m.tkk7.com/tjyhy590/comments/432722.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/08/05/432722.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432722.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432722.html理想情况下,我们应用对Yarn资源的请求应该立d到满I但现实情况资源往往是有限的Q特别是在一个很J忙的集,一个应用资源的hl常需要等待一D|间才能的到相应的资源。在Yarn中,负责l应用分配资源的是Scheduler。其实调度本w就是一个难题,很难扑ֈ一个完的{略可以解决所有的应用场景。ؓ(f)此,Yarn提供了多U调度器和可配置的策略供我们选择?/p>

一、调度器的选择

在Yarn中有三种调度器可以选择Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">FIFO Scheduler Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">Capacity SchedulerQ?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">FairS cheduler?/p>

FIFO Scheduler把应用按提交的顺序排成一个队列,q是一个先q先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满_再给下一个分配,以此cL?/p>

FIFO Scheduler是最单也是最Ҏ(gu)理解的调度器Q也不需要Q何配|,但它q不适用于共享集。大的应用可能会(x)占用所有集资源,q就D其它应用被阻塞。在׃n集群中,更适合采用Capacity Scheduler?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">Fair SchedulerQ这两个调度器都允许大Q务和Q务在提交的同时获得一定的pȝ资源?/p>

下面“Yarn调度器对比图”展示了这几个调度器的区别Q从图中可以看出Q在FIFO 调度器中Q小d?x)被大Q务阻塞?/p>

而对于Capacity调度器,有一个专门的队列用来q行Q务,但是为小d专门讄一个队列会(x)预先占用一定的集群资源Q这导致大d的执行时间会(x)落后于用FIFO调度器时的时间?/p>

在Fair调度器中Q我们不需要预先占用一定的pȝ资源QFair调度器会(x)为所有运行的job动态的调整pȝ资源。如下图所C,当第一个大job提交Ӟ只有q一个job在运行,此时它获得了所有集资源;当第二个Q务提交后QFair调度器会(x)分配一半资源给q个Q务,让这两个d公^的共享集资源?/p>

需要注意的是,在下图Fair调度器中Q从W二个Q务提交到获得资源?x)有一定的延迟Q因为它需要等待第一个Q务释攑֍用的Container。小d执行完成之后也会(x)释放自己占用的资源,大Q务又获得了全部的pȝ资源。最l的效果是Fair调度器即得到了高的资源利用率又能保证Q务及(qing)时完成?/p>

Yarn调度器对比图: 
技术分? src=

二、Capacity SchedulerQ容器调度器Q的配置

2.1 容器调度介绍

Capacity 调度器允许多个组l共享整个集,每个l织可以获得集群的一部分计算能力。通过为每个组l分配专门的队列Q然后再为每个队列分配一定的集群资源Q这h个集就可以通过讄多个队列的方式给多个l织提供服务了。除此之外,队列内部又可以垂直划分,q样一个组l内部的多个成员可以共享这个队列资源了Q在一个队列内部,资源的调度是采用的是先进先出(FIFO){略?/p>

通过上面那幅图,我们已经知道一个job可能使用不了整个队列的资源。然而如果这个队列中q行多个jobQ如果这个队列的资源够用Q那么就分配l这些jobQ如果这个队列的资源不够用了呢?其实Capacity调度器仍可能分配额外的资源给q个队列Q这是“Ҏ(gu)队?#8221;(queue elasticity)的概c(din)?/p>

在正常的操作中,Capacity调度器不?x)强刉放ContainerQ当一个队列资源不够用Ӟq个队列只能获得其它队列释放后的Container资源。当?dng)我们可以为队列设|一个最大资源用量Q以免这个队列过多的占用I闲资源Q导致其它队列无法用这些空闲资源,q就?#8221;Ҏ(gu)队?#8221;需要权衡的地方?/p>

2.2 容器调度的配|?/h3>

假设我们有如下层ơ的队列Q?/p>

root ├── prod └── dev     ├── eng     └── science 

下面是一个简单的Capacity调度器的配置文gQ文件名?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">capacity-scheduler.xml。在q个配置中,在root队列下面定义了两个子队列prod?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">devQ分别占40%?0%的容量。需要注意,一个队列的配置是通过属?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">yarn.sheduler.capacity.<queue-path>.<sub-property>指定的,<queue-path>代表的是队列的承树(wi)Q如root.prod队列Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;"><sub-property>一般指capacity?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">maximum-capacity?/p>

技术分? src=

我们可以看到Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev队列又被分成?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science两个相同定w的子队列?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">maximum-capacity属性被讄成了75%Q所以即?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod队列完全I闲dev也不?x)占用全部集资源,也就是说Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod队列仍有25%的可用资源用来应急。我们注意到Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science两个队列没有讄maximum-capacity属性,也就是说eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science队列中的job可能?x)用到整?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev队列的所有资源(最多ؓ(f)集群?5%Q。而类似的Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod׃没有讄maximum-capacity属性,它有可能?x)占用集全部资源?/p>

Capacity容器除了可以配置队列?qing)其定w外,我们q可以配|一个用h应用可以分配的最大资源数量、可以同时运行多应用、队列的ACL认证{?/p>

2.3 队列的设|?/h3>

关于队列的设|,q取决于我们具体的应用。比如,在MapReduce中,我们可以通过mapreduce.job.queuename属性指定要用的队列。如果队列不存在Q我们在提交d时就?x)收到错误。如果我们没有定义Q何队列,所有的应用会(x)攑֜一?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">default队列中?/p>

注意Q对于Capacity调度器,我们的队列名必须是队列树(wi)中的最后一部分Q如果我们用队列树(wi)则不?x)被识别。比如,在上面配|中Q我们?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">eng作ؓ(f)队列名是可以的,但是如果我们?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">root.dev.eng或?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev.eng是无效的?/p>

三、Fair SchedulerQ公q度器Q的配置

3.1 公^调度

Fair调度器的设计目标是ؓ(f)所有的应用分配公^的资源(对公q的定义可以通过参数来设|)(j)。在上面?em style="padding: 0px;">“Yarn调度器对比图”展示了一个队列中两个应用的公q度;当然Q公q度在也可以在多个队列间工作。D个例子,假设有两个用户A和BQ他们分别拥有一个队列。当A启动一个job而B没有dӞA?x)获得全部集资源;当B启动一个job后,A的job?x)l运行,不过一?x)儿之后两个d?x)各自获得一半的集群资源。如果此时B再启动第二个jobq且其它jobq在q行Q则它将?x)和B的第一个job׃nBq个队列的资源,也就是B的两个job?x)用于四分之一的集资源,而A的job仍然用于集群一半的资源Q结果就是资源最l在两个用户之间q等的共享。过E如下图所C:(x) 
技术分? src=

3.2 启用Fair Scheduler

调度器的使用是通过yarn-site.xml配置文g中的yarn.resourcemanager.scheduler.class参数q行配置的,默认采用Capacity Scheduler调度器。如果我们要使用Fair调度器,需要在q个参数上配|FairSchedulercȝ全限定名Q?nbsp;org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler?/p>

3.3 队列的配|?/h3>

Fair调度器的配置文g位于c\径下?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">fair-scheduler.xml文g中,q个路径可以通过yarn.scheduler.fair.allocation.file属性进行修攏V若没有q个配置文gQFair调度器采用的分配{略Q这个策略和3.1节介l的cMQ调度器?x)在用户提交W一个应用时为其自动创徏一个队列,队列的名字就是用户名Q所有的应用都会(x)被分配到相应的用户队列中?/p>

我们可以在配|文件中配置每一个队列,q且可以像Capacity 调度器一样分层次配置队列。比如,参?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">capacity-scheduler.xml来配|fair-schedulerQ?nbsp;
技术分? src=

队列的层ơ是通过嵌套<queue>元素实现的。所有的队列都是root队列的孩子,即我们没有配到<root>元素里。在q个配置中,我们?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev队列有分成了eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science两个队列?/p>

Fair调度器中的队列有一个权重属性(q个权重是对公q的定义Q,q把q个属性作为公q度的依据。在q个例子中,当调度器分配集群40:60资源l?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev时便视作公^Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science队列没有定义权重Q则?x)被q_分配。这里的权重q不是百分比Q我们把上面?0?0分别替换??Q效果也是一L(fng)。注意,对于在没有配|文件时按用戯动创建的队列Q它们仍有权重ƈ且权重gؓ(f)1?/p>

每个队列内部仍可以有不同的调度策略。队列的默认调度{略可以通过元素<defaultQueueSchedulingPolicy>q行配置Q如果没有配|,默认采用公^调度?/p>

管是Fair调度器,其仍支持在队列别进行FIFO调度。每个队列的调度{略可以被其内部?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;"><schedulingPolicy> 元素覆盖Q在上面q个例子中,prod队列p指定采用FIFOq行调度Q所以,对于提交?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">prod队列的Q务就可以按照FIFO规则序的执行了。需要注意,prod?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">dev之间的调度仍然是公^调度Q同?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">eng?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">science也是公^调度?/p>

管上面的配|中没有展示Q每个队列仍可配|最大、最资源占用数和最大可q行的应用的数量?/p>

3.4 队列的设|?/h3>

Fair调度器采用了一套基于规则的pȝ来确定应用应该放到哪个队列。在上面的例子中Q?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;"><queuePlacementPolicy> 元素定义了一个规则列表,其中的每个规则会(x)被逐个试直到匚w成功。例如,上例W一个规?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">specifiedQ则?x)把应用攑ֈ它指定的队列中,若这个应用没有指定队列名或队列名不存在,则说明不匚wq个规则Q然后尝试下一个规则?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">primaryGroup规则?x)尝试把应用攑֜?em style="padding: 0px;">用户所在的Unixl名命名的队列中Q如果没有这个队列,不创建队列{而尝试下一个规则。当前面所有规则不满Ӟ则触?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">default规则Q把应用攑֜dev.eng队列中?/p>

当然Q我们可以不配置queuePlacementPolicy规则Q调度器则默认采用如下规则:(x)

<queuePlacementPolicy> <rule name="specified" /> <rule name="user" /> </queuePlacementPolicy> 

上面规则可以归结成一句话Q除非队列被准确的定义,否则?x)以用户名?f)队列名创建队列?/p>

q有一个简单的配置{略可以使得所有的应用攑օ同一个队列(defaultQ,q样可以让所有应用之间^{共享集而不是在用户之间。这个配|的定义如下Q?/p>

<queuePlacementPolicy> <rule name="default" /> </queuePlacementPolicy> 

实现上面功能我们q可以不使用配置文gQ直接设|?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">yarn.scheduler.fair.user-as-default-queue=falseQ这样应用便?x)被攑օdefault 队列Q而不是各个用户名队列。另外,我们q可以设|?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">yarn.scheduler.fair.allow-undeclared-pools=falseQ这L(fng)户就无法创徏队列了?/p>

3.5 抢占QPreemptionQ?/h3>

当一个job提交C个繁忙集中的空队列Ӟjobq不?x)马上执行,而是d直到正在q行的job释放pȝ资源。ؓ(f)了提交job的执行时间更具预性(可以讄{待的超时时_(d)(j)QFair调度器支持抢占?/p>

抢占是允许调度器杀掉占用超q其应占份额资源队列的containersQ这些containers资源便可被分配到应该享有q些份额资源的队列中。需要注意抢占会(x)降低集群的执行效率,因ؓ(f)被终止的containers需要被重新执行?/p>

可以通过讄一个全局的参?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">yarn.scheduler.fair.preemption=true来启用抢占功能。此外,q有两个参数用来控制抢占的过期时_(d)q两个参数默认没有配|,需要至配|一个来允许抢占ContainerQ:(x)

- minimum share preemption timeout - fair share preemption timeout 

如果队列?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;">minimum share preemption timeout指定的时间内未获得最的资源保障Q调度器׃(x)抢占containers。我们可以通过配置文g中的元素<defaultMinSharePreemptionTimeout>为所有队列配|这个超时时_(d)我们q可以在<queue>元素内配|?code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;"><minSharePreemptionTimeout>元素来ؓ(f)某个队列指定时旉?/p>

与之cMQ如果队列在fair share preemption timeout指定旉内未获得q等的资源的一半(q个比例可以配置Q,调度器则?x)进行抢占containers。这个超时时间可以通过元素<defaultFairSharePreemptionTimeout>和元素元素<fairSharePreemptionTimeout>分别配置所有队列和某个队列的超时时间。上面提到的比例可以通过<defaultFairSharePreemptionThreshold>(配置所有队??code style="font-family: Arial, Helvetica, sans-serif; padding: 0px;"><fairSharePreemptionThreshold>(配置某个队列)q行配置Q默认是0.5?/p>



鸉K 2017-08-05 00:35 发表评论
]]>hive大数据倾斜ȝhttp://m.tkk7.com/tjyhy590/archive/2017/07/31/432707.html鸉K鸉KMon, 31 Jul 2017 11:57:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/31/432707.htmlhttp://m.tkk7.com/tjyhy590/comments/432707.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/31/432707.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432707.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432707.html在做Shuffle阶段的优化过E中Q遇C数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因ؓ(f)在Job完成后的所得到的Counters是整个Job的dQ优化是Zq些Counters得出的^均|而由于数据倾斜的原因造成map处理数据量的差异q大Q得这些^均D代表的h(hun)值降低。Hive的执行是分阶D늚Qmap处理数据量的差异取决于上一个stage的reduce输出Q所以如何将数据均匀的分配到各个reduce中,是解决数据倾斜的根本所在。规遉K误来更好的运行比解决错误更高效。在查看了一些资料后Qȝ如下?/p>

1数据倾斜的原?/strong>

1.1操作Q?/strong>

关键?/strong>

情Ş

后果

Join

其中一个表较小Q?/p>

但是key集中

分发到某一个或几个Reduce上的数据q高于^均?/p>

大表与大表,但是分桶的判断字D?值或ID?/p>

q些I值都׃个reduce处理Q灰常慢

group by

group by l度q小Q?/p>

某值的数量q多

处理某值的reduce灰常耗时

Count Distinct

某特DD?/p>

处理此特D值的reduce耗时

1.2原因Q?/strong>

1)、key分布不均匀

2)、业务数据本w的Ҏ(gu)?/p>

3)、徏表时考虑不周

4)、某些SQL语句本n有数据倾斜

 

1.3表现Q?/strong>

dq度长时间维持在99%Q或100%Q,查看d监控面Q发现只有少量(1个或几个Qreduce子Q务未完成。因为其处理的数据量和其他reduce差异q大?/p>

单一reduce的记录数与^均记录数差异q大Q通常可能辑ֈ3倍甚x多?最长时长远大于q_旉?/p>

 

2数据倾斜的解x?/strong>

2.1参数调节Q?/strong>

hive.map.aggr=true

Map 端部分聚合,相当于Combiner

hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项讑֮?trueQ生成的查询计划?x)有两?MR Job。第一?MR Job 中,Map 的输出结果集合会(x)随机分布?Reduce 中,每个 Reduce 做部分聚合操作,q输出结果,q样处理的结果是相同?Group By Key 有可能被分发C同的 Reduce 中,从而达到负载均衡的目的Q第二个 MR Job 再根据预处理的数据结果按?Group By Key 分布?Reduce 中(q个q程可以保证相同?Group By Key 被分布到同一?Reduce 中)(j)Q最后完成最l的聚合操作?/p>

 

2.2 SQL语句调节Q?/strong>

如何JoinQ?/strong>

关于驱动表的选取Q选用join key分布最均匀的表作ؓ(f)驱动?/p>

做好列裁剪和filter操作Q以辑ֈ两表做join的时候,数据量相对变的效果?/p>

大小?/strong>JoinQ?/strong>

使用map join让小的维度表Q?000条以下的记录条数Q?先进内存。在map端完成reduce.

大表Join大表Q?/strong>

把空值的key变成一个字W串加上随机敎ͼ把倾斜的数据分C同的reduce上,׃null值关联不上,处理后ƈ不媄(jing)响最l结果?/p>

count distinct大量相同Ҏ(gu)?/strong>

count distinctӞgؓ(f)I的情况单独处理Q如果是计算count distinctQ可以不用处理,直接qo(h)Q在最后结果中?。如果还有其他计,需要进行group byQ可以先gؓ(f)I的记录单独处理Q再和其他计结果进行union?/p>

group byl度q小Q?/strong>

采用sum() group by的方式来替换count(distinct)完成计算?/p>

Ҏ(gu)情况Ҏ(gu)处理Q?/strong>

在业务逻辑优化效果的不大情况下Q有些时候是可以倾斜的数据单独拿出来处理。最后union回去?/p>

 

3典型的业务场?/strong>

3.1Ig生的数据倾斜

场景Q?/strong>如日志中Q常?x)有信息丢失的问题,比如日志中?user_idQ如果取其中?user_id ?用户表中的user_id 兌Q会(x)到数据倾斜的问题?/p>

解决Ҏ(gu)1Q?/strong> user_id为空的不参与兌Q红色字体ؓ(f)修改后)(j)

复制代码
select * from log a   join users b   on a.user_id is not null   and a.user_id = b.user_id union all select * from log a   where a.user_id is null;
复制代码

 

解决Ҏ(gu)Q?/strong>赋与I值分新的key?/p>

select *   from log a   left outer join users b   on case when a.user_id is null then concat(‘hive’,rand() ) else a.user_id end = b.user_id;

 

l论Q?/strong>Ҏ(gu)2比方?效率更好Q不但io了Q而且作业C了。解x??logd两次Qjobs?。解x? job数是1 。这个优化适合无效 id (比如 -99 , ’’, null {? 产生的倾斜问题。把I值的 key 变成一个字W串加上随机敎ͼp把倾斜的数据分C同的reduce?,解决数据倾斜问题?/p>

 

3.2不同数据cd兌产生数据倾斜

场景Q?/strong>用户表中user_id字段为intQlog表中user_id字段既有stringcd也有intcd。当按照user_idq行两个表的Join操作Ӟ默认的Hash操作?x)按int型的id来进行分配,q样?x)导致所有stringcdid的记录都分配C个Reducer中?/p>

解决Ҏ(gu)Q?/strong>把数字类型{换成字符串类?/p>

select * from users a   left outer join logs b   on a.usr_id = cast(b.user_id as string)

 

3.3表不小不大Q怎么?map join 解决倾斜问题

使用 map join 解决表(记录数少)兌大表的数据倾斜问题Q这个方法用的频率非常高,但如果小表很大,大到map join?x)出现bug或异常,q时需要特别的处理?nbsp;以下例子:

select * from log a   left outer join users b   on a.user_id = b.user_id;

 

users 表有 600w+ 的记录,?users 分发到所有的 map 上也是个不小的开销Q而且 map join 不支持这么大的小表。如果用普通的 joinQ又?x)碰到数据倾斜的问题?/p>

解决Ҏ(gu)Q?/strong>

select /*+mapjoin(x)*/* from log a   
left outer join (
select /*+mapjoin(c)*/d.* from (
select distinct user_id from log ) c join users d
on c.user_id = d.user_id ) x
on a.user_id = b.user_id;

假如Qlog里user_id有上百万个,q就又回到原来map join问题。所q,每日的会(x)员uv不会(x)太多Q有交易的会(x)员不?x)太多,有点ȝ会(x)员不?x)太多Q有佣金的会(x)员不?x)太多等{。所以这个方法能解决很多场景下的数据倾斜问题?/p>

使map的输出数据更均匀的分布到reduce中去Q是我们的最l目标。由于Hash法的局限性,按key Hash?x)或多或的造成数据倾斜。大量经验表明数据倾斜的原因是Zؓ(f)的徏表疏忽或业务逻辑可以规避的。在此给为通用的步骤:(x)

1、采样log表,哪些user_id比较倾斜Q得C个结果表tmp1。由于对计算框架来说Q所有的数据q来Q他都是不知道数据分布情늚Q所以采hq不可少的?/p>

2、数据的分布W合C会(x)学统计规则,贫富不均。倾斜的key不会(x)太多Q就像一个社?x)的富h不多Q奇特的Z多一栗所以tmp1记录C(x)很少。把tmp1和users做map join生成tmp2,把tmp2ddistribute file cache。这是一个mapq程?/p>

3、mapdusers和logQ假如记录来自log,则检查user_id是否在tmp2里,如果是,输出到本地文件a,否则生成<user_id,value>的key,value对,假如记录来自member,生成<user_id,value>的key,value对,q入reduce阶段?/p>

4、最l把a文gQ把Stage3 reduce阶段输出的文件合qv写到hdfs?/p>

 

如果认业务需要这样倾斜的逻辑Q考虑以下的优化方案:(x)

1、对于joinQ在判断表不大?G的情况下Q用map join

2、对于group by或distinctQ设?nbsp;hive.groupby.skewindata=true

3、尽量用上q的SQL语句调节q行优化



鸉K 2017-07-31 19:57 发表评论
]]>
Hive性能调优http://m.tkk7.com/tjyhy590/archive/2017/07/30/432702.html鸉K鸉KSun, 30 Jul 2017 05:52:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/30/432702.htmlhttp://m.tkk7.com/tjyhy590/comments/432702.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/30/432702.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432702.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432702.htmlHive的一般学?fn)者和培训者在谈性能优化的时候一般都?x)从语法和参数这些雕虫小技的角度谈优化,而不?x)革命性的优化Hive的性能,产生q种现象的原因有:
1,历史原因和思维定势:大家学习(fn)SQL的时候一般都是就单机DB,q个时候你的性能优化技巧确实主要是SQL语法和参数调?
2,Hive的核心的性能问题往往是生在过规模数据?例如?00亿条U别的数据集,以及(qing)每天处理上千上万个Hive作业的情况下产生?

上面的第二点是我们现在Hive性能调优部分要彻底解决的内容;

要从Ҏ(gu)上解军_显著的解军_际企业中Hive真正的性能优化问题,必须考虑到底什么是Hive性能的限?我们按照优先U来?
W一重要的是:战略性架?/span>
 解决量数据下大量Jobq于频繁的IO问题,而这个问题实质上涉及(qing)了架构方面的分表 数据复用 以及(qing)分区表等调优的方?
    补充:1,量的数据中有些数据是高频用的数据,而有些是很少使用?如果能够分离成ؓ(f)不同的表,?x)极大的提升效?很多的作业可能会(x)有共同点,抽离出来先进行计ƈ保留计算l果,后面的作业都可以复用;同时,底层的基功能
也可以先计算,在上层应用的时候直接拿数据l果,而不是每ơ都重复计算;
    2,合理从用静态分和动态分,可以避免数据全局扫描?qing)计资源更合理的利?

    3,数据倾斜的一站式解决Ҏ(gu);
W二重要的是:引擎和物理层?很多内容都是普通Hive使用q不知道?
    从Hive语法和Job内部的角度去q行优化,q要求MapReduce以及(qing)Hive如何被翻译成为MapReduce要非常精?

W三重要的是:一些关键的参数;



归根到底,Hive的性能优化主要考虑的是如何最大化和最有效的用CPU Memory IO;



Hive背后的Mapper调优:
1,Mapper数过??x)生大量小文g,׃Mapper是基于虚拟机?q多的Mapper创徏和初始化?qing)关闭虚拟机都?x)消耗大量的g资源;
    Mapper数太?q发度过?Job执行旉q长,无法充分利用分布式硬件资?
2,Mapper数据׃么决定呢?
    输入文g数目;
    输入文g的大?
    配置参数;
 默认情况?例如一个文?00M,BLock大小?28M,那么Mapper数目是7?6个Mapper处理的数据是 128M, 1个Mapper处理的数据是32M;再例?一个目录下有三个文件分别大问5M 10M 150M
 此时?x)?个Mapper,处理的数据分别是5M 10M 128M 22M;
  
 减少Mapper的个?p合ƈ文?q种文件有可能是直接来自于数据源的文?也可能是Reducer产生的小文g;
    set hive.input.format=org.apache.Hadoop.hive.ql.io.CombineHiveInputFormat;
    set hive.merge.mapFiles=true;
    set hive.merge.mapredFiles=true;
    set hive.merge.size.per.task=256000000
    set mapred.max.split.size=256000000
    set mapred.min.split.size.per.node=128000000
    
    
 增加Mapper的个?一般是通过控制Hive SQL中上一个Job的Reducer个数来控制的,例如在Join操作的时候会(x)把多个表分解为多个Job;


 set mapred.map.tasks=2;
 set hive.merge.mapFiles=true;
 set hive.merge.mapredFiles=true;
 set hive.merge.size.per.task=256000000

 例如我们??00M的文?按照上面的配|会(x)产生10个Mapper,5个Mapper处理的都?56M的数?另外5个Mapper处理的都?4M的数?问题?大的Mapper?x)数据倾斜
如何解决,讄set mapred.map.tasks=6,此时Ҏ(gu)MapRed的运行机??x)划?个Mapper,每个Mapper的处理数据的大小?50M, min(1500M/6, 256M) =250M

Hive背后的Reducer调优:
1,Reducer数目q大的话,?x)生很多小文g,每个Reducer都会(x)产生一个文?如果q些文件是下一个JOB的输?则会(x)需要对文件进行合q?同样启动 初始化和销毁Reducer的虚拟机也需要消耗大量的g;
  Reducer数据q小的话,Reduce的时间会(x)比较?也可能会(x)出现数据倾斜;
2,如何控制Reducer的个数呢?
  set hive.exec.reducers.byte.per.reducer=1G
  set hive.exec.reducers.max=999
  Reducer个数=min(999, Reducer的数据输入总量/1G);

  set mapred.reduce.tasks = 10, 默认?; 如果说当前的Reducer的结果很?且被接下来多个Job使用其结?我们该如何设|参数呢?一般都需要调大该参数;

  什么情况下只有一个Reducer?如果不进行Group by但却需要汇?或者说Order by,当然如果最后Reducer的数据小于默认的1G的话,也会(x)只有一个Reducer;


1,Hive在分布式q行的时候最x的是数据倾斜,q是׃分布式系l的Ҏ(gu)决定的,因ؓ(f)分布式系l之所以很快是׃作业q_分配l了不同的节?不同节点同心协力,从而达到更快处理完作业的目?
Z说明一?处理数据倾斜的能力是hadoop?a title="Apache Spark知识? target="_blank" style="text-decoration: none; color: #df3434; font-weight: bold;">Spark工程师最核心的竞争力之一;

2,Hive中数据倾斜的原?
    数据在分布式节点上分布不q;
    join时某些key可能特别?
    groupBy的时候某个Key可能特别?
    count(distinct)有可能出现数据倾斜,因ؓ(f)其内部首先会(x)q行groupBy操作;


3,join,我们希望join时候key是分?如果一个key的数据量特别?有可能会(x)出现数据倾斜和OOM,一个核心点?表join大表,在reduce阶段左侧的小表会(x)加蝲q内?减少OOM的风?
4,大表join大表的情?数据倾斜,例如null?解决办法一般是要打散null?例如说用随机数{?如果数据倾斜比较严重,采用q种方式可以提升臛_一倍的速度;
5,mapJoin:表join(?大表的时?可以采用mapJoin的方式把表全部加蝲到Mapper端的内存?*+MAPJOIN(table_name)*/;
6,表join(?大表的时?是否?x)自动进行mapJoin,惌行mapJoin,需要设|?set hive.auto.convert.join=true,Hive在进行join的时候会(x)判断左表的大来军_是否q行mapJoin:
    set hive.mapjoin.smalltable.filesize=128000000;
    set hive.mapjoin.cache.numrows=100000;
    上述参数可以Ҏ(gu)实际的硬件机器的内存q行调整,Ҏ(gu)能有至关重要的影响,因ؓ(f)没有了Shuffle;
  对于mapJoin我们能够使用Mapper端JVM中多大的内存?
    set hive.mapjoin.followby.gby.localtask.max.momery.usage = 0.8
    set hive.mapjoin.localtask.max.memory.uage=0.9
7,groupBy,我们可以讄在Mapper端进行部分聚?最后在Reducer端进行全局聚合
    set hive.map.aggr=true;
    set hive.groupby.mapaggr.checkinterval=100000

    set hive.groupby.skewindata = true 内部?x)生两个Job,W一个Job?x)通过自己?a title="法与数据结构知识库" target="_blank" style="text-decoration: none; color: #df3434; font-weight: bold;">法打散倾斜的Keyq进行聚合操作且保留l果,W二个Job?x)完成全部的groupBy操作,?x)生Mapper-Reducer-Reducer的结?br data-filtered="filtered" />
8, count(distinct),如果某个字段特别?Ҏ(gu)产生数据倾斜,解决思\:
    在查询语句中例如对nullq行qo(h),在结果中?


9, W卡?dng)?join时候没有on条g,或者on条g无效,q个时候会(x)使用Reducerq行W卡?dng)积的操?



鸉K 2017-07-30 13:52 发表评论
]]>
HIVE和HBASE区别http://m.tkk7.com/tjyhy590/archive/2017/07/21/432677.html鸉K鸉KFri, 21 Jul 2017 03:44:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/21/432677.htmlhttp://m.tkk7.com/tjyhy590/comments/432677.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/21/432677.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432677.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432677.html1. 两者分别是什么?  

 Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一U类SQL语言Q这U语a最l被转化为Map/Reduce. 虽然Hive提供了SQL查询功能Q但是Hive不能够进行交互查?-因ؓ(f)它只能够在Haoop上批量的执行Hadoop?/p>

    Apache HBase是一UKey/ValuepȝQ它q行在HDFS之上。和Hive不一PHbase的能够在它的数据库上实时q行Q而不是运行MapReduced。Hive被分Zؓ(f)表格Q表格又被进一步分割ؓ(f)列簇。列必M用schema定义Q列将某一cd列集合v来(列不要求schema定义Q。例如,“message”列簇可能包含Q?#8220;to”, ”from” “date”, “subject”, ?#8221;body”. 每一?key/value对在Hbase中被定义Z个cellQ每一个key由row-keyQ列、列和时间戳。在Hbase中,行是key/value映射的集合,q个映射通过row-key来唯一标识。Hbase利用Hadoop的基设施Q可以利用通用的设备进行水q的扩展?/p>

2. 两者的特点

  Hive帮助熟?zhn)SQL的hq行MapReduced。因为它是JDBC兼容的,同时Q它也能够和现存的SQL工具整合在一赗运行Hive查询?x)花费很长时_(d)因ؓ(f)它会(x)默认遍历表中所有的数据。虽然有q样的缺点,一ơ遍历的数据量可以通过Hive的分区机制来控制。分区允许在数据集上q行qo(h)查询Q这些数据集存储在不同的文g夹内Q查询的时候只遍历指定文g夹(分区Q中的数据。这U机制可以用来,例如Q只处理在某一个时间范围内的文Ӟ只要q些文g名中包括了时间格式?/p>

    HBase通过存储key/value来工作。它支持四种主要的操作:(x)增加或者更新行Q查看一个范围内的cellQ获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions可以释攑ևI间Q。虽然HBase包括表格Q但是schema仅仅被表格和列簇所要求Q列不需要schema。Hbase的表格包括增?计数功能?/p>

3. 限制

  Hive目前不支持更新操作。另外,׃hive在hadoop上运行批量操作,它需要花费很长的旉Q通常是几分钟到几个小时才可以获取到查询的l果。Hive必须提供预先定义好的schema文件和目录映射到列Qƈ且Hive与ACID不兼宏V?/p>

    HBase查询是通过特定的语a来编写的Q这U语a需要重新学?fn)。类SQL的功能可以通过Apache Phonenix实现Q但q是以必L供schemaZL(fng)。另外,Hbase也ƈ不是兼容所有的ACIDҎ(gu),虽然它支持某些特性。最后但不是最重要?-Zq行HbaseQ?font style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" color="#0000ff">Zookeeper是必ȝQzookeeper是一个用来进行分布式协调的服务,q些服务包括配置服务Q维护元信息和命名空间服务?/p>

4. 应用场景

    Hive适合用来对一D|间内的数据进行分析查询,例如Q用来计趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以q回l果?/p>

    Hbase非常适合用来q行大数据的实时查询。Facebook用Hbaseq行消息和实时的分析。它也可以用来统计Facebook的连接数?/p>

5. ȝ

    Hive和Hbase是两U基于Hadoop的不同技?-Hive是一U类SQL的引擎,q且q行MapReducedQHbase是一U在Hadoop之上的NoSQL 的Key/vale数据库。当?dng)q两U工h可以同时使用的。就像用Google来搜索,用FaceBookq行C交一PHive可以用来q行l计查询QHBase可以用来q行实时查询Q数据也可以从Hive写到HbaseQ设|再从Hbase写回Hive?/p>

鸉K 2017-07-21 11:44 发表评论
]]>
Hive分布式安装配|Hive+Mysqlhttp://m.tkk7.com/tjyhy590/archive/2017/07/20/432675.html鸉K鸉KThu, 20 Jul 2017 07:20:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/20/432675.htmlhttp://m.tkk7.com/tjyhy590/comments/432675.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/20/432675.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432675.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432675.html阅读全文

鸉K 2017-07-20 15:20 发表评论
]]>
TCP/UDP区别以及(qing)UDP如何实现可靠传输http://m.tkk7.com/tjyhy590/archive/2017/07/19/432672.html鸉K鸉KWed, 19 Jul 2017 14:25:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/19/432672.htmlhttp://m.tkk7.com/tjyhy590/comments/432672.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/19/432672.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432672.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432672.htmlTCP和UDP是OSI模型中的q输层中的协议。TCP提供可靠的通信传输Q而UDP则常被用于让q播和细节控制交l应用的通信传输?/span>


UDP(User Datagram Protocol)

        UDP不提供复杂的控制机制Q利用IP提供面向无连接的通信服务。ƈ且它是将应用E序发来的数据在收到的那一刻,立刻按照原样发送到|络上的一U机制?/span>

        即是出现网l拥늚情况下,UDP也无法进行流量控制等避免|络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚臛_出现包的到达序乱掉时也没有U正的功能。如果需要这些细节控Ӟ那么不得不交l由采用UDO的应用程序去处理。换句话_(d)UDP部分控制{Ud应用E序d理,自己却只提供作ؓ(f)传输层协议的最基本功能。UDP有点cM于用戯什么听什么的机制Q但是需要用户充分考虑好上层协议类型ƈ制作相应的应用程序?/span>


TCP(Transmission Control Protocol)

        TCP充分实现爱呢了数据传输时各种控制功能Q可以进行丢包的重发控制Q还可以Ҏ(gu)序ؕ掉的分包q行序控制。而这些在UDP中都没有。此外,TCP作ؓ(f)一U面向有q接的协议,只有在确认通信对端存在时才?x)发送数据,从而可以控刉信量的浪贏V?/span>

        TCP通过(g)验和、序列号、确认应{、重发控制、连接管理以?qing)窗口控制等机制实现可靠性传输。此处不一一叙述?/span>


TCP与UDP如何加以区分使用Q?/span>

        TCP用于在传输层有必要实现可靠性传输的情况。由于它是面向有q接q具备顺序控制、重发控制等机制的。所以它可以为应用提供可靠传输?/span>

        另一斚wQUDP主要用于那些寚w速传输和实时性有较高要求的通信或广播通信。D一个IP?sh)话q行通话的例子。如果用TCPQ数据在传送途中如果丢失?x)被重发Q但是这h法流畅地传输通话人的声音Q会(x)D无法q行正常交流。而采用UDPQ它不会(x)q行重发处理。从而也׃?x)有声音大幅度gq到辄问题。即使有部分数据丢失Q也只是影响某一部分的通话。此外,在多播与q播通信中也使用UDP而不是UDP。RIP、DHCP{基于广播的协议也要依赖于UDP?/span>


TCP与UDP区别ȝQ?/strong>

1、TCP面向q接Q如打电(sh)话要先拨号徏立连接)(j);UDP是无q接的,卛_送数据之前不需要徏立连?/span>

2、TCP提供可靠的服务。也是_(d)通过TCPq接传送的数据Q无差错Q不丢失Q不重复Q且按序到达;UDP最大努力交付,即不保证可靠交付
3、TCP面向字节,实际上是TCP把数据看成一q串无结构的字节?UDP是面向报文的
UDP没有拥塞控制Q因此网l出现拥塞不?x)源主机的发送速率降低Q对实时应用很有用,如IP?sh)话Q实时视频会(x)议等Q?br />4、每一条TCPq接只能是点到点?UDP支持一对一Q一对多Q多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销,只有8个字?br />

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信?/span>


UDP如何实现可靠传输

׃在传输层UDP已经是不可靠的连接,那就要在应用层自己实C些保障可靠传输的机制

单来Ԍ要用UDP来构建可靠的面向q接的数据传输,p实现cM于TCP协议?/span>

时重传Q定时器Q?/span>

有序接受 Q添加包序号Q?/span>

应答认 QSeq/Ack应答机制Q?/span>

滑动H口量控制{机?Q滑动窗口协议)(j)

{于说要在传输层的上一层(或者直接在应用层)(j)实现TCP协议的可靠数据传输机Ӟ比如使用UDP数据?序列PUDP数据?旉戳等Ҏ(gu)?/span>

目前已经有一些实现UDP可靠传输的机Ӟ比如

UDTQ?span style="font-size: 14px; font-family: arial, 宋体, sans-serif; line-height: 25px">UDP-based Data Transfer ProtocolQ?/span>

ZUDP的数据传输协议(UDP-based Data Transfer ProtocolQ简UUDTQ是一U互联网数据传输协议。UDT的主要目的是支持高速广域网上的量数据传输Q而互联网上的标准数据传输协议TCP在高带宽长距ȝl上性能很差?֐思义Q?/span>UDTZUDP之上Qƈ引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输?/span> ׃UDT完全在UDP上实玎ͼ它也可以应用在除了高速数据传输之外的其它应用领域Q例如点到点技术(P2PQ,防火墙穿透,多媒体数据传输等{?/span>


鸉K 2017-07-19 22:25 发表评论
]]>
一文读懂分布式数据库Hbasehttp://m.tkk7.com/tjyhy590/archive/2017/07/19/432671.html鸉K鸉KWed, 19 Jul 2017 14:24:00 GMThttp://m.tkk7.com/tjyhy590/archive/2017/07/19/432671.htmlhttp://m.tkk7.com/tjyhy590/comments/432671.htmlhttp://m.tkk7.com/tjyhy590/archive/2017/07/19/432671.html#Feedback0http://m.tkk7.com/tjyhy590/comments/commentRss/432671.htmlhttp://m.tkk7.com/tjyhy590/services/trackbacks/432671.html一?/p>

1、什么是Hbase?/p>

?/span>一个高可靠性、高性能、列存储、可伸羃、实时读写的分布?a title="MySQL知识? class="replace_word" style="text-decoration: none; font-weight: bold; color: rgb(223,52,52)" target="_blank">数据?/a>pȝ?/span>

适合于存储非l构?/span>数据Q基于列的而不是基于行的模?/span>

如图Q?a title="Hadoop知识? class="replace_word" style="text-decoration: none; font-weight: bold; color: rgb(223,52,52)" target="_blank">Hadoop生态中hbase与其他部分的关系?br />


2、关pL据库已经行很多q_(d)q且hadoop已经有了HDFS和MapReduceQؓ(f)什么需要HBase?

Hadoop可以很好地解军_规模数据的离U批量处理问题,但是Q受限于HadoopMapReduce~程框架的高延迟数据处理机制Q?/span>Hadoop无法满大规模数据实时处理应用的需?/span>
HDFS面向扚w讉K模式Q不是随问模?/span>
传统的通用关系型数据库无法应对在数据规模剧增时D的系l扩展性和性能问题Q分库分表也不能很好解决Q?/span>
传统关系数据库在数据l构变化时一般需要停机维护;I列费存储I间
因此Q业界出C一c面向半l构化数据存储和处理的高可扩展、低写入/查询延迟的系l,例如Q键值数据库、文档数据库和列族数据库Q如BigTable?/span>HBase{)(j)
HBase已经成功应用于互联网服务领域和传l行业的众多在线式数据分析处理系l中
3?/span>HBase与传l的关系数据库的区别

Q?/span>1Q数据类型:(x)关系数据库采用关pL型,h丰富的数据类型和存储方式Q?/span>HBase则采用了更加单的数据模型Q它把数据存储ؓ(f)未经解释的字W串
Q?/span>2Q数据操作:(x)关系数据库中包含了丰富的操作Q其中会(x)涉及(qing)复杂的多表连接?/span>HBase操作则不存在复杂的表与表之间的关p,只有单的插入、查询、删除、清I等Q因?/span>HBase在设计上避免了复杂的表和表之间的关p?br />Q?/span>3Q存储模式:(x)关系数据库是Z行模式存储的?/span>HBase是基于列存储的,每个列族都由几个文g保存Q不同列族的文g是分ȝ
Q?/span>4Q数据烦(ch)引:(x)关系数据库通常可以针对不同列构建复杂的多个索引Q以提高数据讉K性能?/span>HBase只有一个烦(ch)?#8212;—行键Q通过巧妙的设计,HBase中的所有访问方法,或者通过行键讉KQ或者通过行键扫描Q从而得整个系l不?x)慢下?/span>
Q?/span>5Q数据维护:(x)在关pL据库中,更新操作?x)用最新的当前值去替换记录中原来的旧|旧D覆盖后就不会(x)存在。?span style="color: rgb(255,0,0)">?/span>HBase中执行更新操作时Qƈ不会(x)删除数据旧的版本Q而是生成一个新的版本,旧有的版本仍然保?/span>
Q?/span>6Q可伸羃性:(x)关系数据库很隑֮现横向扩展,U向扩展的空间也比较有限。相反,HBase和BigTableq些分布式数据库是Z实现灉|的水qx展而开发的Q能够轻易地通过在集中增加或者减硬件数量来实现性能的׾~?/span>
二、Hbase数据模型

1、模型概q?/p>

HBase是一个稀疏、多l度、排序的映射表,q张表的索引是行键、列族、列限定W和旉?/span>
每个值是一个未l解释的字符Ԍ没有数据cd
用户在表中存储数据,每一行都有一个可排序的行键和L多的?/span>
表在水^方向׃个或者多个列族组成,一个列族中可以包含L多个列,同一个列族里面的数据存储在一?/span>
列族支持动态扩展,可以很轻村֜d一个列族或列,无需预先定义列的数量以及(qing)cdQ所有列均以字符串Ş式存储,用户需要自行进行数据类型{?/span>
HBase中执行更新操作时Qƈ不会(x)删除数据旧的版本Q而是生成一个新的版本,旧有的版本仍然保留(q是?/span>HDFS只允许追加不允许修改的特性相关的Q?br />
2、数据坐?br />HBase中需要根据行键、列族、列限定W和旉x定一个单元格Q因此,可以视ؓ(f)一?#8220;四维坐标”Q即[行键,列族, 列限定符,旉?/span>]

?/span>

?/span>

[201505003,Info,email, 1174184619081]

xie@qq.com

[201505003,Info,email, 1174184620720]

you@163.com


3、概念视?br />

4、物理视?br />


三、HBase实现原理

1?span style="color: black">HBase的实现包括三个主要的功能lgQ?/span>

Q?/span>1Q库函数Q链接到每个客户?/span>
Q?/span>2Q一?/span>MasterL务器
Q?/span>3Q许多个Region服务?br />
L务器Master负责理和维护HBase表的分区信息Q维?/span>Region服务器列表,分配RegionQ负载均?/span>
Region服务器负责存储和l护分配l自qRegionQ处理来自客L(fng)的读写请?/span>
客户端ƈ不是直接?/span>MasterL务器上读取数据,而是在获?/span>Region的存储位|信息后Q直接从Region服务器上d数据
客户端ƈ不依?/span>MasterQ而是通过Zookeeper来获?/span>Region位置信息Q大多数客户端甚至从来不?/span>Master通信Q这U设计方式?/span>Master负蝲很小
2、Region
开始只有一?/span>RegionQ后来不断分?/span>
Region拆分操作非常快,接近瞬间Q因为拆分之后的Regiond的仍然是原存储文Ӟ直到“合ƈ”q程把存储文件异步地写到独立的文件之后,才会(x)d新文?/span>
同一?/span>Region不会(x)被分拆到多个Region服务?br />
每个Region服务器存?/span>10-1000?/span>Region

元数据表Q又?/span>.META.表,存储?/span>Region?/span>Region服务器的映射关系
?/span>HBase表很大时Q?/span> .META.表也?x)被分裂成多?/span>Region
Ҏ(gu)据表Q又?/span>-ROOT-表,记录所有元数据的具体位|?/span>
-ROOT-表只有唯一一?/span>RegionQ名字是在程序中被写ȝ
Zookeeper文g记录?/span>-ROOT-表的位置


客户端访问数据时?#8220;三d”

Z加速寻址Q客L(fng)?x)缓存位|信息,同时Q需要解决缓存失效问?/span>

dq程客户端只需要询?/span>Zookeeper服务器,不需要连?/span>Master服务?/span>

3、HBase的三层结构中各层ơ的名称和作?/span>

层次

名称

作用

W一?/span>

Zookeper文g

记录?/span>-ROOT-表的位置信息

W二?/span>

-ROOT-?/span>

记录?/span>.META.表的Region位置信息

-ROOT-表只能有一?/span>Region。通过-ROOT-表,可以访?/span>.META.表中的数?/span>

W三?/span>

.META.?/span>

记录了用h据表?/span>Region位置信息Q?/span>.META.表可以有多个RegionQ保存了HBase中所有用h据表?/span>Region位置信息

四、HBaseq行机制
1、HBasepȝ架构


(1、客L(fng)包含讉KHBase的接口,同时在缓存中l护着已经讉Kq的Region位置信息Q用来加快后l数据访问过E?/span>

(2、Zookeeper可以帮助选DZ?/span>Master作ؓ(f)集群的ȝQƈ保证在Q何时LL唯一一?/span>Master在运行,q就避免?/span>Master?#8220;单点失效”问题
Q?span style="color: black">Zookeeper是一个很好的集群理工具Q被大量用于分布式计,提供配置l护、域名服务、分布式同步、组服务{?/span>Q?br />
(3. Master
L务器Master主要负责表和Region的管理工作:(x)
理用户对表的增加、删除、修攏V查询等操作
实现不同Region服务器之间的负蝲均衡
?/span>Region分裂或合q后Q负责重新调?/span>Region的分?/span>
对发生故障失效的Region服务器上?/span>Regionq行q移
(4. Region服务?/span>
Region服务器是HBase中最核心的模块,负责l护分配l自qRegionQƈ响应用户的读写请?/span>
2、Region


(1、用戯写数据过E?br />用户写入数据Ӟ被分配到相应Region服务器去执行
用户数据首先被写入到MemStore?/span>Hlog?/span>
只有当操作写?/span>Hlog之后Q?/span>commit()调用才会(x)其q回l客L(fng)
当用戯取数据时Q?/span>Region服务器会(x)首先讉KMemStore~存Q如果找不到Q再ȝ盘上面的StoreFile中寻?/span>
(2、缓存的h
pȝ?x)周期性地?/span>MemStore~存里的内容刷写到磁盘的StoreFile文g中,清空~存Qƈ?/span>Hlog里面写入一个标记?br />每次刷写都生成一个新?/span>StoreFile文gQ因此,每个Store包含多个StoreFile文g

每个Region服务器都有一个自qHLog文gQ每ơ启动都(g)查该文gQ确认最q一ơ执行缓存刷新操作之后是否发生新的写入操作;如果发现更新Q则先写?/span>MemStoreQ再刷写?/span>StoreFileQ最后删除旧?/span>Hlog文gQ开始ؓ(f)用户提供服务
(3、StroreFile的合q?span style="color: black">
每次刷写都生成一个新?/span>StoreFileQ数量太多,影响查找速度
调用Store.compact()把多个合q成一?/span>
合ƈ操作比较耗费资源Q只有数量达C个阈值才启动合ƈ
3、Store工作原理
Store?/span>Region服务器的核心
多个StoreFile合ƈ成一?br />触发分裂操作Q?/span>1个父Region被分裂成两个?/span>Region
单个StoreFileq大Ӟ?/span>
4、HLog工作原理
分布式环境必要考虑pȝ出错?/span>HBase采用HLog保证pȝ恢复
HBasepȝ为每?/span>Region服务器配|了一?/span>HLog文gQ它是一U预写式日志Q?/span>WriteAhead LogQ?/span>
用户更新数据必须首先写入日志后,才能写入MemStore~存Qƈ且,直到MemStore~存内容对应的日志已l写入磁盘,该缓存内Ҏ(gu)能被刷写到磁?/span>

Zookeeper?x)实时监每?/span>Region服务器的状态,当某?/span>Region服务器发生故障时Q?/span>Zookeeper?x)通知Master
Master首先?x)处理该故?/span>Region服务器上面遗留的HLog文gQ这个遗留的HLog文g中包含了来自多个Region对象的日志记?/span>
pȝ?x)根据每条日志记录所属的Region对象?/span>HLog数据q行拆分Q分别放到相?/span>Region对象的目录下Q然后,再将失效?/span>Region重新分配到可用的Region服务器中Qƈ把与?/span>Region对象相关?/span>HLog日志记录也发送给相应?/span>Region服务?/span>
Region服务器领取到分配l自qRegion对象以及(qing)与之相关?/span>HLog日志记录以后Q会(x)重新做一遍日志记录中的各U操作,把日志记录中的数据写入到MemStore~存中,然后Q刷新到盘?/span>StoreFile文g中,完成数据恢复
q日志优点Q提高对表的写操作性能Q缺点:(x)恢复旉要分拆日?/span>
五、HBase性能
1?span style="color: black">行键QRowKeyQ?br />

行键是按?/span>字典?/span>存储Q因此,设计行键Ӟ要充分利用这个排序特点,经怸赯取的数据存储C块,最q可能会(x)被访问的数据攑֜一块?/span>

举个例子Q如果最q写?/span>HBase表中的数据是最可能被访问的Q可以考虑时间戳作ؓ(f)行键的一部分Q由于是字典序排序,所以可以?/span>Long.MAX_VALUE- timestamp作ؓ(f)行键Q这栯保证新写入的数据在读取时可以被快速命中?/span>

InMemoryQ创的时候,可以通过HColumnDescriptor.setInMemory(true)表攑ֈRegion服务器的~存中,保证在读取的时候被cache命中?/span>

Max VersionQ创的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)讄表中数据的最大版本,如果只需要保存最新版本的数据Q那么可以设|?/span>setMaxVersions(1)?/span>

Time To Live创徏表的时候,可以通过HColumnDescriptor.setTimeToLive(inttimeToLive)讄表中数据的存储生命期Q过期数据将自动被删除,例如如果只需要存储最q两天的数据Q那么可以设|?/span>setTimeToLive(2* 24 * 60 * 60)?/span>

2、HBaseMaster默认ZWeb?/span>UI服务端口?/span>60010Q?/span>HBase region服务器默认基?/span>Web?/span>UI服务端口?/span>60030.如果masterq行在名?/span>master.foo.com的主ZQ?/span>mater的主地址是http://master.foo.com:60010Q用户可以通过Web览器输入这个地址查看该页?/span>
可以查看HBase集群的当前状?/span>
3?span style="color: black">NoSQL
区别于关pd数据库的一点就?/span>NoSQL不?/span>SQL作ؓ(f)查询语言Q至于ؓ(f)何在NoSQL数据存储HBase上提?/span>SQL接口

易用,减少~码

4、HBase只有一个针对行健的索引

讉KHBase表中的行Q只有三U方式:(x)

通过单个行健讉K
通过一个行健的区间来访?/span>
全表扫描

ȝQ?br />
1、HBase数据库是BigTable的开源实玎ͼ?/span>BigTable一P支持大规模v量数据,分布式ƈ发数据处理效率极高,易于扩展且支持动态׾~,适用于廉仯?/span>
2、HBase可以支持NativeJava API?/span>HBaseShell?/span>ThriftGateway?/span>Hive{多U访问接口,可以Ҏ(gu)具体应用场合选择相应讉K方式
3、HBase实际上就是一个稀疏、多l、持久化存储的映表Q它采用行键、列键和旉戌行烦(ch)引,每个值都是未l解释的字符丌Ӏ?/span>
4、HBase采用分区存储Q一个大的表?x)被分拆许多?/span>RegionQ这?/span>Region?x)被分发C同的服务器上实现分布式存?/span>
5、HBase的系l架构包括客L(fng)?/span>Zookeeper服务器?/span>MasterL务器?/span>Region服务器。客L(fng)包含讉KHBase的接口;Zookeeper服务器负责提供稳定可靠的协同服务Q?/span>MasterL务器主要负责表和Region的管理工作;Region服务器负责维护分配给自己?/span>RegionQƈ响应用户的读写请?/span>


鸉K 2017-07-19 22:24 发表评论
]]>
վ֩ģ壺 999þþѾƷ| ߹ۿwww³³| ޾Ʒ| ޹Ʒպ߹ۿ| һԻƬ | ɫAVɫһ| þ4438| 㽶Ѳ| պƵ| һ91| þù׾ƷѲ| Ůʮ·츾 | ߹ۿһ| Ƶ| AëƬA| ۺ| պǧ| Ƶһ| 91޾Ʒһۺϲ| 99re6߾Ʒѹۿ| ѹ߹ۿӰԺ| ĻAVһ| ޾ƷƵѿ| һ| ްv2017| ڵƵ| õһۺϾƷ| þù߳׽ѹۿ| ۺ뾫Ʒ| ɫƵ߹ۿѸֱ | ޳avѿ| һƵ߲| Ƶ2ѹۿ| Ʒѹۿ| ɫAVպ߹ۿ| ۺɫƵ| 91߾Ʒһ| 99ƷƵ߹ۿר| AVƷɫ| ߹ۿ| ۺɫ߲|