首先转载几位大佬的几篇文章;

CDH6.2.0搭建 https://blog.csdn.net/weixin_38201936/article/details/106006335
CDH6.2.0搭建(2)https://blog.csdn.net/weixin_38201936/article/details/106140498

CDH使用CM安装整合livy和zepplin(已攻略)
https://blog.csdn.net/qq_36428889/article/details/119778919?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242.2

制作Zeppelin的Parcel包和csd文件
https://blog.csdn.net/weixin_43215250/article/details/90406232
Cloudera Manager中安装部署Livy服务
https://blog.csdn.net/weixin_43215250/article/details/89157348
Cloudera Manager中安装部署Zeppelin服务
https://blog.csdn.net/weixin_43215250/article/details/90406780?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-17.essearch_pc_relevant

跟着大佬搞一遍基本没什问题!
但是CDH今年开始收费了 所以版本与大佬们有些不同这里简单记录下 搭建过程

一、安装概述

(一)软件环境

1.软件配置清单

(二)、配置规划


建议各位配置搞的大一点 我这和闹着玩一样

二、基本环境安装

提前声明:整个安装过程使用root用户

(一)、基本环境 1.修改主机名(所有节点)

#按照规划依次修改,修改完成记得重启服务器
vi /etc/hostname

(二)配置主机映射(所有节点)

vi /etc/hosts

192.168.100.10 cdh01
192.168.100.20 cdh02
192.168.100.30 cdh03
192.168.100.40 cdh04

(三)关闭防火墙和安全子系统(所有节点)

关闭防火墙

systemctl stop firewalld.service

禁止firewall开机启动

systemctl disable firewalld.service

关闭安全子系统

vi /etc/selinux/config
SELINUX=disabled

(四)配置ssh免密钥登陆(所有节点)

生成公钥私钥并进入到./ssh目录查看
ssh-keygen -t rsa
cd .ssh
将公钥分别传输到另外几台集群服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh01
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh02
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh03
ssh-copy-id -i ~/.ssh/id_rsa.pub cdh04
测试ssh免密是否成功
ssh cdh02

如果不成功,怎么办:
删除用户主目录下的.ssh目录,重新搞一遍,这时候就可以找百度问问了

rm -r /root/.ssh

(五)修改linxu内核参数(所有节点)

设置swappiness,控制换出运行时内存的相对权重,Cloudera 建议将swappiness 设置为 10:

查看swappiness
cat /proc/sys/vm/swappiness
永久性修改,执行下面两条命令
sysctl -w vm.swappiness=10
echo vm.swappiness = 10 >> /etc/sysctl.conf

(六)安装jdk(所有节点)

注意:JDK必须安装在/usr/java目录
这波因为装在了/usr/local目录下 启动spark2时报错 找不到java路径 后来加了软连接 本文配置暂未更改
软连接方式:

ln -s /usr/local/jdk1.8.0_171 /usr/java/default

1.查询java相关的安装包
rpm -qa | grep java
2.卸载查询出来的所有的包
rpm -e --nodeps xxx
3.解压
tar -zxf jdk-8u171-linux-x64.tar.gz
4.配置环境变量
vi /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_171
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

5.source生效并测试
source /etc/profile
java -version

(七)配置NTP时间同步服务

基本原理:将cdh01节点作为整套集群的时间同步服务器,其他的节点都向cdh01节点同步时间,这样即使cdh01节点不是标准的互联网时间,但是其他节点也只能向cdh01节点同步时间,并以其为统一的集群时间

1.所有节点安装ntp服务

yum -y install ntp

2.在cdh01节点

vi /etc/ntp.conf
增加,限制只允许192.168.100.10,也就是集群中其他节点向cdh01节点同步时间
restrict 192.168.100.0 mask 255.255.255.0
增加 设置cdh01节点为集群的时间同步服务器
server 127.127.1.0
同时将以下四行进行注释掉,不主动同以下时间服务器同步时间
#server 0.centos.pool.nep.org iburst
#server 1.centos.pool.nep.org iburst
#server 2.centos.pool.nep.org iburst
#server 3.centos.pool.nep.org iburst

3.在cdh02-cdh04节点

vi /etc/ntp.conf
增加,限制只允许192.168.100.10,也就是集群中其他节点向cdh01节点同步时间
server 192.168.100.10
同时将以下四行进行注释掉,不主动同以下时间服务器同步时间
#server 0.centos.pool.nep.org iburst
#server 1.centos.pool.nep.org iburst
#server 2.centos.pool.nep.org iburst
#server 3.centos.pool.nep.org iburst

