暂时未有相关云产品技术能力~
Redis安装配置一、环境准备操作系统:CentOS 7如何确定linux是多少位的?getconf LONG_BIT # 需要为 64安装gccyum -y install gcc # 查看版本 gcc -v yum -y install gcc-c++ 二、安装redis7本地下载redis7https://redis.io/download/通过XShell上传到 /opt 目录下解压缩tar -zxvf redis-7.0.9.tar.gz执行 make && make installcd /opt/redis-7.0.9 make && make install查看安装目录cd /usr/local/bin拷贝配置文件cd /opt/redis-7.0.9 mkdir /myredis cp redis.conf /myredis/redis7.conf修改完配置文件,需要重启修改我们拷贝的配置文件 redis7.conf# 1、daemonize 修改为 yes daemonize yes # 2、protected-mode 修改为 no protected-mode no # 3、注释掉 bind 127.0.0.1 -::1 # bind 127.0.0.1 -::1 # 4、添加redis密码,将requirepass修改为自己设置的密码 requirepass 1234启动服务redis-server /myredis/redis7.conf ps -ef|grep redis|grep -v grep连接 redisredis-cli -a 1234 -p 6379ping返回PONG成功ping # 返回 PONG 则成功关闭redis# 单实例关闭 redis-cli -a 1234 shutdwon # 多实例关闭,指定端口关闭 redis-cli -p 6379 shutdown
1、前言大家好,欢迎来到我的吉鹿(记录)空间。最近在做一个前后端分离的项目时,由于后端提供的 API 接口文档实在是一言难尽,导致了开发的效率大大降低。于是我出手了,我决定薅完我20几年的头发来肝一下接口文档。下面给大家介绍一下,如何正确的在自己的项目中使用接口文档。2、简介2.1、什么是接口文档?接口文档又称为 API 文档,通常由开发人员一起规定的一种规范,一般由后端开发人员所编写的,用来描述系统所提供接口信息的文档。 前端人员直接调用某一个接口就可以实现某一个业务流程所需要的数据等信息。2.2、为什么要写接口文档?项目开发过程中前后端开发人员更加方便。项目迭代或者项目人员更迭时,方便后期人员的维护。为测试人员进行接口测试提供便利。3.3、接口文档如何选择?一个合格的接口文档是十分重要的,规范的文档可以很大程度的提高工作效率,尤其是对于接口测试而言。合格的接口文档包含了:项目介绍、业务介绍、环境介绍、项目设计的请求和各个请求方式的传参格式和请求内容以及返回值等。对于一个功能很多的项目来说,接口是非常多的,基本都是上千个,那么为了实现更好的文档管理和阅读的目的,就需要对接口文档根据模块进行划分,不同的模块的划分也有不同的要求。这些都是实现一个合格的接口文档所需要具备的条件。竟然一个接口文档需要花费如此功夫,那么如何编写合格的接口文档呢?手写接口文档?不可能,这辈子都不可能!当然是用 Swagger 接口文档工具了4.4、如何使用Swagger接口文档?废话不多说?走,整点儿东西!到官网去巴拉几下:http://swagger.io ,了解基本用法,如果有看不懂英文的小伙伴,我在下面贴心的为大家准备了 Swagger 基本的模板,下面就简单介绍下 Swagger 基本用法吧。3、Swagger3.1、准备阶段先新建 Spring Boot 工程,然后引入依赖,只需要引入一个版本即可<!-- Swagger2.9.2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!-- Swagger3.0.0 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>备注:项目使用的 Spring Boot 版本为 2.5.5,如果使用更高版本的 Spring Boot 需要在 application.yml 添加如下配置spring: mvc: path match: matching-strategy: ant_path_matcher3.2、配置 Swagger新建 Swagger2Config.javaSwagger 配置参考:http://springfox.github.io/springfox/docs/current/#quick-start-guides下面的配置方式不仅仅适用于 Swagger 2.9.2 也适用于 Swagger 3.0.0 版本,但是在3.0.0版本中有小部分做了修改,详细体现在代码中的注释处。@Configuration @EnableSwagger2 // 2 // @EnableOpenApi // 3 public class Swagger2Config { @Bean public Docket createRestApi(){ return new Docket(DocumentationType.SWAGGER_2) // 2 // return new Docket(DocumentationType.OAS_30) // 3 .pathMapping("/") .enable(true) .host("localhost:8888") .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.record.controller")) .paths(PathSelectors.any()) .build() .protocols(newHashSet("https","http")) // 2 .securitySchemes(singletonList(apiKey())) .securityContexts(singletonList(securityContext())); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("京茶吉鹿") .description("京茶吉鹿的Demo (SpringBoot2.5.5 + Swagger2.9.2)") .contact(new Contact("京茶吉鹿", "http:localhost:8888/doc.html", "jc.jingchao@qq.com")) .version("1.0.0") .termsOfServiceUrl("http://localhost:8888") .build(); } private ApiKey apiKey(){ return new ApiKey("Authorization", "Authorization", "Header"); } private SecurityContext securityContext(){ return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("/hello/.*")) .build(); } List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return singletonList( new SecurityReference("Authorization", authorizationScopes)); } } 3.3、访问接口文档访问路径:Swagger2.9.2 http://localhost:8888/swagger-ui.htmlSwagger3.0.0 http://localhost:8888/swagger-ui/index.htmlUI 界面如下3.4、使用第三方的UI虽然我们已经实现了Swagger接口文档,但是我们会发现 Swagger 自带的接口文档页面并不是我们喜欢的方式,我们可以使用第三方的界面,只需要引入下面的依赖,使用 http://localhost:8888/doc.html 就可以访问了<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>UI 界面如下到此为止,一个完整的接口文档我们已经实现了。原生的 Swagger 就能够满足我们在开发中的使用,尽管我们也使用了第三方的 Swagger UI资源库来美化我们的界面,但是由于 swagger-bootstrap-ui 采用的是后端Java代码 + 前端Ui混合打包的方式,与今天的微服务架构显得格格不入,下面将使用 knife4j 来重新生成接口文档如果你还不想使用 knife4j ,但是你中意与它的外表(UI界面)那么你可以使用引入下面的依赖来替换掉旧版本的 UI<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-ui</artifactId> <version>3.0.3</version> </dependency>UI 界面如下,界面更加美观,神似一个后台管理系统的 UI 界面,同时还可以切换语言,更加值得称赞的是还能进行界面的个性化配置。唯一比较遗憾的是由于你只使用了新版的皮肤,不能体会到接口文档的一些增强特性。看到此处如果 knife4j 仍然不能是你心动,那么你无需再看下面的内容了。4、knife4j4.1、什么是 knife4j?knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!Knife4j 的主要两点:🆕统一各个组件版本号,使用Knife4j时开发者根据需要自行引用,artifactId发生了变化💯支持Spring Boot 3🌼兼容适配springdoc-openapi底层框架,全面迁移到OpenAPI3的规范支持🌿针对OpenAPI2(Swagger)规范提供了优化,开发者基于Spring Boot2版本可以无缝衔接💪Knife4j-Desktop组件架构升级重写,新架构支持不同需求的OpenAPI规范进行聚合💪提供官方Docker镜像服务,基于Knife4j可方便在云服务上进行使用💥官网文档更新重写Knife4j 架构4.2、为什么使用 knife4j?前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分4.3、使用 knife4j下面环境为 SpringBoot 3.0.1 + Knife4j 4.0.0 ,注意项目使用的JDK 版本需要在 17 以上。引入 Knife4j 的 starter<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.0.0</version> </dependency> 引入Knife4j的 starter后,其余的配置,可以完全参考 springdoc-openapi 的项目说明,Knife4j只提供了增强部分,如果要启用Knife4j的增强功能,可以在配置文件中进行开启# springdoc-openapi项目配置 springdoc: swagger-ui: path: /swagger-ui.html tags-sorter: alpha operations-sorter: alpha api-docs: path: /v3/api-docs group-configs: - group: 'default' paths-to-match: '/**' packages-to-scan: com.xiaominfo.knife4j.demo.web # knife4j的增强配置,不需要增强可以不配 knife4j: enable: true setting: language: zh_cn配置文件@Configuration public class SwaggerConfig { @Bean public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { return openApi -> { if (openApi.getTags()!=null){ openApi.getTags().forEach(tag -> { Map<String,Object> map=new HashMap<>(); map.put("x-order", RandomUtil.randomInt(0,100)); tag.setExtensions(map); }); } if(openApi.getPaths()!=null){ openApi.addExtension("record","1223456"); openApi.getPaths().addExtension("x-record",RandomUtil.randomInt(1,100)); } }; } @Bean public OpenAPI customOpenAPI() { return new OpenAPI().info(new Info() .title("京茶吉鹿系统API") .version("1.0.0") .contact(new Contact().name("京茶吉鹿").email("jc.jingchao@qq.com").url("https://gitee.com/OHUHO")) .description( "Knife4j集成springdoc-openapi示例") .termsOfService("http://localhost:8888") .license(new License().name("Apache 2.0") .url("http://localhost:8888"))); } } 效果预览4.4、使用增强特性Knife4j 新版本已经将UI界面中的个性化配置剥离,只需要在后端进行配置即可。举个栗子,我们现在有这样一个需求,要给接口文档设置一个查看的权限(只有负责这个项目的前端人员才有资格查看),我们就可以为API文档设置密码,需要在配置文件中配置,如下knife4j: # 开启增强配置 enable: true # 开启Swagger的Basic认证功能,默认是false basic: enable: true # Basic认证用户名 username: test # Basic认证密码 password: 123到这里我们就学会了如何使用接口文档了。
微信小程序自定义tabBar样式,选中后中间凸起效果预览一、配置信息在 app.json 中的 tabBar 中指定 custom 字段为 true【允许使用自定义 tabBar】在所有 tab 页 json 中申明usingComponents 项,或者在 app.json 中全局开启在 list 中指定自己需要 tab示例"tabBar": { "custom": true, "color": "#515151", "selectedColor": "#DAA520", "backgroundColor": "#000000", "list": [ { "pagePath": "pages/index/index", "text": "首页" }, { "pagePath": "pages/hospital/hospital", "text": "医院" }, { "pagePath": "pages/publish/publish", "text": "item3" }, { "pagePath": "pages/popularization/popularization", "text": "科普" }, { "pagePath": "pages/me/me", "text": "我的" } ] }, "usingComponents": {},二、添加 tabBar 代码文件在代码根目录下添加custom-tab-bar文件夹,并在该文件夹下新建 page,文件结构如下|-- cusotm-tab-bar |-- index.js |-- index.json |-- index.wxml |-- index.wxss三、编写 tabBar 代码wxml 代码<!--custom-tab-bar/index.wxml--> <view class="tab-bar"> <view wx:for="{{list}}" wx:key="index" class="tab-bar-item {{item.bulge?'bulge':''}}" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab"> <view wx:if="item.bulge" class="tab-bar-bulge"></view> <image class="image" src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image> <!-- <view wx:if="{{item.text}}" style="color: {{selected === index ? selectedColor : color}}" class="tab-bar-view">{{item.text}}</view> --> <view class="tab-bar-view" style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</view> </view> </view> js 代码// custom-tab-bar/index.js Component({ data: { color: "#515151", selectedColor: "#DAA520", backgroundColor: "#ffffff", list: [ { pagePath: "/pages/index/index", text: "首页", iconPath: "/images/tabbar/index.png", selectedIconPath: "/images/tabbar/index-selected.png" }, { pagePath: "/pages/hospital/hospital", text: "医院", iconPath: "/images/tabbar/hospital.png", selectedIconPath: "/images/tabbar/hospital-selected.png" }, { pagePath: "/pages/publish/publish", bulge:true, text: "发布", iconPath: "/images/tabbar/dog.png", selectedIconPath: "/images/tabbar/dog-selected.png" }, { pagePath: "/pages/popularization/popularization", text: "科普", iconPath: "/images/tabbar/popularization.png", selectedIconPath: "/images/tabbar/popularization-selected.png" }, { pagePath: "/pages/me/me", text: "我的", iconPath: "/images/tabbar/me.png", selectedIconPath: "/images/tabbar/me-selected.png" }, ] }, attached() { }, methods: { switchTab(e) { const data = e.currentTarget.dataset const url = data.path wx.switchTab({url}) } } })wxss 代码.tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 50px; background: #FFF; display: flex; line-height: 1.2; padding-bottom: env(safe-area-inset-bottom); border-top: 1px solid #e6e6e6; } .tab-bar-item { flex: 1; text-align: center; display: flex; justify-content: center; align-items: center; flex-direction: column; } .tab-bar-item .image { width: 26px; height: 26px; } .bulge { background-color: #FFF; } .bulge .tab-bar-bulge{ position: absolute; z-index: -1; width: 64px; height: 64px; top: -24px; border-radius: 50%; border-top: 1px solid #e6e6e6; background-color: #FFF; } .bulge .image{ position: absolute; width: 50px; height: 50px; top: -16px; } .bulge .tab-bar-view{ position: relative; bottom: -16px; margin-top: 4px; } .tab-bar-item .tab-bar-view { font-size: 12px; margin-top: 4px; }json 代码{ "component": true }四、配置 tab 页在每一个 tab 页的onShow函数中写入下面的代码,其中 selected 的值为每个 tab 的索引onShow: function () { if (typeof this.getTabBar === 'function' && this.getTabBar()) { this.getTabBar().setData({ // 首页为 0 selected: 0 }) } },
SqlSession.mapper和SqlSession.selectXxx对比MyBatis中有两种SQL语句的执行方式,如下:1.通过SqlSession发送SQL语句,例如:sqlSession.slectone()的形式。2.通过SqlSession获取Mapper接口,通过Mapper接口发送SQL语句,例如:sqlSession.getMapper()的形式。一、封装工具类封装一个类SqlSession工具类,用于生产SqlSession对象,下面的例子为了节省代码将会使用我们封装的SqlSessionUtil工具类。public class SqlSessionUtil { public static SqlSession getSqlSession(){ SqlSession sqlSession = null; try { // 获取核心配置文件的输入流 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // 获取SqlSessionFactoryBuilder SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); // 获取SqlSessionFactory SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 获取SqlSession对象 sqlSession = sqlSessionFactory.openSession(true); } catch (IOException e) { throw new RuntimeException(e); } return sqlSession; } } 二、创建Mapper映射文件<mapper namespace="com.jingchao.mybatis.mapper.UserMapper"> <select id="selectUserById" resultType="User"> select * from t_user where id = #{id} </select> </mapper> 三、创建Mapper接口public interface UserMapper{ User selectUserById(@Param("id") Integer id); }四、SqlSession发送SQL语句selectOne方法表示查询一条语句,通过String类型的命名空间加上Sql语句标签的id来精准定位一条SQL语句。从而实现SQL语句的发送。SqlSession sqlSession = SqlSessionUtil.getSqlSession(); User user = sqlSession.selectOne("com.jingchao.mybatis.mapper.UserMapper.selectUserById", 1);五、Mapper接口发送SQL语句通过Mapper接口发送SQL是通过动态代理的方式(sqlSession.getMapper(UserMapper.class))获取mapper接口对象,通过调用mapper中的方法,实现发送SQL语句,这样完全避免了通过实现Mapper接口的方式来直接执行对应的SQL语句。SqlSession sqlSession = SqlSessionUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserById(1); 六、两种方式的对比通过SqlSession发送SQL语句不需要定义mapper(dao)接口,可以直接通过“ 命名空间 + id ”的方式发送SQL语句通过SqlSession获取Mapper接口,再通过Mapper接口发送SQL语句需要定义mapper接口,并在接口中定义抽象方法,通过获取mapper接口对象,再调用方法的形式发送SQL语句。说明:建议使用Mapper接口发送SQL语句的方式,理由如下:1.使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高代码可读性2.使用Mapper接口,是完全体现面向对象的语言,更加体现业务的逻辑3.使用Mapper接口的方式,可以提前进行代码的错误提示和检验,而直接使用SqlSession的方式,只有在代码运行时才会知道是否产生错误
中秋佳节,代码如诗!一年一度中秋节,一年一度团圆夜;年年月圆人不圆,岁岁形只影孤单。只愿大家能够团团圆圆,合家美满。中秋节,团圆节,月圆,人更圆!中国人对月亮特别执着,觉得月圆很美,月缺也很美。比起西方人因为热度、伟大,而对太阳的痴迷,我们更加懂得欣赏月亮的阴柔,我们用月亮的阴晴圆缺暗示着人世间的悲欢离合。从小看着猴子水中捞月,听着二泉映月,吃着白莲蓉双黄月饼。关于月亮,似乎有及说不清道不明的感情。中秋圆月,一家团聚,在当今年代更加显得珍贵难得。今年的中秋节又快要到啦,我们一起看一下不同人的视角下的中秋夜的圆月之美!打工人说:“瞧,那是老板画的大饼!”老板说:“错了,那分明是一块银元!”只有程序员,似乎听不到他们之间的争论,继续吃着老板画的大饼,拿着老板给的银元,默默的一行一行的耕耘。于是~~~~~~~~~~~~第一行诗:<div class="header"> </div>第二行诗:<div class="header-wrapper"> </div>第三行诗:<p> 举杯邀明月,对影成三人。</p>第四行诗(屎):<div> </div>第五行屎:………………第n行屎(诗):background-color: ginger;………………直到深夜,终于写完了!!!👇👇👇👇👇页面自取:https://gitcode.net/jingchao/mid-autumn-festival.git打工人和老板看了之后,都惊叹了!注:以上内容切勿当真,仅供娱乐!在薅完头发后写出来上面的文案,下面来看一下这诗一般的代码吧!html实现部分源码<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <title>中秋节</title> <link rel="stylesheet" href="style.css"> <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Ma+Shan+Zheng&family=Raleway:wght@300&display=swap" rel="stylesheet"> </head> <body> <div class="header"> <div class="header-wrapper"> <input type="radio" name="nande-toggle" id="nande-overview" checked> <div class="nande-crescent-container"> <div class="nande-crescent"> <div class="nande-crescent-1"> <div class="hg-text"> <label title="home" for="nande-overview">花</label> <label title="events">好</label> <label title="staff team" >月</label> <label title="site updates">圆</label> </div> </div> </div> </div> <div class="nande-bg-top"> <div class="nande-title"> <!-- 中国结 --> <svg>...</svg> <div class="nande-title-container"> <div class="nande-notice-plot"> <div class="notice-header"> 秋 <span>Mid-Autumn Festival</span> <i class="cp cp-maple-leaf"></i> </div> </div> </div> </div> <div class="hg-things"> <label for="nande-overview" class="nande-info"> <div class="news-header"> <i class="cp cp-flower"></i> 中秋快乐 <i class="cp cp-flower"></i> </div> <div class="overview-layout"> <div class="home-text"> <h2 class="poetry-title">《月下独酌》</h2> <h3>——李白</h3> <p>花间一壶酒,独酌无相亲。</p> <p>举杯邀明月,对影成三人。</p> <p>月既不解饮,影徒随我身。</p> <p>暂伴月将影,行乐须及春。</p> <p>我歌月徘徊,我舞影零乱。</p> <p>醒时相交欢,醉后各分散。</p> <p>永结无情游,相期邈云汉。</p> </div> <div class="home-notice"> 提一壶美酒摆在花丛间,自斟自酌无友无亲。举杯邀请明月,对着身影成为三人。明月当然不会喝酒,身影也只是随着我身。我只好和他们暂时结成酒伴,要行乐就必须把美好的春光抓紧。我唱歌明月徘徊,我起舞身影零乱。醒时一起欢乐,醉后各自分散。我愿与他们永远结下忘掉伤情的友谊,相约在缥缈的银河边。 </div> </div> </label> </div> </div> </div> </div> </body> </html>css实现代码此处省略此页面的代码在gitcode开源,里面包含了项目的全部代码和素材,需要此页面的的友友可以去自取 京茶吉鹿 / mid-autumn-festival花好月圆夜,幸福团聚时,月饼不能少最后,提前祝大家中秋节快乐!如果喜欢这个小项目,希望可以动动小手给个一键三连,你的鼓励,就是我最大的动力!
1、xpath1.1、xpath环境浏览器下载xpath插件chrome插件下载提取码:5iexpython安装lxml库pip install lxml -i https://pypi.douban.com/simple1.2、xpath使用1.etree.parse() 解析本地文件html_tree = etree.parse(‘xxx.html’)2.etree.HTML() 服务器响应文件html_tree = etree.HTML(response.read().decode(‘utf-8’))3.html_tree.xpath(xpath路径)4.路径获取鼠标右键查看网页源代码快捷键 Ctrl + Shift + x 打开xpath工具在Query框输入路径,在Result中显示定位的值1.3、xpath基本语法1.路径查询//:查询所有子孙节点,不考虑层级关系/:找直接子节点2.谓词查询//div[@id]//div[@id=“maincontent”]3.属性查询//@class4.模糊查询//div[contains(@id,“he”)]//div[start-with(@id,“he”)]5.内容查询//div/h1/text()6.逻辑运算//div[@id=“head” and @class=“s_down”]//title | //price1.4、应用实例:爬取站长素材图片import urllib.request from lxml import etree def create_request(page): if (page == 1): url = 'https://sc.chinaz.com/tupian/meinvtupian.html' else: url = 'https://sc.chinaz.com/tupian/meinvtupian_' + str(page) + '.html' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' } request = urllib.request.Request(url=url,headers=headers) return request def get_content(request): response = urllib.request.urlopen(request) content = response.read().decode('utf-8') return content def down_load(content): # 解析网页源码 tree = etree.HTML(content) name_list = tree.xpath('//div[@id="container"]//a/img/@alt') src_list = tree.xpath('//div[@id="container"]//a/img/@src') # 下载图片到本地 for i in range(len(name_list)): name = name_list[i] src = src_list[i] url = 'https:' + src urllib.request.urlretrieve(url=url,filename='./images/'+name+'.jpg') if __name__ == '__main__': start_page = int(input("请输入起始页码:")) end_page = int(input("请输入结束页码:")) for page in range(start_page, end_page + 1): request = create_request(page) content = get_content(request) down_load(content) 2、jsonpath文章推荐:https://blog.csdn.net/luxideyao/article/details/778023893、bs4无
CSDN网页顶部导航栏,浮窗效果说明:此篇文章是基于前两篇文章发布,其中包含了vue-cli(脚手架)的使用,和vue-router(路由)的使用,同时使用了全局事件总线。导航栏效果导航栏几乎完全和 csdn 网页的导航栏相同导航栏代码<template> <div> <div class="navbarBox" style="min-height: 48px;"> <div class="navbar"> <!-- 导航栏容器 --> <div class="navbar-container"> <!-- 左侧 --> <div class="navbar-container-left"> <!-- 网页logo --> <div class="logo"> <img src="https://img-home.csdnimg.cn/images/20201124032511.png" alt=""> </div> <!-- 左侧导航栏 --> <ul class="left-ul"> <li title=""><router-link active-class="active" to="#"> 博客 </router-link></li> <li title=""><router-link active-class="active" to="#"> 开发者文库 </router-link></li> <li title=""><router-link active-class="active" to="#"> 课程 </router-link></li> <li title=""><router-link active-class="active" to="#"> 问答 </router-link></li> <li title=""><router-link active-class="active" to="#"> 社区 </router-link></li> <li title=""><router-link active-class="active" to="#"> 插件 </router-link></li> <li title=""><router-link active-class="active" to="#"> 认证 </router-link></li> <li title=""><router-link active-class="active" to="#"> 开源 </router-link></li> </ul> </div> <!-- 中间搜索框 --> <div class="navbar-container-middle"> <div class="navbar-search-container"> <input type="text" autocomplete="off" id="search" :placeholder="defaultText"> <button> <i></i> <span>搜索</span> </button> </div> </div> <!-- 右侧导航栏 --> <div class="navbar-container-right"> <div class="navbar-btns-User"> <!--用户登录: 展示用户的头像以及其他信息--> <div class="userPhoto" @mouseover="mouseOver" @mouseleave="mouseLeave" v-if="isLogin"> <!-- 用户头像 --> <a class="hasAvatar" :style="{opacity}" href="https://blog.csdn.net/weixin_52372879?spm=1000.2115.3001.5343" > <img src="../assets/portrait.png"> </a> <!-- 用信息弹出框 初始display:none--> <div class="navbar-profile" :style="{display}" > <div class="profile-user"> <!-- 用户简介的头像 --> <a class="profile-avatar" href="https://blog.csdn.net/weixin_52372879?spm=1000.2115.3001.5343"> <img src="../assets/portrait.png"></a> <p class="profile-nickName">京茶吉鹿</p> </div> </div> </div> <!--用户未登录: 提示提示信息--> <div class="userPhoto" v-else @click.prevent="login"> <a href="">登录/注册</a> </div> <!-- 会员中心 --> <div class="navbar-btn navbar-btn-dynamic navbar-fl"> <a href="">会员中心</a> </div> <!-- 足迹 --> <div class="navbar-btn navbar-btn-news navbar-fl"> <a href="">足迹</a> </div> <!-- 动态 --> <div class="navbar-btn navbar-btn-news navbar-fl"> <a href="">动态</a> </div> <!-- 消息 --> <div class="navbar-btn navbar-btn-news navbar-fl"> <a href="">消息</a> </div> <!-- 发布 --> <div class="navbar-btn navbar-btn-write navbar-fl"> <a class="write" href=""> <i ></i>发布 <i ></i></a> </div> </div> </div> </div> </div> </div> <div> <router-view></router-view> </div> </div> </template><script> export default { name: "CSDNHeader", data(){ return{ opacity: 1, display: 'none', isLogin: false, defaultText: 'CSDN——京茶吉鹿' } }, methods:{ mouseOver(){ this.opacity = 0 this.display = 'block' }, mouseLeave(){ this.opacity = 1 this.display = 'none' }, transIndex(){ this.$router.push('/index') }, login(){ this.$router.push('/login') } }, mounted() { this.$bus.$on('isLogin',(data)=>{ this.isLogin = data }) //此处要判断token是否存在,存在则不展示 登录/注册 选项 if(window.sessionStorage.getItem("tokenStr")){ this.isLogin = true } } } </script><style scoped> .navbar{ position: fixed; z-index: 2001; top: 0px; width: 100%; left: 0px; font-size: 14px; /* 字体粗细,400相当于normal */ font-weight: 400; color: #222226; background-color: #fff; /* 阴影 水平阴影距离,垂直阴影距离, 模糊尺寸, 阴影尺寸 颜色*/ box-shadow:0 2px 4px 0 rgb(0, 0, 0,5%); } .navbar-container{ width: 100%; /* 最小宽度,窗口缩小之后到1280px不会再缩小 */ min-width: 1280px; box-sizing: border-box; padding: 0 24px; margin: 0 auto; height: 48px; line-height: 48px; display: flex; justify-content: space-between; -webkit-box-pack: justify; } .toolbar-container-left{ /* 元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器 */ flex: none; } .logo{ position: relative; float: left; margin-right: 8px; /* 当箭头鼠标移到会变成手式鼠标 */ cursor: pointer; } .logo img{ width: 80px; max-width: 80px; height: 44px; display: block; margin-top: calc((48px - 44px)/ 2); } .left-ul{ width: auto; height: 100%; /* 去除li中的间隙,在li中设置font-size,否则没有内容 */ font-size: 0px; float: left; } .left-ul li{ position: relative; display: inline-block; font-size: 14px; height: 100%; line-height: 48px; } a{ color:#000; padding: 0 10px; /* 删除a标签的下划线 */ text-decoration: none; } /* 鼠标停留时的样式 */ .left-ul li:hover{ background-color: #eee; } .navbar-container-middle{ padding: 0 40px; flex: 1; } .navbar-search-container{ width: 100%; max-width: 720px; height: 32px; line-height: 32px; margin-top: calc((48px - 32px)/ 2); box-sizing: border-box; font-size: 0px; margin-left: auto; margin-right: auto; } .navbar-search-container input{ font-size: 14px; display: inline-block; width: calc(100% - 88px); height: 100%; line-height: inherit; /* 为了后面聚焦搜索框样式,将边框外围线清除 */ outline: 0; background: #f5f6f7; color: #222226; vertical-align: top; text-indent: 16px; border: 1px solid #e8e8ed; border-right: none; box-sizing: border-box; border-radius: 16px 0 0 16px; } /* 搜索框聚焦样式 */ .navbar-search-container input:focus{ border: 1px solid #fc5531; border-right: none; } .navbar-search-container button{ display: inline-block; width: 88px; height: 100%; outline: 0; border: 0 none; border-radius: 0 16px 16px 0; font-size: 14px; line-height: 32px; cursor: pointer; background-color: #fc5531; text-align: left; } .navbar-search-container i{ display: inline-block; width: 24px; height: 24px; background: url(https://g.csdnimg.cn/common/csdn-toolbar/images/csdn-white-search.png) no-repeat center center; background-size: 100%; vertical-align: middle; position: relative; top: -1px; margin-left: 14px; } .navbar-search-container span{ display: inline-block; vertical-align: top; color: #fff; } .navbar-btns-User{ flex: 1; } .userPhoto{ height: 100%; float: left; position: relative; line-height: 48px; text-align: center; padding: 0 8px; } .hasAvatar{ display: block; line-height: 48px; color: #222226; margin-top: calc((48px - 32px)/ 2); margin-right: 16px; opacity: 1; } .hasAvatar img{ width: 32px; height: 32px; border-radius: 50%; } .navbar-profile{ width: 248px; color: #222226; background: #fff; position: absolute; min-height: 200px; top: 48px; left: 50%; margin-left: -132px; z-index: 9999999; border-radius: 4px; box-shadow: 0 0 10px 2px rgb(0 0 0 / 6%); } .navbar-profile .profile-user{ text-align: center; padding: 20px 0 12px 0; border-bottom: 1px solid #e8e8ed; } .navbar-profile .profile-user .profile-avatar{ position: absolute; width: 48px; height: 48px; padding: 0px; top: -32px; left: 50%; -webkit-transform: translate(-50%,0); transform: translate(-50%,0); border-radius: 50%; cursor: pointer; z-index: 9999; border: 1px solid #e8e8ed; } .profile-user .profile-avatar img { width: 100%; height: 100%; border-radius: 50%; } .navbar-profile .profile-user .profile-nickName{ width: 100%; box-sizing: border-box; padding: 0 16px; font-size: 16px; color: #222226; font-weight: 500; height: 40px; line-height: 40px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .navbar-btn{ position: relative; height: 48px; line-height: 48px; color: inherit; text-align: center; padding: 0 4px; } .navbar-fl{ float: left; } .navbar-btn-write>a i:first-child{ display: inline-block; width: 20px; height: 20px; vertical-align: middle; background: url("../assets/write.png"); background-size: 100%; margin-right: 2px; } .navbar-btn-write>a i:last-child{ display: inline-block; background: 0 0; width: 10px; height: 7px; margin-left: 7px; vertical-align: middle; background: url(https://g.csdnimg.cn/common/csdn-toolbar/images/write-hover-thro.png) no-repeat center center; background-size: 100%; } .write{ display: block; min-width: 88px; height: 32px; line-height: 32px; text-align: center; color: #fff; background: #fc5531; border-radius: 20px; margin-top: calc((48px - 32px)/ 2); } </style>
ue自定义web网页顶部导航栏说明:此组件是为论坛类项目定制的一个实用的顶部导航栏,当然也可以用于其他的Web项目,只需要稍作修改便可以达到想要的效果。其中导航栏包含了搜索栏,用户头像,以及基本的导航标题。导航栏标题的选中是通过 vue-router(路由)实现。💕💕*:文末附下载连接*导航栏效果详细步骤第一步:安装 vue-routernpm i vue-router@3第二步:在 main.js 中引入和使用 VueRouterimport VueRouter from 'vue-router'; Vue.use(VueRouter)第三步: 创建一个组件BBSHeader<template> <div> <div class="header"> <div class="box"> <h1> <img src="../assets/logo.png"> <span>Aubuary</span> </h1> <nav> <router-link active-class="active" to="/home">首页</router-link> <router-link active-class="active" to="/ask">问答</router-link> <router-link active-class="active" to="/community">社区</router-link> </nav> </div> <div class="box"> <input class="text" type="text" placeholder="请输入关键词~~~" name="search"> <input class="button" type="button" value="搜索"> <img src="../assets/portrait.png"> <nav> <a >消息</a> <a>发布</a> </nav> </div> </div> <div class="contents"> <div class="content"> <!--指定组件的位置--> <router-view></router-view> </div> </div> </div> </template> <script> export default { name: "BBSHeader" } </script> <style scoped> .header{ display: flex; align-items: center; justify-content: space-between; height: 50px; background-color:#292c2f; color: #ffffff; /*吸顶效果*/ /* position: sticky; position: -webkit-sticky; !*兼容 -webkit 内核的浏览器*! top: 0px; !*必须设一个值,否则不生效*!*/ } .box{ display: flex; align-items: center; } h1{ display: flex; align-items: center; font: normal 28px Cookie, Arial, Helvetica, sans-serif; padding: 0px 20px; } img{ width: 40px; height: 40px; } nav { display: flex; align-items: center; margin: 0px 40px; font:16px Arial, Helvetica, sans-serif; } nav a{ padding: 0 15px; width: 32px; text-decoration:none; color: #ffffff; font-size: 16px; font-weight: normal; opacity: 0.9; } nav a:hover { opacity: 1; } .active { color: #608bd2; pointer-events: none; opacity: 1; } /*搜索框*/ .text{ height: 22px; font-size: 14px; border: 1px solid #ccc; padding: 3px 16px; border-bottom-left-radius: 20px; border-top-left-radius: 20px; } .text:focus{ outline: none; border-color: rgba(82, 168, 236, 0.8); box-shadow: inset 0 2px 2px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); } .button{ width: 60px; height: 30px; font-size: 14px; margin-right: 35px; border: 1px solid #608bd2; background-color: #608bd2; border-top-right-radius: 20px; border-bottom-right-radius: 20px; } .contents{ display: flex; justify-content: center; } .content{ display: flex; width: 1400px; height: 1400px; /*background-color: #f0f2f3;*/ } </style> 第四步:创建一个路由器新建如下文件夹和文件|–pages |–BBSAsk.vue |–BBSCommunity.vue |–BBSHome.vue|–router |–index.js其中index.js中的内容如下import VueRouter from 'vue-router'; import BBSHome from "@/pages/BBSHome"; import BBSAsk from "@/pages/BBSAsk"; import BBSCommunity from "@/pages/BBSCommunity"; //创建一个路由器 const router = new VueRouter({ mode: 'history', routes:[ { name: 'home', path:'/home', component:BBSHome, }, { name: 'ask', path: '/ask', component: BBSAsk, }, { name:'community', path: '/community', component:BBSCommunity, } ] }) export default router第五步:在 main.js 中引入创建好的 routerimport router from "@/router"; //在 new Vue对象的时候声明 router new Vue({ el:'#app', render: h => h(App), router,第六步:在 APP.vue 中使用 BBSHeader 组件就可<template> <div><BBSHeader/> </div> </template> <script> import BBSHeader from "@/components/BBSHeader"; export default { name: 'App', components: {BBSHeader}, } </script> 备注:网页字体可以在 index.html 中做如下引入<link href='http://fonts.googleapis.com/css?family=Cookie' rel='stylesheet' type='text/css'>源代码链接获取:微信公众号【京茶吉鹿】内回复“Vue导航栏”
在安装好 Ubuntu-20 版本后,想使用 Xftp 7 来从本地的 Windows 系统传一些文件到虚拟机的Linux 系统(Ubuntu),使出现了 无法与192.168.xx.xx连接 的问题,开始检查自己的 ip 和用户名密码等问题,发现都正常。后来才发现,默认 Ubuntu 系统没有安装 shh服务。下面就来一步步解决问题。1、安装 shh服务sudo apt-get install openssh-server 2、启动 shh 服务/etc/init.d/ssh start到这一步就实现了 shh 服务的安装和启动,然后使用 Xftp 来连接,又出现了 SSH服务器拒绝了密码。请再试一次。 解决办法如下1、进入 root 权限sudo su2、打开 ssh 服务器配置文件vi /etc/ssh/sshd_config注:不会使用 vim 修改和保存文件的请查看vim的使用https://blog.csdn.net/weixin_52372879/article/details/120383395?spm=1001.2014.3001.5502#vim_2873、重新启动 ssh 服务器sudo /etc/init.d/ssh restart4、重启系统reboot注意⭕注意:创建会话时的用户名称一定要小写(如 JingChao 应写成 jingchao)如有使用 Xftp 连接仍然还存在,欢迎留言!
干货分享 | 打印回文数的四种方法!!本文提供了四种方法来打印回文数,大家可以根据题目的要求(如:时间复杂度、运行时间、内存等限制条件)来选取合适的方法。如果题目要求打印的回文数较大,我们可以选择将数字转换为字符串的形式,这样就避免了数字过大而溢出;当然,打印的回文数没有超出Java可以表示的范围,下列的四种方法都可以实现。下面以打印四位的回文数来举例。方法一:直接循环一个四位数的每一位,然后判断是否满足回文数要求。(注:要输出几位的回文数就需要几重循环)public class Main { public void Palindrome() { for (int i = 1; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int x = 0; x < 10; x++) { for (int y = 0; y < 10; y++) { if (i == y && j == x) { System.out.println("" + i + j + x + y); } } } } } } public static void main(String[] args) { new Main().Palindrome(); }方法二:先将原数字转换成字符串,再逆转字符串,最后判断逆转前后的字符串是否相等。public class Main { public void Palindrome() { for(int i = 1000;i < 10000;i++) { String ans = i + ""; //数字转换为字符串 String reverse = new StringBuffer(ans).reverse().toString();//逆转字符串 if(ans.equalsIgnoreCase(reverse)) { //比较两个字符串是否相等 System.out.println(ans); } } } public static void main(String[] args) { new Main().Palindrome(); } }方法三:先将原数字逆转,然后判断逆转前后的数字是否相等。public class Main { public void Palindrome() { for(int i = 1000;i < 10000;i++) { int temp = i; int reverse = 0; while(temp != 0) { int remain = temp % 10; temp /= 10; reverse = reverse * 10 + remain; } if(reverse == i) { System.out.println(reverse); } } } public static void main(String[] args) { new Main().Palindrome(); }方法四:将一个四位数的每一位存放在一个数组中,再依次取数组的两端元素并判断是否相等。public class Main { public void Palindrome() { for(int i = 1000;i < 10000;i++) { String temp = i + ""; char[] str = temp.toCharArray();//将字符串以单个字符存放在数组中 if(str[0] == str[3] && str[1] == str[2]) { for(int j = 0;j < str.length;j++) { System.out.print(str[j]); } System.out.println(); } } } public static void main(String[] args) { new Main().Palindrome(); } } 补充:如需要降低循环的次数,进行如下判断1、数字是否为负数2、数字是否以0结尾
Hadoop3.3.0安装教程本教程最终解释权归作者所有,转载请注明。本教程适合于原生 Hadoop3.3.0,主要参考了《大数据技术原理与应用》第三版,操作步骤详细,相信按照该教程操作,大家都能顺利安装并运行Hadoop。为了方便学习和使用该教程,请读者们利用Linux系统中自带的firefox浏览器打开此教程进行学习。文章目录Hadoop3.3.0安装教程前言一、环境的选择二、创建Hadoop账户三、更新apt四、安装SSH、配置SSH免密码登录五、安装Java环境六、Hadoop3.3.0的安装七、Hadoop单机配置(非分布式)八、Hadoop伪分布式安装1.修改配置文件 core-site.xml2.修改配置文件 hdfs-site.xml3.Hadoop的启动vim使用教程前言随着第三次信息化浪潮的涌动,大数据时代全面到来,人类社会信息科技的发展为大数据的到来提供了技术支持,数据产生方式的变革是促进大数据时代到来的至关重要的因素。大数据已经融入到了我们的生活,为了使我们对大数据有更加深刻的了解,我们大数据的研究刻不容缓。要学习大数据,最基础的就是了解大数据的处理框架Hadoop。Hadoop是一个开源的、可运行于大规模集群上的分布式计算平台,是被公认为行业大数据标准开源软件。几乎所有主流厂商都是以Hadoop为主。一、环境的选择本教程使用Ubtuntu-20.04做为系统环境,当然此教程也适用于Ubtuntu-20.04以下的版本,读者可以根据自己的需要选择相应的版本。若读者如果是选择其他版本(CentOS等)作为系统环境,命令则会有稍微的区别。在安装好Ubtuntu系统后,方可继续进行以下操作。二、创建Hadoop账户如果你安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 hadoop 的用户。首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :sudo useradd -m hadoop -s /bin/bash这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码:sudo passwd hadoop可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:sudo adduser hadoop sudo最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop 用户进行登陆。三、更新apt用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了。按 ctrl+alt+t 打开终端窗口,执行如下命令:sudo apt-get update由于后续需要更改一些配置文件,我们再此安装vim(当然使用gedit也可):注:vim的使用请参看教程目录sudo apt-get install vim安装软件时若需要确认,在提示处输入 y 即可。四、安装SSH、配置SSH免密码登录集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:sudo apt-get install openssh-server安装后,可以使用如下命令登陆本机:ssh localhost此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 hadoop,这样就登陆到本机了。但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:exit # 退出刚才的 ssh localhost cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost ssh-keygen -t rsa # 会有提示,都按回车就可以 cat ./id_rsa.pub >> ./authorized_keys # 加入授权 ———————————————— 版权声明:本文为CSDN博主「京茶吉鹿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_52372879/article/details/120383395此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了,如下图所示。五、安装Java环境Hadoop3.3.0需要使用JDK版本在1.8以上,读者需要按下面的步骤安装JDK1.8。读者需使用Ubtuntu自带的火狐浏览器打开Java官网,切记不要使用本地浏览器下载(如果使用本地浏览器下载需要使用WinSCP使用传送至虚拟机中)。打开网址我们选择下载 jdk-8u-301-linux-x64.tar.gz(即最后一项下载)。在Linux命令行界面中,执行如下Shell命令(注意:当前登录用户名是hadoop):cd /usr/lib sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件 cd ~ #进入hadoop用户的主目录 cd 下载 #jdk压缩包默认下载在该位置 sudo tar -zxvf ./jdk-8u301-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下JDK文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:cd /usr/lib/jvm ls可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_301目录。下面继续执行如下命令,设置环境变量:cd ~ vim ~/.bashrc上面命令使用vim编辑器(注:vim的使用请参看教程目录)打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_301 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:source ~/.bashrc这时,可以使用如下命令查看是否安装成功:java -version如果能够在屏如果能够在屏幕上返回如下信息,则说明安装成功:至此,成功安装了Java环境,下面就可以安装Hadoop了。六、Hadoop3.3.0的安装同样,我们选择到Hadoop官网下载hadoop-3.3.0.tar.gz。读者还是需要在Ubtunbu中自带的浏览器中下载。直接下载第一项即可。我们选择将 Hadoop 安装至 /usr/local/ 中:cd ~ #进入hadoop用户的主目录 cd 下载 #jdk压缩包默认下载在该位置 sudo tar -zxf ~/下载/hadoop-3.3.0.tar.gz -C /usr/local # 解压到/usr/local中 cd /usr/local/ sudo mv ./hadoop-3.3.0/ ./hadoop # 将文件夹名改为hadoop sudo chown -R hadoop ./hadoop # 修改文件权限Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:cd /usr/local/hadoop ./bin/hadoop version七、Hadoop单机配置(非分布式)Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。cd /usr/local/hadoop mkdir ./input cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar grep ./input ./output 'dfs[a-z.]+' cat ./output/* # 查看运行结果执行成功后如下所示,输出了作业的相关信息,输出的结果是符合正则的单词 dfsadmin 出现了1次注意:Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除。rm -r ./output八、Hadoop伪分布式安装Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。1.修改配置文件 core-site.xml使用下面的命令(注:vim的使用请参看教程目录)cd /usr/local/hadoop/etc/hadoop/ vim core-site.xml修改配置文件 core-site.xml ,将当中的<configuration> </configuration>修改为下面配置:<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>2.修改配置文件 hdfs-site.xml使用下面的命令:vim hdfs-site.xml修改配置文件 hdfs-site.xml<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>3.Hadoop的启动配置完成后,执行 NameNode 的格式化:cd /usr/local/hadoop ./bin/hdfs namenode -format成功的话,会返回很多行非常长的提示信息。接着开启 NameNode 和 DataNode 守护进程。cd /usr/local/hadoop ./sbin/start-dfs.sh #启动Hadoop若出现SSH提示信息,输入yes即可。启动时可能会出现WARN 提示,可以忽略WARN 提示,并不会影响正常使用。成功启动后,可以访问 Web 界面 http://localhost:9870 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。如下图所示:关闭Hadoop,则运行:./sbin/stop-dfs.sh注意:当下次启动 hadoop 时,无需再进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh 就可以!vim使用教程说明:以下vim使用方法只是在该教程用到的,如想了解更多,请参考菜鸟教程i 切换到输入模式,以输入字符。: 切换到底线命令模式,以在最底一行输入命令。ESC,退出输入模式,切换到命令模式。q 退出程序。w 保存文件。备注:在vim编辑文档时,输入 i 以输入字符;写入文档后,按 Esc 键,输入 :wq 以退出和保存文件。
此位置显示网络信息不可用1.首先确定虚拟机是否开机,只有在开机状态下才会显示IP地址。2.查看防火墙是否关闭,如果没有关,使用下面的命令进行关闭。systemctl stop firewalld //临时关闭 systemctl disable firewalld //永久关闭3.重启系统reboot4.修改ifcfg-ens33文件内容,输入 i 修改,将ONBOOT的值改成yes即可,修改完先按下Esc键,然后输入:wq关闭文件。vim /etc/sysconfig/network-scripts/ifcfg-ens335.最后重启网络协议(下面两种方式任选一种即可)。service network restart nmcli c reload到这就大功搞成了!! 本人亲测有效
2023年05月