Hadoop 3.1.1 - 概述 - 集群安装
Hadoop 集群安装
目标
本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群。如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装)。
本文并不包含诸如安全和高可用等高级话题。
前提
- 按照 Java. 请参阅 Hadoop 百科 以选择合适的版本。
- 从 Apache 镜像下载一个 Hadoop 的稳定版本。
安装
安装 Hadoop 集群一般需要在所有机器上解压发行包,并通过你操作系统配置的包管理系统进行安装。将硬件设备根据功能进行划分非常重要。
通常,集群内有一台机器被指派为 NameNode,另一台为 ResourceManager。这两台机器承担 Master 角色。 其他的服务,如 Web App Proxy Server和 MapReduce Job History server,根据集群负荷,要么运行在独占的硬件上,要么和其他服务共享基础设施。
集群内的其他机器扮演 Worker 的角色,同时运行 DataNode 和 NodeManager。
在非安全模式下配置 Hadoop
两种类型的配置文件决定了 Hadoop 的 Java 启动参数:
- 只读的默认参数 - core-default.xml、hdfs-default.xml、yarn-default.xml 和 mapred-default.xml
- 集群特定的配置 - etc/hadoop/core-site.xml、etc/hadoop/hdfs-site.xml、etc/hadoop/yarn-site.xml 和 etc/hadoop/mapred-site.xml
另外在发行包的 bin/ 目录下有一些 Hadoop 的脚本,你可以在 etc/hadoop/hadoop-env.sh 和 etc/hadoop/yarn-env.sh 中设定集群特定的参数。
为了配置 Hadoop 集群,你需要设定守护进程的运行环境和启动参数。
HDFS 的守护进程包括 NameNode、SecondaryNameNode 和 DataNode,Yarn 的守护进程包括 ResourceManager、NodeManager 和 WebAppProxy。如果启用了 MapReduce,也需要运行 MapReduce Job History Server。对于大规模部署,这些守护进程一般运行在不同的主机上。
配置 Hadoop 守护进程的运行环境
管理员应使用 etc/hadoop/hadoop-env.sh 或者次要的 the etc/hadoop/mapred-env.sh 和 etc/hadoop/yarn-env.sh 脚本来实现特定集群的对 Hadoop 守护进程的运行环境的定制化。
至少,你需要为每个远端节点提供正确的 JAVA_HOME 。
管理员可以使用如下的环境变量来个性化配置各个守护进程。
| 守护进程 | 环境变量 |
|---|---|
| NameNode | HDFS_NAMENODE_OPTS |
| DataNode | HDFS_DATANODE_OPTS |
| Secondary NameNode | HDFS_SECONDARYNAMENODE_OPTS |
| ResourceManager | YARN_RESOURCEMANAGER_OPTS |
| NodeManager | YARN_NODEMANAGER_OPTS |
| WebAppProxy | YARN_PROXYSERVER_OPTS |
| Map Reduce Job History Server | MAPRED_HISTORYSERVER_OPTS |
举例来说,为了让 Namenode 使用 parallelGC 和 4GB 大小的 Java 堆,可以添加后续的命令到 hadoop-env.sh:
export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4g"
请在 etc/hadoop/hadoop-env.sh 中寻找更多示例。
其他可以定制化的有用参数包括:
- HADOOP_PID_DIR - 存储守护进程编号文件的目录路径。
- HADOOP_LOG_DIR - 存储守护进程日志文件的目录路径。如果日志文件不存在,它们会被自动创建。
- HADOOP_HEAPSIZE_MAX - 分配给 Java 堆的最大内存量。JVM 支持的数量单位在这里同样可用。如果没有单位,那么会被认定是 MB。通常,Hadoop 会让 JVM 自行决定使用多少。每个守护进程的这个数值可以被上述 _OPTS 后缀的环境变量覆盖。举例来说,设定 HADOOP_HEAPSIZE_MAX=1g 和 HADOOP_NAMENODE_OPTS="-Xmx5g" 将允许 NameNode 使用 5GB 大小的堆空间。
大多数情况,你应该指明 HADOOP_PID_DIR 和 HADOOP_LOG_DIR,这样 Hadoop 守护进程就知道该往哪个目录写文件。否则,这里会有潜在的链接攻击的危险。
在系统级别的环境里配置 HADOOP_HOME 变量是常见的作法。举例来说,在 /etc/profile.d 脚本中添加一小段命令:
HADOOP_HOME=/path/to/hadoop
export HADOOP_HOME
配置 Hadoop 守护进程
本节阐释以下配置文件里的重要参数。
- etc/hadoop/core-site.xml
| 参数 | 取值 | 注释 |
|---|---|---|
| fs.defaultFS | NameNode URI | hdfs://host:port/ |
| io.file.buffer.size | 131072 | SequenceFiles 的读写缓冲区大小。 |
- etc/hadoop/hdfs-site.xml
- NameNode 配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| dfs.namenode.name.dir | NameNode持久化命名空间和事务日志的本地目录路径。 | 如果用逗号分割了多个目录路径,为了冗余存储, name table 会被多副本地写到这些目录中。 |
| dfs.hosts / dfs.hosts.exclude | 允许/排除的 DataNode 列表。 | 如有必要,使用从节点配置文件来列出所有允许的 DataNode。 |
| dfs.blocksize | 268435456 | 对于大规模文件系统,HDFS 的块大小为 256MB。 |
| dfs.namenode.handler.count | 100 | NameNode 服务器响应来自大量 DataNode 的 RPC 请求的线程数量。 |
- DataNode 配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| dfs.datanode.data.dir | DataNode 存储块数据的本地目录路径。 | 如果用逗号分割了多个目录路径(通常属于不同的外接设备),数据会被多副本地写到这些目录中。 |
- etc/hadoop/yarn-site.xml
- 同时影响 ResourceManager 和 NodeManager 的配置:
| 参数 | 取值 | Notes |
|---|---|---|
| yarn.acl.enable | true / false | 是否开启 ACL。默认是 false。 |
| yarn.admin.acl | Admin ACL | 集群中具有管理员权限的用户或用户组。 如果由多个,用逗号分隔。默认值是 *,代表任何账户都可以;空白表示不设管理员。 |
| yarn.log-aggregation-enable | false | 是否启动日志聚合。 |
- ResourceManager 配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| yarn.resourcemanager.address | ResourceManager host:port 客户端提交作业的接口。 | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
| yarn.resourcemanager.scheduler.address | ResourceManager host:port ApplicationMaster 向 Scheduler 申请资源的接口。 | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
| yarn.resourcemanager.resource-tracker.address | ResourceManager host:port NodeManagers 汇报的接口 | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
| yarn.resourcemanager.admin.address | ResourceManager host:port 管理员专用的接口。 | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
| yarn.resourcemanager.webapp.address | ResourceManager host:port 图形化的网站接口。 | host:port 如果设定了,会覆盖 yarn.resourcemanager.hostname 中配置的主机名。 |
| yarn.resourcemanager.hostname | ResourceManager 主机名。 | host 适用于所有 yarn.resourcemanager*address 字样的配置项的单个主机名。ResourceManager 各个组件使用默认的端口号。 |
| yarn.resourcemanager.scheduler.class | ResourceManager Scheduler 类名。 | CapacityScheduler(推荐)、FairScheduler(次要推荐)或 FifoScheduler。使用完整的类名,如 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。 |
| yarn.scheduler.minimum-allocation-mb | 针对容器的请求,ResourceManager 每次分配的最小内存量。 | 单位是 MB。 |
| yarn.scheduler.maximum-allocation-mb | 针对容器的请求,ResourceManager 每次分配的最大内存量。 | 单位是 MB。 |
| yarn.resourcemanager.nodes.include-path / yarn.resourcemanager.nodes.exclude-path | 允许/排除的 NodeManager 列表。 | 如有必要,使用从节点配置文件来列出所有允许的 NodeManager。 |
- NodeManager 配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| yarn.nodemanager.resource.memory-mb | 对于所在节点,以 MB 为单位的由 Yarn 管理的物理内存大小。 | 决定了 NodeManager 运行所有的容器可占用的物理内存总量。 |
| yarn.nodemanager.vmem-pmem-ratio | 相比于物理内存大小,虚拟内存可以使用的比例。 | 在分配的物理内存之外,每个任务分配的虚拟内存大小。以及相比于 yarn.nodemanager.resource.memory-mb,所在节点所有任务消耗的虚拟内存总量。 |
| yarn.nodemanager.local-dirs | 逗号分隔的本地目录,用于写临时数据。 | 使用多个路径可以帮助分散磁盘 i/o。 |
| yarn.nodemanager.log-dirs | 逗号分隔的本地目录,用于写日志数据。 | 使用多个路径可以帮助分散磁盘 i/o。 |
| yarn.nodemanager.log.retain-seconds | 10800 | 日志聚合被关闭时有效,决定了 NodeManager 存续日志文件的时长(秒)。 |
| yarn.nodemanager.remote-app-log-dir | /logs | 日志聚合被开启时有效,决定了程序结束后,日志文件将要移动到的 HDFS 目录路径。该目录需要配置合适的权限控制。 |
| yarn.nodemanager.remote-app-log-dir-suffix | logs | 日志聚合被开启时有效,决定了添加到远端日志目录路径的后缀名。日志文件会被聚合到 ${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}。 |
| yarn.nodemanager.aux-services | mapreduce_shuffle | MapReduce 程序需要的 Shuffle 服务。 |
| yarn.nodemanager.env-whitelist | 容器从 NodeManager 继承的环境变量 | 对于 MapReduce 程序,该值代表了除默认包含的 HADOOP_MAPRED_HOME 以外要继承的环境变量。合法的环境变量包括 JAVA_HOME、HADOOP_COMMON_HOME、HADOOP_HDFS_HOME、HADOOP_CONF_DIR、CLASSPATH_PREPEND_DISTCACHE、HADOOP_YARN_HOME和HADOOP_MAPRED_HOME等。 |
- History Server 配置(日志文件需要被移动到其他地方):
| 参数 | 取值 | 注释 |
|---|---|---|
| yarn.log-aggregation.retain-seconds | -1 | 对于聚合的日志,保留多少秒。-1 代表禁用。小心,取值越小,对 NameNode 干扰越大。 |
| yarn.log-aggregation.retain-check-interval-seconds | -1 | 对于日志的存续时长,多久检查一次。 如果设置为 0 或者负数值,取值将为 yarn.log-aggregation.retain-seconds 的十分之一。小心,取值越小,对 NameNode 干扰越大。 |
- etc/hadoop/mapred-site.xml
- MapReduce 程序的配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| mapreduce.framework.name | yarn | 使用 Yarn 作为 Hadoop 的执行框架。 |
| mapreduce.map.memory.mb | 1536 | MAP 任务的内存限量。 |
| mapreduce.map.java.opts | -Xmx1024M | MAP 任务的 JVM 启动参数。 |
| mapreduce.reduce.memory.mb | 3072 | REDUCE 任务的内存限量。 |
| mapreduce.reduce.java.opts | -Xmx2560M | REDUCE 任务的 JVM 启动参数。 |
| mapreduce.task.io.sort.mb | 512 | 排序数据的内存限量,影响执行效率。 |
| mapreduce.task.io.sort.factor | 100 | 排序文件时一次可以同时归并的文件数量。 |
| mapreduce.reduce.shuffle.parallelcopies | 50 | REDUCE 任务从远端拉取数据时一次可以同时连接的 MAP 任务数量。 |
- MapReduce JobHistory Server 配置:
| 参数 | 取值 | 注释 |
|---|---|---|
| mapreduce.jobhistory.address | MapReduce JobHistory Server host:port | 默认端口是 10020。 |
| mapreduce.jobhistory.webapp.address | MapReduce JobHistory Server 网站接口 host:port | 默认端口是 19888。 |
| mapreduce.jobhistory.intermediate-done-dir | /mr-history/tmp | MapReduce 作业输出历史文件的目录。 |
| mapreduce.jobhistory.done-dir | /mr-history/done | MR JobHistory Server 管理历史文件的目录。 |
监控 NodeManager 的健康
Hadoop 提供了一种机制,使得管理员可以配置 NodeManager 周期性地执行一个由管理员提供的脚本,来判断所在节点是否健康。
管理员可以通过执行该脚本中的检查命令来决定节点是否健康。如果脚本认为节点不健康,它会向标准输出打印一行以 ERROR 开头的文本。NodeManager 周期性地执行该脚本并解析其标准输出的内容。如果脚本输出的文本包含上述所说的 ERROR 关键词,当前节点的状态将被汇报为不健康并被 Resource Manager 拉入黑名单,后续的任务将不会被分配到该节点。但 NodeManager 将继续执行该脚本,这样该节点酱油再次恢复健康的机会,从 ResourceManager 的黑名单中自动移除。管理员可以通过 Resource Manager 的网站接口查看各个节点的健康状态以及检查脚本的输出。节点最近一次以来的健康持续时间同样可以会显示在网页中。
在etc/hadoop/yarn-site.xml 中的以下参数用来控制节点的健康监控:
| 参数 | 取值 | 注释 |
|---|---|---|
| yarn.nodemanager.health-checker.script.path | 节点健康检查脚本路径 | 用来检查节点健康状态的脚本。 |
| yarn.nodemanager.health-checker.script.opts | 节点健康检查脚本的运行参数 | 脚本检查节点健康所引用的选项。 |
| yarn.nodemanager.health-checker.interval-ms | 节点健康检查脚本的触发周期 | 执行健康检查脚本的时间间隔。 |
| yarn.nodemanager.health-checker.script.timeout-ms | 节点健康检查脚本的执行超时 | 健康检查脚本单次执行的时间上限。 |
如果本地磁盘有损,健康检查脚本不应该输出 ERROR 关键字。NodeManager 会定期地检查本地磁盘(具体来说是 nodemanager-local-dirs 和 nodemanager-log-dirs 两个目录)是否健康。在受损目录数量达到阈值(由配置项 yarn.nodemanager.disk-health-checker.min-healthy-disks 设定)后, 整个节点会被标记为不健康并把该信息发送给 ResourceManager。引导盘要么阵列冗余化,要么由健康检查脚本来监控。
从节点配置文件
在 etc/hadoop/workers 文件中逐行列出从节点的主机名或IP地址。辅助脚本将基于 etc/hadoop/workers 文件实现同时在多台机器运行命令。 该文件并不被任何 Java 程序的配置文件所引用。为了使用该功能,必须为启动 Hadoop 的账号配置 ssh 的可信访问,如使用免密码登陆或者 Kerberos 等。
Hadoop 机架感知
许多 Hadoop 组件可以利用机架信息表达的网络拓扑结构来改善性能和安全性。通过触发管理员配置的模块,Hadoop 守护进程获取集群中从节点的机架信息。请参阅机架感知以获得更多信息。
强烈建议在启动 HDFS 之前先配置机架感知。
日志
Hadoop 通过 Apache Commons Logging 框架使用 Apache log4j 记录日志信息。 请编辑 etc/hadoop/log4j.properties 文件以定制化 Hadoop 守护进程的日志配置,如格式等。
管理 Hadoop 集群
一旦所有配置就绪,分发 HADOOP_CONF_DIR 目录到所有的机器,并确保其路径在各台机器上是一样的。
建议使用不同的用户名来运行 HDFS 和 YARN。在大多数的部署中,HDFS 进程以“hdfs”为用户名,YARN 通常使用“yarn”。
启动 Hadoop
要启动 Hadoop 集群,你需要同时启动 HDFS 和 YARN。
第一次启动 HDFS 时,必须先进行格式化。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
在指派的主节点上启动 NameNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode
在各台从节点上启动 DataNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 HDFS 进程都可以用一个辅助脚本来启动。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
在指派的主节点上启动 ResourceManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager
在各台从节点上启动 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager
使用 yarn 账户,启动独立的 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon start proxyserver
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 Yarn 进程都可以用一个辅助脚本来启动。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/sbin/start-yarn.sh
在指派的节点上启动 MapReduce JobHistory Server。使用 mapred 账户,执行如下命令:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
停止 Hadoop
在指派的主节点上启动 NameNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop namenode
在各台从节点上停止 DataNode。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon stop datanode
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 HDFS 进程都可以用一个辅助脚本来停止。使用 hdfs 账户,执行如下命令:
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
在指派的主节点上停止 ResourceManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop resourcemanager
在各台从节点上停止 NodeManager。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn --daemon stop nodemanager
如果配置了 etc/hadoop/workers 和 ssh 可信访问(参阅单节点安装),所有的 Yarn 进程都可以用一个辅助脚本来启动。使用 yarn 账户,执行如下命令:
[yarn]$ $HADOOP_HOME/sbin/stop-yarn.sh
使用 yarn 账户,停止 WebAppProxy 服务器。如果配置了负载均衡,那么每个实例都要执行如下命令:
[yarn]$ $HADOOP_HOME/bin/yarn stop proxyserver
在指派的节点上停止 MapReduce JobHistory Server。使用 mapred 账户,执行如下命令:
[mapred]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
网站接口
一旦 Hadoop 集群启动完毕,可以访问以下网址来查看各个组件的状态:
| 守护进程 | 网站接口 | 注释 |
|---|---|---|
| NameNode | http://nn_host:port/ | 默认端口是 9870。 |
| ResourceManager | http://rm_host:port/ | 默认端口是 8088。 |
| MapReduce JobHistory Server | http://jhs_host:port/ | 默认端口是 19888。 |
Hadoop 3.1.1 - 概述 - 集群安装的更多相关文章
- 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章
菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...
- 菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章
菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章 cheungmine, 2014-10-25 0 引言 在生产环境上安装Hadoop高可用集群一直是一个需要极度耐心和体力的细致工作 ...
- Hadoop 2.7.3 分布式集群安装
1. 集群规划: 192.168.1.252 palo252 Namenode+Datanode 192.168.1.253 palo253 YarnManager+Datanode+Secondar ...
- Hadoop(HDFS,YARN)的HA集群安装
搭建Hadoop的HDFS HA及YARN HA集群,基于2.7.1版本安装. 安装规划 角色规划 IP/机器名 安装软件 运行进程 namenode1 zdh-240 hadoop NameNode ...
- CentOS 6+Hadoop 2.6.0分布式集群安装
1.角色分配 IP Role Hostname 192.168.18.37 Master/NameNode/JobTracker HDP1 192.168.18.35 Slave/DataNode/T ...
- 大数据入门第五天——离线计算之hadoop(上)概述与集群安装
一.概述 根据之前的凡技术必登其官网的原则,我们当然先得找到它的官网:http://hadoop.apache.org/ 1.什么是hadoop 先看官网介绍: The Apache™ Hadoop® ...
- 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序
第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...
- Hadoop多节点集群安装配置
目录: 1.集群部署介绍 1.1 Hadoop简介 1.2 环境说明 1.3 环境配置 1.4 所需软件 2.SSH无密码验证配置 2.1 SSH基本原理和用法 2.2 配置Master无密码登录所有 ...
- 一步步教你Hadoop多节点集群安装配置
1.集群部署介绍 1.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesys ...
随机推荐
- es6 快速入门 系列 —— promise
其他章节请看: es6 快速入门 系列 Promise Promise 是一种异步编程的选择 初步认识Promise 用 Promise 来实现这样一个功能:发送一个 ajax,返回后输出 json ...
- 『心善渊』Selenium3.0基础 — 7、XPath轴定位详解
目录 1.XPath轴定位介绍 2.位置路径表达式概念 3.步的路径表达式范例 4.练习 使用XPath轴方式,可根据文档中元素的相对位置,来进行元素的定位.例如:先找到一个相对好定位的元素,在根据与 ...
- 02 SVN 与 Git 的优缺点
上一篇博客大致聊了聊关于版本控制系统的周边,这一篇我们就来继续唠唠作为近年来最受欢迎的两个版本控制系统的优缺点吧. 聊优缺点之前,先简单了解一下这两个这两个版本控制系统好了: 关于 SVN SVN 概 ...
- react 的优点
1. 声明式开发 react 是声明式的开发方式,与之对应的是命令式开发方式.之前用jquery写代码的时候,我们都是直接操作dom,这种我们称为命令式的编程.命令式编程需要我们一点点的告诉dom,它 ...
- excel函数提取身份证出生日期,分离日期时间的日期和时间
1.提取身份证出生日期 =1*TEXT(MID(H13,7,8),"0-00-00")用MID函数提取表示日期的位数,再用text函数转换为格式1998-6-21格式的文本,再通过 ...
- 34、mysql数据库(介绍)
34.1.什么是数据库: 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织. 描述和存储,具有较小的冗余,较高的数据独立性和易扩 ...
- 深入学习Netty(3)——传统AIO编程
前言 之前已经整理过了BIO.NIO两种I/O的相关博文,每一种I/O都有其特点,但相对开发而言,肯定是要又高效又简单的I/O编程才是真正需要的,在之前的NIO博文(深入学习Netty(2)--传统N ...
- linux进程后台运行的几种方法 - nohup/setsid/&
linux进程后台运行的几种方法 - nohup/setsid/& [转载] 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务 ...
- 在ubuntu16下编译openJDK11
为什么需要编译自己的jvm源码? 想象下, 你想看看java线程是如何start的? 去源码里一找 native void start0(), 此时如果你对jvm源码比较熟悉, 那么可以下载openJ ...
- ubuntu16.04上编译android的可执行文件并调用本地so库
前言: 找了蛮多资料的,发现目前实现的编译方式大致就两种,一种是直接使用android源码中的编译工具链,另一种就是使用独立的交叉编译工具链,第二种我还在实现中,配置步骤挺多的 ,第一种实现方式挺方便 ...