4.所有节点(cdh01-cdh05)

先与网络服务器同步时间

ntpdate ntp1.aliyun.com

启动ntp服务,并设置其为开机启动

systemctl start ntpd.service
systemctl enable ntpd.service

5.测试其它节点能否向cdh01同步时间

ntpdate -u cdh01


6.为了进一步保证,也可以编写定时任务来每10分钟同步一次

crontab -e

*/10 * * * * /usr/sbin/ntpdate -u cdh01

(八) 安装依赖(所有节点)

yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse portmap fuse-libs redhat-lsb mod_ssl unzip

三、mysql安装

(一) 下载

weget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar

(二)解压

tar -xvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar

(三)卸载自带的mysql和mariadb

rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库
yum -y remove mysql //使用命令卸载

(四)依次安装各个rpm的mysql组件包

rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm  --nodeps --forcerpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm  --nodeps --forcerpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm --nodeps --force

(五)启动服务

systemctl start mysqld

(六)查询初始密码

cat /var/log/mysqld.log | grep passw


如果无法找到密码,请按照以下步骤:

vi /etc/my.cnf
在如下位置添加一项配置
Disabling symbolic-links is recommended to prevent assorted security risks
添加skip-grant-tables这句话,这时候登入mysql就不需要密码
skip-grant-tables
( 知识拓展 :如果想要左边有行号 输入 :set nu 就可以显示 )


重启mysql服务

systemctl restart mysqld

无密码登录

mysql

(七)登陆,修改密码安全策略,授权远程登陆

mysql -u root -p# 修改密码安全策略set global validate_password_policy=0;#修改密码长度限制set global validate_password_length=1;#设置密码ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';#授权外部主机访问GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;#刷新授权FLUSH PRIVILEGES;# 测试能否进行外部访问,在window的连接工具中,或者其他节点的命令行终端mysql -h cdh01 -u root -p

四、cloudera manager Server & Agent安装

(一) 在所有节点上创建 /opt/cloudera-manager

mkdir /opt/cloudera-manager

(二) 将cm的tar安装包上传到每个节点的/opt/cloudera-manager目录下,并解压

tar -zxvf cloudera-manager-centos7-cm5.16.2_x86_64.tar.gz

(三)在所有节点上创建cloudera-scm伪(系统)用户

useradd --system --home=/opt/cloudera-manager/cm5.16.2/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment “Cloudera SCM User” cloudera-scm

(四)配置cm-agent(所有节点)/opt/cloudera-manager/cm-5.16.2/etc/cloudera-scm-agent/config.ini

vi config.ini
server_host=192.168.100.10

(五)配置CM数据库拷贝mysql-connector-java.jar到/usr/share/java/目录下,注意jdbc驱动包的名称必须是mysql-connector-java.jar

1. 在所有节点上,如果没有/usr/share/java目录,请先自己 创建

cp mysql-connector-java-5.1.43.jar /usr/share/java/mysql-connector-java.jar

2. 在主节点上

cp mysql-connector-java-5.1.43.jar /opt/cloudera-manager/cm-5.16.2/share/cmf/lib/

(六) 配置cm数据库进入到/opt/cloudera-manager/cm-5.16.2/share/cmf/schema,执行mysql的建库建表语句

./scm_prepare_database.sh mysql -h cdh01 -uroot –p123456 --scm-host cdh01 scm scm scm

格式: 数据库类型、 数据库名称、 数据库服务器地址、 用户名 、密码 、server主机名 、数据库、授权访问scm的用户名和密码
注意:执行到这一步可能会报密码过于简单的一个错误可以将 scm的密码设置的复杂一点
例如:./scm_prepare_database.sh mysql -h cdh01 -uroot –p123456 --scm-host cdh01 scm scm Scm123…@

(七)创建后续部署hive,hue等组件所需的数据库

create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci; create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;create database hue DEFAULT CHARSET utf8 COLLATE utf8_general_ci;    create database monitor DEFAULT CHARSET utf8 COLLATE utf8_general_ci;    create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci; --可以使用以下方式进行授权外部主机访问
GRANT ALL PRIVILEGES ON hive.* TO 'hive'@'*' IDENTIFIED BY 'hive' WITH GRANT OPTION;   GRANT ALL PRIVILEGES ON amon.* TO 'amon'@'*' IDENTIFIED BY 'amon' WITH GRANT OPTION;GRANT ALL PRIVILEGES ON hue.* TO 'hue'@'*' IDENTIFIED BY 'hue' WITH GRANT OPTION;GRANT ALL PRIVILEGES ON monitor.* TO 'monitor'@'*' IDENTIFIED BY 'monitor' WITH GRANT OPTION;   GRANT ALL PRIVILEGES ON oozie.* TO 'oozie'@'*' IDENTIFIED BY 'oozie' WITH GRANT OPTION;

