第一次接触分布式我的项目,还是在 Linux 下编程,的确和 Windows 下编程有一点点不一样。没有一点点防范,就让我理解到不能用在 windows 上运行的代码,以及除了 web 开发之外的开发。
相熟了以前在 Windows 下的开发,用 IDEA
工具开发,点 build
编译我的项目(之前始终翻译成构建我的项目),点 run
运行我的项目,有时甚至都不点 build
。这个过程如同是肌肉记忆个别,纯熟的让我疏忽了这么做背地的起因,如同它原本就是这样的。
不得不说,当看到 Alluxio 官网上须要筹备的是 Mac 或 Linux 时,脑中霎时闪过很多问号,在 Linux 上运行(没有 Mac,就不思考 Mac 了)?不能在 Windows 上运行?那不能在 Windows 上看输入?不能在 Windows 上编译?构建?编译?构建和编译?要怎么启动我的项目,让它运行?命令怎么用的?
在这里记录一下编译和运行的了解,上面编译和运行的代码是分布式缓存零碎 Alluxio。
概念:是什么?
一个 java 程序,须要通过 编译 和运行 两步,能力看到程序实现的成果。这里有 2 个很重要的过程,就是编译和运行。
- 编译:把源代码“变成”字节码。怎么“变”呢?由 jdk 中的 javac 编译生成。
- 运行:把字节码“变成”机器码。怎么“变”呢?由 虚拟机 jvm 生成。运行这个过程,也是虚拟机把类加载到内存中的过程。操作系统执行机器码就能够运行 java 程序,看到源代码实现的成果。
那么,源代码和字节码是什么?
- 源代码是咱们程序员编写的代码,是以
.java
结尾的文件。 - 字节码是虚拟机 jvm 能够了解的代码,是以
.class
结尾的文件。它是只面向虚拟机的,应用雷同的字节码,虚拟机都会给出雷同的后果。也就是说,只有虚拟机一样,即便底层的操作系统不同,java 程序也不须要从新编译就能够间接运行。
字节码
字节码是在 java 程序生成的中间代码,不是机器 / 操作系统能够间接执行的代码。
字节码是虚拟机 jvm 能够了解的代码,它不是面向特定的操作系统,而是只面向虚拟机的。应用雷同的字节码,虚拟机都会给出雷同的后果。Java 语言通过字节码的形式,在肯定水平上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
说到 java 程序,就离不开虚拟机。
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同零碎的特定实现(Windows,Linux,macOS),目标是应用雷同的字节码,它们都会给出雷同的后果。字节码和不同零碎的 JVM 实现是 Java 语言“一次编译,随处能够运行”的关键所在。
编译与解释共存??
高级编程语言依照程序的执行形式分为两种:
- 编译型 :编译型语言会通过 编译器 将源代码 一次性翻译 成可被该平台执行的机器码。个别状况下,编译语言的 执行速度比拟快 , 开发效率比拟低。常见的编译性语言有 C、C++、Go、Rust 等等。
- 解释型 :解释型语言 一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比拟快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
java 语言是编译和解释共存的语言。是因为 java 语言既具备编译型语言的特色,也具备解释型语言的特色。
一个 java 程序须要先通过编译,而后通过解释,两个步骤能力运行。编译产生在源代码到字节码的过程,解释产生在执行字节码的过程。源代码通过编译器编译生成字节码,字节码通过解释器解释执行。
所以,如果想让一个 java 程序运行起来,看到代码实现的成果,必须通过编译和运行 2 个步骤,在 Windows 或 Linux 上都是一样的,只是不同的操作系统,实现的形式可能不同。Windows 通过图形化的 IDEA 能够点击实现这两个过程,而 Linux 个别是命令行,没有图形化界面,所以须要通过命令来执行编译和运行两个操作。
代码放哪里?
我的项目只能在 Linux 中编译和运行,而我本地的零碎是 Windows 零碎。所以,代码要放在近程的 Linux 服务器上,或者在本地的虚拟机中。先不思考怎么写代码的问题,那么把代码放在服务器上之后,就能够进行编译,而后运行启动我的项目。
抛开以前在 Windows 上运行我的项目的流程,在 Linux 启动一个我的项目:
- 怎么放代码?从主仓库把我的项目 fork 到本人的仓库之后,应用 git 下载本人仓库中的代码。
- 怎么编译?进入我的项目之后执行编译的命令
- 怎么运行?进入我的项目的根目录之后执行运行的命令
而后,查看到 Alluixo 的确启动胜利之后,就能够应用像 Windows 上运行我的项目(比拟相熟的)一样查看输入信息等等。
Linux 下编译
从近程仓库下载完代码之后,就能够编译代码(当然,Alluxio 须要设置配置文件)。
在 Alluxio 的官网上有编译代码相干的内容。Linux 下要应用 Maven 这个工具来实现对 java 程序的编译。Linux 零碎须要提前装置好 jdk8 和 Maven。
在我的项目的根目录下执行以下命令就能够实现编译过程,Maven 编译环境将主动获取依赖,编译源码,运行单元测试,并进行打包。
mvn clean install
在编译 Alluxio 时,为了减速编译过程,能够跳过一些查看
mvn -T 2C clean install -DskipTests -Dmaven.javadoc.skip -Dfindbugs.skip -Dcheckstyle.skip -Dlicense.skip
【注】
-T 2
:应用 2 个线程进行构建。-T 2C
:应用双核进行构建。
编译实现之后,会在各个目录之下生成 target
目录,该目录下是生成的两头文件,能够找到 java 源代码中的类对应的 .class
文件。
Linux 下运行
个别我的项目中会有运行我的项目的命令。以 Alluxio 为例,官网上有几种运行 Alluxio 的形式,有本地运行、在集群中运行、在 Docker 中运行、在 K8s 中运行等等。不同的形式在执行运行命令之前须要进行的配置不同。
- 本地运行
本地运行,就是在本地运行 Alluxio 的代码。“本地”,指的是代码运行时所在的主机,不是咱们写代码时用的电脑,或者其余的主机。本地运行 Alluxio 这种形式,会在本地启动一个 Master 节点和一个 Worker 节点(只是说 Alluxio 会启动这么多,没说其余的零碎)。
- 在集群中运行
集群是一群主机,简略的了解为很多台电脑。在集群中运行,把代码运行在多个主机中。应用集群运行代码的前提是,有很多台主机,至多 2 台。
其余的运行形式,Docker 或者 k8s 须要会用相应的容器。
所以先从简略一点的本地运行开始,毕竟只在一台电脑上运行代码就能够了。
运行之前
Step1 批改配置文件
在运行 Alluxio 之前,须要做一些配置。创立配置文件 conf/alluxio-site.properties
,在该配置文件中设置 master
节点的主机地址和 Alluxio 挂载的地址。
一是,设置 master
节点运行的主机。,在文件增加配置 alluxio.master.hostname=localhost
,将 master
节点所在的主机设置为本地。
二是,设置 Alluxio 挂载的地址。alluxio.master.mount.table.root.ufs=/tmp
,将 Alluxio 的挂载地址设置为 /tmp
,该文件是主机上的一个实在的文件夹。这一步设置实现之后,/tmp
这个文件夹就是 Alluxio 的地盘了,文件下的所有内容都归 Alluxio 治理,其余文件如果想要 Alluxio 管,就须要从它原来所在的中央“复制”到 /tmp
文件下。
【注】因为 Alluxio 是一个缓存零碎,并不是实在存储数据的存储系统,所以这个“复制“的操作,也不是咱们平时在操作文件时的复制操作。” 复制 ” 操作,是指启动 Alluxio 之后,将要 Alluxio 治理的文件或门路,通过 Alluxio 的复制命令 copyFromLocal
,来将本地的数据拷贝到 Alluxio 治理的空间。
拷贝到哪?
拷贝到 Alluxio 治理的空间,具体一点说,是 Alluxio 中 Master 节点所治理的。Master 节点治理着 Alluxio 中所有文件的元数据信息。
拷贝的具体是什么内容呢?
拷贝的是文件的元数据,不是文件自身。元数据能够简略的了解为一个文件的身份信息,通过元数据能够找到原文件。
为什么拷贝的是元数据,而不是文件正本呢?
Alluxio 作为一个缓存零碎,存储的是文件的元数据,而不是文件正本。元数据的数据量个别比文件要小的多,而且 Alluxio 作为连贯底层存储系统和下层应用层的桥梁,并不是要来永恒的存储数据,它只有在应用的时候找到元数据对应的文件在哪存储,而后拜访文件内容就能够。
Step2 挂载底层文件系统
Step1
中在配置文件中设置了 Alluxio 挂载的地址,执行以下命令将本地文件夹挂载到 Alluxio 上:
./bin/alluxio-mount.sh SudoMount
什么是挂载?
挂载操作,相似于在电脑上插入 U 盘,电脑上会呈现一个文件夹,显示 U 盘的内容,咱们通过在电脑上的操作就能够拜访到 U 盘中的内容。把本地的一个文件夹挂载到 Alluxio 中,就是把该文件夹指定为 Alluxio 的空间。
Step3 格式化 Alluxio 文件系统
只有在第一次运行 Alluxio 零碎时才须要执行格式化。格式化之后,原来 Alluxio 存储的元数据(Master 节点中的数据)和数据(Worker 节点中的数据)都会革除,而不会删除底层零碎的文件。
./bin/alluxio format
到这里,实现了运行之前的筹备。那么下面所用到的命令是什么意思呢?
./bin/alluxio
:是 当前目录下的 bin 目录下的 alluxio。所以,如果要运行 Alluxio 的命令,要先找到当前目录是什么目录。从 GitHub 上下载 Alluxio 的代码之后,是一个名为alluxio
的目录。进入到alluxio
目录中,能够找到bin
目录,bin
目录下是所有的执行脚本。所以,在运行 Alluxio 本人的命令之前要先进入到alluxio
目录中,在该目录下执行命令。
SudoMount / format
:是 Alluxio 中自定义的命令关键词。
运行
如果没有挂载文件系统或者要从新挂载,执行以下运行命令
./bin/alluxio-start.sh local SudoMount
如果曾经挂载过文件系统,执行以下运行命令
./bin/alluxio-start.sh local
执行完会呈现以下信息:
验证 Alluxio 是否运行
初时运行 Alluxio,总是要验证一下 Alluxio 是否真的在运行才安心。
第一种:查看日志
在 logs
记录了 Alluxio 的日志信息。查看 Master 节点的日志信息,局部信息如下
2022-03-17 10:54:57,966 INFO Server - Started @36486ms
2022-03-17 10:54:57,966 INFO WebServer - Alluxio Master Web service started @ /0.0.0.0:19999
2022-03-17 10:54:57,967 INFO AlluxioMasterProcess - Starting gRPC server on address:/0.0.0.0:19998
能够看到 Master 节点服务曾经启动,master 节点的 web 服务端口是 19999,rpc 服务的端口是 19998。
第二种:查看 master 节点的 web 页面
拜访 http://localhost:19999
,关上 master 节点的 web 显示页面,会看到 master 节点的信息。
【注】如果应用服务器运行 Alluxio,个别服务器会开启防火墙,须要保障服务器凋谢了 Alluxio 的相干端口(大概率要本人手动凋谢了)。master 节点的端口(19999 和 19998),worker 节点的端口(30000 和 29999)。如果服务器不凋谢端口,web 页面无法访问,rpc 服务无奈应用。