注意:创建hue数据库的时候可能会报密码长度不够 虽然前面set global validate_password_length=1; 修改密码长度限制为1 但是会报一个最小长度为4的错误 可以增加密码长度
例如: GRANT ALL PRIVILEGES ON hue.* TO ‘hue’@‘*’ IDENTIFIED BY ‘huee’ WITH GRANT OPTION;

(八) 制作parcels

在chd01节点上创建/opt/cloudera/parcel-repo目录

mkdir -p /opt/cloudera/parcel-repo

在agent(cdh01-cdh04)节点上创建/opt/cloudera/parcels目录

mkdir -p /opt/cloudera/parcels

上传以下文件到cdh01节点的/opt/cloudera/parcel-repo的目录下

CDH-5.16.2-1.cdh5.16.2.p0.8-el7.parcel
CDH-5.16.2-1.cdh5.16.2.p0.8-el7.parcel.sha1
manifest.json

注意:必须将CDH-5.16.2-1.cdh5.16.2.p0.8-el7.parcel.sha1最后的1去掉,否则无法生效
更改 /opt/cloudera/parcel-repo(server)和/opt/cloudera/parcels(agent)目录的所属者与所属组为cloudera-scmagent

server(cdh01)

chown -R cloudera-scm:cloudera-scm /opt/cloudera/parcel-repo/

agent(cdh01-cdh04)

chown -R cloudera-scm:cloudera-scm /opt/cloudera/parcels/

  1. 启动 CM Manager&Agent 服务
    注意:首次启动,耗时较长
    在server(cdh01)节点启动cloudera-scm-server
 cd /opt/cloudera-manager/cm-5.16.2/etc/init.d ./cloudera-scm-server start

在agent(cdh01-cdh04)节点启动cloudera-scm-agent

 cd /opt/cloudera-manager/cm-5.16.2/etc/init.d./cloudera-scm-agent start

启动成功后,打开web浏览器访问http://cdh01:7180
用户名和密码均为 admin

五、安装服务

进入页面安装服务这里就不截图了 可以参考大佬的安装步骤 添加服务不建议直接安装全部服务 启动一堆红看脑阔疼
这里介绍一下spark2 和 livy,zeppelin 的安装过程(zeppelin需要livy才能启动)

(一)上传CSD包到CM主节点(cdh01)的/opt/cloudera/csd目录

1.如果没有/opt/cloudera/csd手动创建

mkdir /opt/cloudera/csd

2.上传csd包到/opt/cloudera/csd/并修改所属用户为

cloudera-scmchown -R cloudera-scm:cloudera-scm /opt/cloudera/csd/

(二) 上传parcel的3个包到CM主节点(cdh01)的/opt/cloudera/parcel-repo目录下

(三) 重启CM和集群

cm-server节点/opt/cloudera-manager/cm-5.16.2/etc/init.d/cloudera-scm-server restartcm-agent节点/opt/cloudera-manager/cm-5.16.2/etc/init.d/cloudera-scm-agent restart

(四)部署Spark2.4

1.检查或者配置jdk(从一开始就是符合要求的jdk1.8,因此这一步可以不做,建议搞一下)


点击 分配 激活 我这里已经激活了


选择与其他框架的集成依赖



六、制作Zeppelin的Parcel包和csd文件

(一)安装git、java、mave配置java,maven等环境变量

git安装

yum install -y git

mave安装
上传安装包 mv改个名

配置环境变量

vi /etc/profile

export MVN_HOME=/usr/local/maven
export PATH=$MVN_HOME/bin:$PATH

(二)下载livy,zeppelin所需要的资源包

需要从livy、zepplin官网上下载我们安装的软件包:livy-0.5.0-incubating-bin.zip和zeppelin-0.8.2-bin-all.tgz。(建议版本别整太高)
链接:livy官网下载地址
zeppelin官网下载地址

去github:livy_zeppelin_cdh_csd_parcels上去下载它的zip文件

继续下载一个项目:git clone https://github.com/cloudera/cm_ext.git。把文件包扔到livy_zeppelin_cdh_csd_parcels目录中去

我们需要编辑下build.sh

由于之前我们已经下载了livy-0.5.0-incubating-bin.zip和zeppelin-0.8.2-bin-all.tgz,直接放到livy_zeppelin_cdh_csd_parcels目录下。cm_ext也放下,这样脚本里的下载就不会执行了,节约时间。

(三)生成livy和zeppelin的parcel包和csd文件

#首先先给个权限
chmod 755 build.shsh build.sh parcel
sh build.sh csd此时还缺少:LIVY-0.5.0-el7.parcel.sha,ZEPPELIN-0.8.2-el7.parcel.sha可以用如下命令在LIVY-0.5.0_build目录下执行sha1sum ./LIVY-0.5.0-el7.parcel |awk '{print $1}' > ./LIVY-0.5.0-el7.parcel.sha在ZEPPELIN-0.8.2_build目录下执行sha1sum ./ZEPPELIN-0.8.2-el7.parcel |awk '{print $1}' > ./ZEPPELIN-0.8.2-el7.parcel.sha

(四)生成包所遇到的问题!!!

1.maven问题

[ERROR] Plugin org.apache.maven.plugins:maven-jar-plugin:2.3.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-jar-plugin:jar:2.3.1: Could not transfer artifact org.apache.maven.plugins:maven-jar-plugin:pom:2.3.1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.40.215] failed: Connection refused -> [Help 1]

解决方法: 配置阿里云加速地址 修改maven安装目录下的conf/setting.xml文件,将中央仓库地址阿里云镜像地址

 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>

2.maven打包测试报错

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project cloudera-manager-schema: There are test failures.

解决办法:进入cm_ext目录下,运行下面打包命令 跳过测试环节

mvn clean package -Dmaven.test.skip=true

(五)部署parcel和csd

找到安装cm的目录/opt/cloudera/
把parcel、parcel.sha 文件cp到/opt/cloudera/parcel-repo目录下
把LIVY-0.5.0.jar、manifest.json 文件cp到/opt/cloudera/csd目录下,上述两个文件manifest.json可以合成一个,自己编辑下,放parcels这个数组里就好。(这个manifest.json这个文件不放在csd文件下 貌似也能正常分配 激活)

(六)部署Livy遇到的问题;

问题1:parcel已经分配,激活但是在添加服务的时候没有出现livy。 可以看一下cm-server重启的时候日志,如果有这个错

Could not install csd [LIVY-0.5.0]. Skipping java.lang.IllegalArgumentException: Could not read source file [aux/client/livy-env.sh]

解决方法:LIVY-0.5.0.jar包里的文件aux找不到了,livy_csd_build 里面是 _aux ,需要把livy_csd_build 里的_aux目录重命名改成aux目录重新打LIVY-0.5.0.jar包

jar -cvf LIVY-0.5.0.jar -C LIVY-0.5.0_build/ .

问题2.添加livy时报错

Error found before invoking supervisord: ‘getpwnam():name not found livy’

解决办法:在Livy REST Server所在服务器上增加livy用户及用户组 顺便把zeppelin的用户及用户组也搞上

groupadd -r zeppelin
useradd -r -g zeppelin zeppelin
groupadd -r livy
useradd -r -g livy livy
cd /var/log
mkdir  livy
chown livy:livy /var/log/livy
mkdir -p /var/log/zeppelin
chown zeppelin:zeppelin /var/log/zeppelin在HDFS的core-site.xml 中添加一下配置:```bash
<property><name>hadoop.proxyuser.livy.groups</name><value>*</value>
</property>
<property><name>hadoop.proxyuser.livy.hosts</name><value>*</value>
</property>

3.启动报错没有权限Permission deny:
解决方法:把/opt/cloudera/parcels/LIVY-0.5.0/bin 下 chmod 755

(七)部署zeppelin遇到的问题

1.添加服务时报错

Non-zero error code running command: hdfs dfs -put -f /var/run/cloudera-scm-agent/process/645-zeppelin-ZEPPELIN_SERVER/zeppelin-conf/interpreter.json file:///opt/cdh/zeppelin/conf

解决:
把opt/cdh/zeppelin/目录的所属用户组修改为zeppelin就好了

chown zeppelin:zeppelin /opt/cdh/zeppelin/

2.添加服务时报错

java.lang.IllegalArgumentException: The variable [${zeppelin_java_options}] does not have a corresponding value

ZEPPELIN --> 配置 --> 搜索 zeppelin_java_options --> 添加参数 -Xms1024m

3.配置zeppelin外部访问
配置zeppelin-conf/zeppelin-site.xml 的 Zeppelin Server 高级配置代码段(安全阀):

  <name>zeppelin.server.addr</name><value>0.0.0.0</value><description>Server binding address</description>
</property>

七、访问zeppelin界面

直接通过页面访问失败的话 可能需要去hosts配置一下

CDH安装及使用CM安装集成livy和zepplin相关推荐

  1. CDH 6.3.2 离线安装部署详细教程 (亲妈级别教学,有手就行)

    CDH6.3.2安装手册 更新文档见 https://gitee.com/baomili/bigdata-notes 最新最全 文章目录 @[toc] 参考博客 官网地址 1 下载CM和CDH 2 C ...

  2. CDH 5.15.2 离线安装

    一.前置准备 1. 基础信息 1.1 机器 机器名 服务 hadoop1 主节点 hadoop2 data.task hadoop3 data.task 1.2 服务版本 服务 版本 cdh 5.15 ...

  3. CDH5(CDH 5.16.1)安装

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CDH 6系列(CDH 6.0.0.CDH 6.1.0.CDH ...

  4. jenkins 新手入门安装失败_树莓派安装jenkins,安安静静做个持续集成打包机

    对于java程序来说,手动发布服务端是耗时和无聊的,jenkins很好地解决了这个问题,闲着也是闲着就在树莓派上装个jenkins帮我们打包发布吧. 这次我们需要安装三个软件: jdk:编辑java程 ...

  5. IDEA、Eclipse的详细安装配置及Tomcat服务集成介绍

    IDEA.Eclipse的详细安装配置及Tomcat服务集成介绍 说到开发工具,我们大家都知道每一个开发语言对会对应多个比较合适自己的开发工具,好的开发工具可以帮助提高写代码的效果及排错,比如拿jav ...

  6. Impala的安装(含使用CM安装 和 手动安装)(图文详解)

    Impala有两种安装方式: 1)使用CM安装Impala 2)手动安装Impala 注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 6.5系统中安装. 基 ...

  7. CM安装成功,CM的web界面登录不上解决方案

    首先查看日志:确定CM安装成功,且已经开启serve和agent服务! (开启serve服务成功后的日志里面会有如下的提示: INFO WebServerImpl:com.cloudera.serve ...

  8. Day001--Scala中的下载安装配置及下载安装集成开发环境IDEA

    老生常谈,我们学习一门语言之初都会先将其所依赖的环境和包安装好,Scala也不例外,只是Scala不能像Java一样,有一个专门来写它的IDE(eclipse),但我们可以在IDEA(集成开发环境)上 ...

  9. cdh hive配置mysql_Hive学习(CDH版Hadoop、Hive安装)

    1.CDH简介 大家认知度比较高的Hadoop项目一般指的是Apache的Hadoop,但是该项目版本比较复杂,兼容性也很差,一般没法直接用于生产.所以针对这个情况,衍生了几个比较著名的第三方版本(C ...

最新文章

  1. hongyi lee 作业1
  2. 【控制】《多无人机协同控制技术》周伟老师-第4章-基于 PID 的无人机编队运动控制策略
  3. 三十四、Scrapy中的CrawlSpider
  4. android queue用法,GitHub - rygz146/TQueue: Android 可以任意切换线程的任务队列, TQueue
  5. java io流文件损坏_java使用io流下载.docx. xlsx文件,出现文件损坏提示
  6. ipfs-hdfs分布式文件系统
  7. linux tasklet函数,tasklet和work_struct详解
  8. python中、文件最重要的功能是( )和接收数据_170道面试题,python让你前尘毋庸
  9. Power BI Desktop中的“提问”功能
  10. asscess 一条记录更新数据_一条MySQL更新语句是怎么执行的?
  11. 贝格数据携手清华大学“勘探”大数据富矿
  12. 从yield 到yield from再到python协程
  13. Java进制转换详解
  14. 冒泡排序及一个小小的优化
  15. Debian安装和配置CA证书
  16. 神舟战神换cpu教程_神舟战神能换什么cpu 神舟战神Z7可以换CPU吗
  17. uni-app海报(合成图片)demo
  18. 小奇的矩阵(动态规划
  19. 数据库方言(Dialect)
  20. python字符串操作符-python字符串操作

热门文章

  1. 软件测试工程师进阶技能工具篇——jmeter性能测试实战
  2. python队列实例
  3. Hexo-首页不显示全文的方法
  4. JVM中TLAB初认识
  5. Elasticsearch(五)----search搜索详解
  6. NodeJS 基于API v3 实现微信小程序的支付
  7. Springboot与微服务翻译
  8. ubuntu创建、删除文件及目录命令
  9. 图像加密之灰度加密:基于 密钥 × 解钥 ≡ 1 mod 灰度级 的一轮加密算法原理和步骤
  10. 非洲南部的黄金之地(一)