[{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/tags/config/","section":"Tags","summary":"","title":"Config","type":"tags"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/tags/ubuntu/","section":"Tags","summary":"","title":"Ubuntu","type":"tags"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/tags/wsl/","section":"Tags","summary":"","title":"WSL","type":"tags"},{"content":" WSL安装方式 # 安装方式\n# 根据实际情况修改参数 # -d指定发行版本名称 # --name设置虚拟机实例名称，实例名称不可重复 # --location设置虚拟机安装位置，注意创建目录 wsl --install -d Ubuntu-26.04 --name Ubuntu-26.04 --location D:\\wsl\\Ubuntu 打开WSL Settings软件，网络-网络模式设置为Mirrored，这样的话WSL中虚机和主机共享一个网络\n其他常用命令\n# 查看当前有哪些虚拟机及状态 wsl -l -v # 运行指定名称的虚拟机 wsl -d \u0026lt;name\u0026gt; # 备份虚拟机，根据实际情况修改导出位置，注意创建目录 wsl --export Ubuntu-26.04 D:\\wsl\\snapshot\\ubuntu-26.04-snapshot-202606082220.tar # 从备份恢复，第一个位置为虚机文件位置，第二个为备份文件位置，注意创建目录 wsl --import Ubuntu-26.04-test D:\\wsl\\ubuntu-test D:\\wsl\\snapshot\\ubuntu-26.04-snapshot-20260608.tar # 删除指定名称的虚拟机 wsl --unregister \u0026lt;name\u0026gt; Linux常见工具安装及配置方式 # 其他Linux系统初始化也可以参考。\n建议安装配置 # 安装常用的软件 # # 更新apt源 sudo apt update # 安装以下常用软件 sudo apt install plocate zip net-tools telnet python3.14-venv pipx 设置默认语言环境 # 否则带有中文的文件名输出会乱码。\nsudo locale-gen en_US.UTF-8 sudo update-locale LANG=en_US.UTF-8 安装bun # bun是目前最流行最快的JavaScript包管理工具。\ncurl -fsSL https://bun.sh/install | bash 使用source ~/.bashrc或退出重新进入虚机，输入bun -v可看到输出版本号即说明安装成功。\n安装uv # uv是目前最流行最快的Python包管理工具。\ncurl -LsSf https://astral.sh/uv/install.sh | sh 使用source ~/.bashrc或退出重新进入虚机，输入uv --version可看到输出版本号即说明安装成功。\n安装nvm # nvm是node.js多版本管理工具。\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.6/install.sh | bash 注意根据需要修改以上脚本中的版本号，最新版本可参见https://github.com/nvm-sh/nvm\n使用source ~/.bashrc或退出重新进入虚机，输入nvm --version可看到输出版本号即说明安装成功。\n安装nvm后，建议安装最新的LTS版本node.js环境作为默认环境。\nnvm install --lts 执行完毕后，输入node -v可看到输出版本号即说明安装成功。\n设置pip、uv镜像源 # [可选，建议配置]\n设置pip包镜像源为阿里云镜像源，可加速Python包下载速度，设置后同样适用于uv\nmkdir ~/.pip vim ~/.pip/pip.conf 在~/.pip/pip.conf中添加如下内容：\n[global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com 设置npm、bun镜像源 # [可选，建议配置]\n设置npm包镜像源为阿里云镜像源，可加速node.js包下载速度，设置后同样适用于bun\nnpm config set registry https://registry.npmmirror.com 安装OpenCode # OpenCode是类似ClaudeCode、CodeX的开源平替工具\nbun add -g opencode-ai 输入opencode -v可看到输出版本号即说明安装成功。\n配置OpenCode大模型 # 使用opencode命令进入OpenCode，输入/connect选择大模型供应商，配置API Key即可使用。\nOpenCode同样提供OpenCode Go和OpenCode Zen大模型服务，这两个服务聚合力主流的大模型，可按需切换使用。OpenCode Go相对便宜，聚合了大量开源优质大模型；OpenCode Zen相对贵一些，聚合了大量闭源优质模型。可访问https://opencode.ai/了解更多。\n安装oh-my-opencode插件 # oh-my-opencode是OpenCode的增强插件。\n打开OpenCode，粘贴如下内容并执行即可\nInstall and configure oh-my-opencode by following the instructions here: https://raw.githubusercontent.com/code-yeongyu/oh-my-opencode/refs/heads/master/docs/guide/installation.md 安装MiniCode # MiMoCode是小米参考OpenCode开发的CLI工具，对中文支持友好。\ncurl -fsSL https://mimo.xiaomi.com/install | bash 使用source ~/.bashrc或退出重新进入虚机，输入mimo -v可看到输出版本号即说明安装成功。\n可选配置 # 设置网络代理脚本 # 将以下脚本追加至~/.bashrc中，这样可以使用命令proxy_on开启代理，proxy_off关闭代理，proxy_status查看代理状态，也可以使用curl https://www.google.com测试是否代理生效。\n# 开启代理 (默认地址为 http://127.0.0.1:7897，请根据你的实际情况修改) proxy_on() { # 如果传入了参数，则使用传入的参数作为代理地址；否则使用默认地址 local proxy_url=${1:-\u0026#34;http://127.0.0.1:7897\u0026#34;} export http_proxy=\u0026#34;$proxy_url\u0026#34; export https_proxy=\u0026#34;$proxy_url\u0026#34; export HTTP_PROXY=\u0026#34;$proxy_url\u0026#34; export HTTPS_PROXY=\u0026#34;$proxy_url\u0026#34; # 设置不走代理的本地地址 (非常重要，否则本地服务可能无法访问) export no_proxy=\u0026#34;localhost,127.0.0.1,::1\u0026#34; export NO_PROXY=\u0026#34;localhost,127.0.0.1,::1\u0026#34; echo \u0026#34;✅ 代理已开启: $proxy_url\u0026#34; } # 关闭代理 proxy_off() { unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY echo \u0026#34;❌ 代理已关闭\u0026#34; } # 查看当前代理状态 proxy_status() { if [ -n \u0026#34;$http_proxy\u0026#34; ]; then echo \u0026#34;🌐 当前代理状态: 已开启\u0026#34; echo \u0026#34; 代理地址: $http_proxy\u0026#34; else echo \u0026#34;🚫 当前代理状态: 未开启\u0026#34; fi } 取消磁盘挂载 # [WSL建议配置]\nWSL默认会挂载主机上的磁盘至/mnt目录中，将以下脚本追加至~/.bashrc中可以取消默认挂载指定盘。如果不取消挂载，那么从WSL中会直接访问到主机文件，有误操作风险。WSL中安装了一些搜索软件（如plocate），因为挂载了主机上的磁盘文件，索引速度会变慢。如果没有必要，建议取消所有挂载。\n# 卸载主机磁盘 if mountpoint -q /mnt/c; then sudo umount /mnt/c; fi if mountpoint -q /mnt/d; then sudo umount /mnt/d; fi if mountpoint -q /mnt/e; then sudo umount /mnt/e; fi if mountpoint -q /mnt/f; then sudo umount /mnt/f; fi 设置取消挂载免密，否则每次进入系统会要求输入密码，创建文件sudo vim /etc/sudoers.d/umount-wsl，文件内容如下：\n# 增加如下内容，注意xxxx需要改为对应的用户名 xxxx ALL=(ALL) NOPASSWD: /usr/bin/umount ","date":"2026年7月7日","externalUrl":null,"permalink":"/posts/wsl-setup-and-config-guide/","section":"Posts","summary":"介绍Windows上安装WSL及配置WSL虚拟机的基本方法","title":"WSL安装及WSL Linux环境常用配置手册","type":"posts"},{"content":"","date":"2026年7月7日","externalUrl":null,"permalink":"/","section":"我的个人笔记","summary":"","title":"我的个人笔记","type":"page"},{"content":"","date":"2019年2月2日","externalUrl":null,"permalink":"/tags/pip/","section":"Tags","summary":"","title":"Pip","type":"tags"},{"content":"","date":"2019年2月2日","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":" 简介 # 本文将介绍：\nPython包是什么？ 如何安装Python包？ 以及Python的常用包管理工具pip(Package Installer for Python)的常用方法和配置方式。 Python包 # 在常见的语言中，都会将一个或一组功能封装好，以包的形式发布复用。比如：Java使用maven构建jar包、war包；Node.js使用npm安装管理包。\nPython中也有包这一概念。Python包的格式也是经历了几代的进步，最早有.egg包（Python是大蟒，egg是蛋，那么Python的包就叫做egg），后来有.whl包，直到如今很多包使用.zip、.tar.gz。如今的Python包已经越来越好用了。\nPython包安装方法 # Python包如何安装呢？以下将介绍一下Python包的手动安装方式。\n安装Python包，绝大多数情况下建议使用本文后半部分的pip方式安装，只在万不得已的情况下使用手动安装。例如：只有安装包，而没有网络时候。\n以下将介绍如何手动安装Python中一个大名鼎鼎的包——requests，其它包的安装方式类似，request包下载地址如下：\nhttps://files.pythonhosted.org/packages/52/2c/514e4ac25da2b08ca5a464c50463682126385c4272c18193876e91f4bc38/requests-2.21.0.tar.gz\n下载好包之后，在任意目录解压开，可以看到如下的目录结构：\n`-- requests-2.21.0 |-- HISTORY.md |-- LICENSE |-- MANIFEST.in |-- Pipfile |-- Pipfile.lock |-- PKG-INFO |-- pytest.ini |-- README.md |-- requests |-- requests.egg-info |-- setup.cfg |-- setup.py `-- tests 其中setup.py是一个很关键的文件\n在setup.py同级目录中使用如下命令即可安装requests包\npython setup.py install 注意：\n务必在setup.py同级目录中执行如上命令，否则会有可能导致安装失败 安装时打印的日志如果没有异常，那么安装就顺利完成啦 不同平台由于用户权限的问题，在执行python setup.py install时，可能需要root权限，在最前面加sudo，即sudo python setup.py install 由于Python包之间可能存在依赖关系，安装A包时候如果依赖了B包，但是B包如果没有安装，那么A包会安装失败，所以还是建议使用更高级的pip来进行包管理 pip是神马？PyPI是神马？ # pip is the package installer for Python. You can use pip to install packages from the Python Package Index and other indexes.\n以上这段是pip官方的一段话，解释了pip和PyPI是什么，以及两者之间的关系。\n简单的来讲，pip（Package Installer for Python）就是Python的安装工具。使用pip可以从PyPI（Python Package Index）官方索引下载并安装Python包，或者从其他镜像源下载。\n使用pip安装Python包的时候，可以解决包依赖之间的问题，也可以一次下载安装多个Python包，目前pip已经是Python官方所支持的包安装工具。在某些环境（例如Windows）上安装Python时，已经自带pip工具。\n常用的PyPI镜像如下：\nPyPI官方：https://pypi.org/ 阿里PyPI镜像源：https://mirrors.aliyun.com/pypi/simple/ 网易PyPI镜像源：http://mirrors.163.com/pypi/simple/ 豆瓣PyPI镜像源：https://pypi.doubanio.com/simple/ pip的安装方法 # Windows系统安装pip # Windows上安装包目前已经自带了pip，安装时勾选pip即可。\nUbuntu系统安装pip # Ubuntu上通常并没有自带pip，使用apt即可安装pip，命令如下：\n# 安装Python3对应的pip sudo apt install python3-pip # 安装Python2对应的pip sudo apt install python-pip CentOS系统安装pip # 通常yum的官方仓库中木有pip，呵呵\nso~\n参考下面的通用安装pip方法\n通用安装pip方法 # 由于各平台包管理工具对于pip支持不尽相同，因此有时候不得不使用手动方式安装pip，手动安装方式在Windows、CentOS、Ubuntu、Mac等系统上均适用。\n下载安装包\n从PyPI搜索并下载https://pypi.org/，下载时候如果没有特殊要求，那就直接下载最新的稳定版本；\n或者从点击如下超链接直接下载：\npip-19.0.3.tar.gz 安装pip\n# 解压pip包 tar -xvf pip-19.0.3.tar.gz # 进入目录 cd pip-19.0.3 # 安装pip python setup.py install 注意：\n不同平台上由于Python环境不同，可能有些环境上安装pip时会报缺少setuptools，例如：\nTraceback (most recent call last): File \u0026#34;setup.py\u0026#34;, line 6, in \u0026lt;module\u0026gt; from setuptools import find_packages, setup ImportError: No module named setuptools 在这种情况下，需要先手动安装setuptools，可以从PyPI搜索下载，或点击此处setuptools-40.8.0.zip下载安装包。\npip的常用操作 # 搜索包\n# 搜索 名称为xxx 的包 pip search xxx 示例：搜索名为request的包\n$ pip search requests requests-hawk (1.0.0) - requests-hawk requests-dump (0.1.3) - `requests-dump` provides hook functions for requests. ... requests (2.21.0) - Python HTTP for Humans. ... 安装包\n# 安装 名称为xxx 的包 pip install xxx 示例\n# 安装 名称为requests 的包 pip install requests # 安装 名称为requests，版本为2.21.0 的包 pip install requests==2.21.0 # 安装 名称为requests，版本号小于等于2.20 的包 pip install \u0026#39;requests\u0026lt;=2.20\u0026#39; # 安装 名称为requests，版本号大于等于2.10且小于2.15 的包 pip install \u0026#39;requests\u0026gt;=2.10,\u0026lt;2.15\u0026#39; 卸载包\n# 卸载 名称为xxx 的包 pip uninstall xxx 示例\n# 卸载 名称为requests 的包 pip uninstall requests 列出当前环境已安装的Python包\n$ pip list Package Version --------------------- ---------- pip 18.0 pipenv 2018.11.26 requests 2.21.0 setuptools 39.0.1 virtualenv 16.0.0 ... pip镜像配置 # 使用pip安装包时，默认会从PyPI官方下载包。由于网络的原因，通常会下载比较慢或者无法下载。为了解决这个问题，可以修改默认的pip下载镜像源，改为速度较快的镜像源。\n以下示例为修改pip镜像源为阿里巴巴开源镜像站的PyPI镜像源（若使用其它镜像源，配置方法类似）：\n在Linux系统或Mac系统创建文件：~/.pip/pip.conf 在Windows系统创建文件：%USERPROFILE%\\pip\\pip.ini 具体文件内容如下：\n[global] index-url = https://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com 按照如上配置后，再使用pip安装包时，就会从指定的镜像源下载包了，然后就可以开始愉快的玩耍啦~\n","date":"2019年2月2日","externalUrl":null,"permalink":"/posts/tutorial-pip/","section":"Posts","summary":"介绍 Python 包的概念、安装方法以及常用包管理工具 pip 的使用与配置。","title":"tutorial-pip","type":"posts"},{"content":"","date":"2018年9月9日","externalUrl":null,"permalink":"/tags/kubernetes/","section":"Tags","summary":"","title":"Kubernetes","type":"tags"},{"content":"","date":"2018年9月9日","externalUrl":null,"permalink":"/tags/rancher/","section":"Tags","summary":"","title":"Rancher","type":"tags"},{"content":" 简介 # 本文将介绍在VMware虚拟环境下使用Rancher部署Kubernetes\n依赖版本 # docker: 17.03.3-ce rancher: v1.6.21 kubernetes: v1.10.5 helm: v2.8.2 包含Docker的VMware虚拟环境创建 # 虚拟机创建\n新建一个Linux的虚拟环境vm01，建议为CentOS7.x或Ubuntu18.04\n安装docker\n安装参考: https://docs.docker.com/install/\n安装好后设置镜像和dns\nsudo vim /etc/docker/daemon.json\n{ \u0026#34;registry-mirrors\u0026#34;: [ \u0026#34;https://registry.docker-cn.com\u0026#34; ], \u0026#34;dns\u0026#34;:[ \u0026#34;114.114.114.114\u0026#34;, \u0026#34;8.8.8.8\u0026#34;, \u0026#34;8.8.4.4\u0026#34; ] } 创建快照 基于vm01快照创建新的虚拟机vm02\n在vm02中修改：\nubuntu sudo vim /etc/cloud/cloud.cfg: 设置preserve_hostname: true\n修改hostname和hosts\nhostname 作用 vm01 部署rancher vm02 部署kubernetes Rancher部署 # vm01上部署Rancher\n安装Rancher\n使用docker-compose拉起Rancher，docker-compose使用方法参见：《使用docker-compose编排容器快速上手指南》\ndocker-compose.yaml如下\nversion: \u0026#39;2.2\u0026#39; services: rancher: image: rancher/server:v1.6.21 container_name: rancher hostname: rancher environment: - TZ=Asia/Shanghai ports: - 8080:8080 restart: always 配置Rancher主机\n访问http://vm01:8080\n添加主机\nRancher API地址确认\n添加主机，将生成的脚本复制并在Rancher的主机vm01上执行\n稍等片刻，rancher会自动下载相关的镜像并拉起容器\n部署Kubernetes # vm02上部署kubernetes\n添加Kubernetes环境\n【环境管理】-【添加环境】-选择Kubernetes\n获取添加kubernetes脚本\n切换至kubernetes环境页面\n添加主机，将生成的脚本复制并在Kubernetes的主机vm02上执行\n执行后稍等片刻 完成后可以查看主机上的信息 配置kubectl\n# 安装kubectl curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.10.5/bin/linux/amd64/kubectl sudo mv ./kubectl /usr/local/bin/kubectl sudo chmod +x /usr/local/bin/kubectl 将kubectl配置写入vm02的~/.kube/config中 部署helm # 配置了kubectl配置文件的vm02上安装helm客户端\n安装helm\nwget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz tar -xvf helm-v2.8.2-linux-amd64.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm sudo chmod +x /usr/local/bin/helm 初始化helm\nhelm init ","date":"2018年9月9日","externalUrl":null,"permalink":"/posts/rancher-k8s-deploy/","section":"Posts","summary":"介绍在 VMware 虚拟环境中使用 Rancher 部署 Kubernetes。","title":"使用rancher部署kubernetes介绍","type":"posts"},{"content":"","date":"2018年9月9日","externalUrl":null,"permalink":"/tags/go/","section":"Tags","summary":"","title":"Go","type":"tags"},{"content":" 简介 # 本文介绍Go开发环境的配置方法\nSDK 安装 # 安装包下载\n下载地址：https://golang.org/dl/ 下载Windows、Linux或Mac平台下的安装包\n安装SDK\nLinux, Mac上执行\n# 注意修改包名 tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz Windows上执行exe进行安装\n配置环境变量\nLinux, Mac\nexport GOHOME=/usr/local/go export PATH=$PATH:$GOHOME/bin export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin Windows\n新建环境变量GOHOME，值为Go安装位置\n新建环境变量GOPATH，设置并创建一个路径，例如：D:\\AppData\\go\nPATH中追加：;%GOHOME%\\bin;%GOPATH%\\bin;\n验证\n命令行中输入go version可以正常查看go版本信息\nGoLand # 下载GoLand安装包\n下载地址：https://www.jetbrains.com/go/download/\n安装GoLand\n执行安装包，根据提示安装\n下载go工程\n可以下载我的示例工程：\ngo get github.com/yancai/hello-go 下载好后，所在位置为$GOPATH/src/github.com/yancai/hello-go\n命令行构建运行\n# 命令行中执行 go build github.com/yancai/hello-go # 在命令行当前目录中会生成 可执行文件hello-go 或 hello-go.exe # Linux, Mac执行如下 ./hello-go # Windows执行如下 hello-go.exe # 输出： # Hello go! 使用GoLand开发\n【Open Project】 -\u0026gt; 选择工程目录$GOPATH/src/github.com/yancai/hello-go，打开工程目录即可完成工程导入\n开发Debug方式和JetBrains其他产品（IDEA、PyCharm）类似\n其它 # 开发过程中，如需下载第三方包，执行如下命令 go get xxx ","date":"2018年9月9日","externalUrl":null,"permalink":"/posts/go-env/","section":"Posts","summary":"介绍 Go 开发环境的配置方法。","title":"go开发环境配置","type":"posts"},{"content":"","date":"2018年8月8日","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":" 简介 # 假如你有一个比较好的docker镜像怎么发布出来供大家使用呢？ 你是否遇到过国外某些镜像很难下载下来呢？ 你是否想过拥有一个自己的镜像仓库呢？ 本文将介绍如何使用Docker Hub和阿里云的容器镜像服务来创建自己的docker镜像仓库\nDockerfile # 以下为本文构建镜像时所使用的Dockerfile\nFROM k8s.gcr.io/etcd-amd64:3.1.12 MAINTAINER yancai yancai915@gamil.com 文件托管于https://github.com/yancai/myDockerfiles/blob/master/kubernetes/etcd-amd64/Dockerfile\nDocker Hub # 打开https://hub.docker.com\n注册一个Docker Hub用户，并登录\n绑定GitHub账号\n点击【Setting】 - 【Linked Accounts \u0026amp; Service】绑定Github账号\n选择Public and Private\n跳转至GitHub页面，授权即可\n授权后可以看到已经绑定成功\n创建构建计划\n点击【Create】-【Create Automated Build】，选择GitHub\n选择Dockerfile所在的仓库\n填写镜像名称和介绍信息后点击【Create】\n设置构建计划\n选择【Type】，选择Branch或Tag\n填写【Name】，填写Branch或Tag的名称\n填写【Dockerfile Location】，此路径为相对于GitHub仓库代码根目录的Dockerfile所在的路径\n填写【Docker Tag Name】，版本信息\n完成后点击【Save Changes】保存\n触发构建\n首次保存构建信息后，如需开始构建需要手动点击【Trigger】触发构建。稍等片刻即可完成构建。\n之后在GitHub上修改了相关代码提交后会自动触发Docker Hub构建。\n下载镜像\n构建完成后可以根据【Repo Info】和【Tags】中的镜像信息下载镜像，例如本示例下载方式为：\nsudo docker pull yancai/demo-image:3.1.12 Docker Hub提供的镜像构建服务挺好用的，唯一就是构建好之后下载镜像时候，由于网络原因可能会十分慢。可以借用国内的一些类似Docker Hub的镜像服务来进行镜像构建和下载。\n以下将介绍如何在阿里云容器Hub上进行Docker镜像构建和下载。\n阿里云 镜像容器服务 # 打开https://dev.aliyun.com\n注册一个阿里云账号，并登录，进入容器镜像服务页面\n绑定GitHub账号\n点击【代码源】-【Github 绑定账号】进行授权绑定代码源\n创建镜像仓库\n点击【镜像仓库】-【创建镜像仓库】 选择【地域】\n选择【命名空间】，如果没有则点击左侧【命名空间】创建命名空间\n填写【仓库名称】、【摘要】、【描述信息】\n选择【仓库类型】\n点击下一步继续\n选择GitHub，绑定Dockefile对应的仓库\n如果有些镜像在国内拉取比较慢或者无法拉取，可以勾选【海外机构建】\n点击【创建镜像仓库】保存镜像信息\n点击对应仓库的【管理】设置构建详情\n点击【构建】-【添加规则】\n选择代码分支或Tag 填写【Dockerfile目录】，此路径为相对于GitHub仓库代码根目录的Dockerfile所在的路径\n填写【Dockerfile文件名】\n填写【镜像版本】\n点击【确认】保存\n触发构建\n首次保存构建信息后，如需开始构建需要手动点击【立即构建】触发构建。稍等片刻即可完成构建。\n如果开启了【代码变更时自动构建镜像】，那么在GitHub上修改了相关代码提交后会自动触发构建。\n下载镜像\n构建完成后根据镜像的【基本信息】、【镜像版本】中的内容可以获取到下载镜像的地址。\n例如本示例镜像下载方式为：\nsudo docker pull registry.cn-hangzhou.aliyuncs.com/yancai/demo:3.1.12 使用阿里云下载构建好的镜像，感觉就一个字：快！\n如此，国外有些镜像难以下载时候，使用阿里云间接拉取构建，下载到本地后重命名镜像名称，这样也就间接的下载了一些无法拉取下来的镜像。\n","date":"2018年8月8日","externalUrl":null,"permalink":"/posts/publish-your-image/","section":"Posts","summary":"介绍使用 Docker Hub 和阿里云容器镜像服务发布个人 docker 镜像的方法。","title":"发布你的个人docker镜像","type":"posts"},{"content":"","date":"2018年8月8日","externalUrl":null,"permalink":"/tags/minikube/","section":"Tags","summary":"","title":"Minikube","type":"tags"},{"content":" 简介 # 本文将介绍使用minikube单机部署kubernetes的方法。\n版本 # minikube:0.28.2 docker:17.03.x-ce 安装指南 # 安装docker\n详见https://docs.docker.com/install/\n安装minikube\n执行命令\ncurl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v0.28.2/minikube-linux-amd64 \u0026amp;\u0026amp; chmod +x minikube \u0026amp;\u0026amp; sudo cp minikube /usr/local/bin/ \u0026amp;\u0026amp; rm minikube 下载docker镜像\nminikube安装过程中会下载docker所需的镜像，需要下载的镜像包含：\ngcr.io/k8s-minikube/storage-provisioner:v1.8.1 k8s.gcr.io/etcd-amd64:3.1.12 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8 k8s.gcr.io/kube-addon-manager:v8.6 k8s.gcr.io/kube-apiserver-amd64:v1.10.0 k8s.gcr.io/kube-controller-manager-amd64:v1.10.0 k8s.gcr.io/kube-proxy-amd64:v1.10.0 k8s.gcr.io/kube-scheduler-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.1 k8s.gcr.io/pause-amd64:3.1 由于网络原因以上镜像下载会经常失败，可以从我本人的阿里云镜像仓库中下载，地址为：\nregistry.cn-hangzhou.aliyuncs.com/yancai/storage-provisioner:v1.8.1 registry.cn-hangzhou.aliyuncs.com/yancai/etcd-amd64:3.1.12 registry.cn-hangzhou.aliyuncs.com/yancai/k8s-dns-dnsmasq-nanny-amd64:1.14.8 registry.cn-hangzhou.aliyuncs.com/yancai/k8s-dns-kube-dns-amd64:1.14.8 registry.cn-hangzhou.aliyuncs.com/yancai/k8s-dns-sidecar-amd64:1.14.8 registry.cn-hangzhou.aliyuncs.com/yancai/kube-addon-manager:v8.6 registry.cn-hangzhou.aliyuncs.com/yancai/kube-apiserver-amd64:v1.10.0 registry.cn-hangzhou.aliyuncs.com/yancai/kube-controller-manager-amd64:v1.10.0 registry.cn-hangzhou.aliyuncs.com/yancai/kube-proxy-amd64:v1.10.0 registry.cn-hangzhou.aliyuncs.com/yancai/kube-scheduler-amd64:v1.10.0 registry.cn-hangzhou.aliyuncs.com/yancai/kubernetes-dashboard-amd64:v1.8.1 registry.cn-hangzhou.aliyuncs.com/yancai/pause-amd64:3.1 从阿里云上下载下来，然后重命名镜像即可。\n例如：\n如果要下载镜像k8s.gcr.io/pause-amd64:3.1\n# 先从对应的阿里云仓库中下载 sudo docker pull registry.cn-hangzhou.aliyuncs.com/yancai/pause-amd64:3.1 # 添加tag sudo docker tag registry.cn-hangzhou.aliyuncs.com/yancai/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1 # 删除原有镜像tag sudo docker rmi registry.cn-hangzhou.aliyuncs.com/yancai/pause-amd64:3.1 启动minikube\nsudo minikube start --vm-driver=none 使用dashboard查看kubernetes\n# 此命令可查看dashboard的访问地址，浏览器中打开即可 sudo minikube dashboard --url ","date":"2018年8月8日","externalUrl":null,"permalink":"/posts/minikube-install/","section":"Posts","summary":"介绍使用 minikube 单机部署 kubernetes 的方法。","title":"minikube 安装介绍","type":"posts"},{"content":"","date":"2018年7月7日","externalUrl":null,"permalink":"/tags/tools/","section":"Tags","summary":"","title":"Tools","type":"tags"},{"content":" 介绍 # “工欲善其事，必先利其器” ——《论语·卫灵公》 好的工具对于日常工作效率提升是很有帮助的，以下为我自己总结的一些很有用的好工具，更多的工具将逐步补充完善。\n工具列表目录 # 介绍 工具列表目录 工具介绍 效率 固态硬盘 Windows原生快速启动 Everything Ditto Snipaste Listary cmder Windows Terminal + WSL Beyond Compare 文本编辑器 Vim Notepad4 Visual Studio Code Typora 设计 Enterprise Architect Visio 远程工具 OpenSSH MobaXterm PuTTY Xshell 数据库 Robomongo MongoDB Compass DBeaver 工具介绍 # 效率 # 固态硬盘 # 适用系统：\nWindows | Mac | Linux\n非官方介绍：\n这年头了，还有好多人没有体验过固态硬盘的感觉，赶紧装固态硬盘吧\n目前市面上主流电脑都应该有固态硬盘，如果没有固态硬盘，用Windows的话，建议买个120~128G的就够用了，分两个盘，80G的盘用来安装系统，其它剩下的40G+用来装常用的软件，用起来相当爽\n使用场景：\n电脑卡卡卡、慢慢慢\nWindows原生快速启动 # 适用系统：\nWindows\n配置方法：\n在%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\建立一个文件夹Tools，常用的快捷方式直接丢到这个文件夹中，也可以把这个文件夹发送到桌面快捷方式方便经常打开使用。\n使用方法：\n需要快速启动应用时，只需按Win键并直接输入快捷方式的名称，系统会自动筛选出对应的应用，然后回车直接打开。\nWindows上基本都可以，Win10上体验更好。如此一来就不再安装Launchy、Wox等快速启动工具\n使用场景：\n我的那啥应用在哪？\nEverything # 主页：\nhttp://www.voidtools.com/\n适用系统：\nWindows\n官方介绍：\nLocate files and folders by name instantly.\n非官方介绍：\nWindows文件查找利器\n使用场景：\n我的那个啥文件在哪？\nDitto # 主页：\nhttps://ditto-cp.sourceforge.io/\n适用系统：\nWindows\n官方介绍：\nClipboard Manager\n非官方介绍：\n剪贴板管理好帮手\n使用场景： 复制过的再复制，啊呀，又要复制下刚才的东西\nSnipaste # 主页：\nhttps://www.snipaste.com/\n适用系统：\nWindows | Mac\n官方介绍：\nSnip \u0026amp; Paste\n非官方介绍：\n简单强大的截图工具\n使用场景：\n截图，贴图功能很好用\nListary # 主页：\nhttps://www.listary.com/\n适用系统：\nWindows\n官方介绍：\nFile Search \u0026amp; App Launcher\n非官方介绍：\n文件搜索和快速启动\n使用场景： 搜索文件；快速打开应用；我更喜欢的是使用快速选择文件夹的功能，Windows上传、下载、保存文件时通常要手动选择。使用Listary如果这个文件夹已经打开了，点到对应文件夹，再切回文件选择窗口，这是就已经自动选择到了刚才已经打开的文件夹\ncmder # 推荐使用Windows Terminal + WSL替代\n主页：\nhttp://cmder.net/\n适用系统：\nWindows\n官方介绍： Portable console emulator for Windows\n非官方介绍：\nWindows增强命令行工具\n使用场景：\n嫌弃cmd丑丑的界面\nWindows Terminal + WSL # 主页： Windows Terminal：https://github.com/microsoft/terminal WSL：https://github.com/microsoft/WSL\n适用系统： Windows\n官方介绍： Windows Terminal: The new Windows Terminal and the original Windows console host, all in the same place! WSL: Windows Subsystem for Linux\n非官方介绍： Windows上丝滑体验Linux\n使用场景： Windows上使用Linux开发\nBeyond Compare # 主页：\nhttps://www.scootersoftware.com/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\n（见过最详[冗]细[长]的介绍了）\nCompare files and folders using simple, powerful commands that focus on the differences you\u0026rsquo;re interested in and ignore those you\u0026rsquo;re not. Merge changes, synchronize files, and generate reports.\nBeyond Compare中文版是一款专业的文本文件对比工具，可以高效的针对文件、文件夹、表格、mp3、图片、数据、注册表等文件并进行比较、合并、同步分析，并把相差的每一个字节用颜色加以表示，查看方便。\n非官方介绍：\n灰常强大的对比工具\n中文官网下载时候需要填写个人信息，不想泄露个人信息的话，可以从英文官网下载，下载地址为：https://www.scootersoftware.com/download.php\n使用场景：\n这俩文件（夹）有啥区别嘞？\n文本编辑器 # Vim # 主页：\nhttps://www.vim.org/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nthe ubiquitous text editor\n非官方介绍：\n程序猿中普及的诡异而又高效的编辑器\n使用场景：\n换个思维方式来编辑文本\nNotepad4 # 主页：\nhttps://github.com/zufuliu/notepad4\n适用系统：\nWindows\n官方介绍：\na light-weight text editor for Windows\n非官方介绍：\n小巧，实用，漂亮的文本编辑器\n使用场景：\n想要替换Windows显得简陋的记事本（notepad.exe）工具\nVisual Studio Code # 主页：\nhttps://code.visualstudio.com/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nCode editing. Redefined.\n非官方介绍：\n微软出品的跨平台的优质代码编辑器\n使用场景：\n开发利器，一个轻量级（现在不轻了）开发好工具\nTypora # 主页：\nhttps://www.typora.io/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nTypora — a markdown editor, markdown reader. 非官方介绍： 高颜值所见即所得的markdown编辑器\n使用场景：\n两个栏写markdown太复杂了，编辑直接看\n设计 # Enterprise Architect # 主页：\nhttp://sparxsystems.com/products/ea/index.html\n适用系统：\nWindows\n官方介绍：\nUML Design Tools and UML CASE tools for software development\n非官方介绍：\n专业的UML设计软件\n使用场景：\n是时候找个强大专业的工具来设计下我的工程了\nVisio # 主页：\nhttps://products.office.com/en-US/visio\n适用系统：\nWindows | Mac\n官方介绍：\nFlowchart Maker \u0026amp; Diagramming Software\n非官方介绍：\nOffice绘制UML小帮手\n使用场景：\n画个漂亮的流程图\n远程工具 # OpenSSH # 主页：\nhttps://www.openssh.com/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nOpenSSH is the premier connectivity tool for remote login with the SSH protocol\n非官方介绍：\n原始好用的SSH工具\nMac, Linux上自带，Windows10之后也提供了可选安装的OpenSSH客户端\n使用场景：\n快！我要连上那个服务器！\nMobaXterm # 主页：\nhttps://mobaxterm.mobatek.net/\n适用系统：\nWindows\n官方介绍：\nMobaXterm free Xserver and tabbed SSH client for Windows\n非官方介绍：\nWindows上简单、免费、好用、功能强大的远程工具，除了SSH还支持远程Windows哦。另外MobaXterm的分屏同时输入功能很好用。\n使用场景：\n换个赏心悦目的远程工具吧\nPuTTY # 主页：\nhttps://www.putty.org/\n适用系统：\nWindows\n官方介绍：\na free SSH and telnet client for Windows\n非官方介绍：\n小巧的SSH客户端\nWindows10上安装了系统自带的SSH客户端后，我觉得PuTTY作用已经不是很大了。如果说小巧，Windows10自带的ssh客户端才是真小巧，如果论功能，远不及MobaXterm和Xshell\n另外PyTTY有很多网友改装版，在此就不列举了，大家可以自己搜搜\n使用场景：\n我不嫌丑，就想来个轻便而不简陋的SSH客户端\nXshell # 主页：\nhttps://www.netsarang.com/products/xsh_overview.html\n适用系统：\nWindows\n官方介绍：\nThe Industry’s Most Powerful SSH Client\n非官方介绍：\n是个不错的ssh客户端，但是官方介绍口气大的不行不行的。使用此工具时请注意版权！用于商业时请尊重版权。我工作过有两家大公司都因为版权问题禁止使用。\n使用场景：\n换个666的SSH客户端\n数据库 # Robomongo # 主页：\nhttps://robomongo.org/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nnative MongoDB management tool (Admin UI)\n非官方介绍：\n好用的MongoDB管理工具，支持界面化查看数据，支持使用mongo命令查询数据\n以前叫做Robomongo，后来改名为Robo 3T，另外现在还有更专业的Studio 3T\n使用场景：\n来个轻便好用的MongoDB开发者工具\nMongoDB Compass # 主页：\nhttps://www.mongodb.com/products/compass\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nThe easiest way to explore and manipulate your MongoDB data\n非官方介绍：\n这是官方的MongoDB管理工具，好用哦\n使用场景：\n官方工具闪亮登场\nDBeaver # 主页：\nhttps://dbeaver.com/\n适用系统：\nWindows | Mac | Linux\n官方介绍：\nUniversal Database Manager\n非官方介绍：\n多种数据库的管理好工具\n此工具分免费的社区版（DBeaver CE）和收费的企业版（DBeaver EE）\n使用场景：\n来个跨平台支持各种数据库的管理工具\n","date":"2018年7月7日","externalUrl":null,"permalink":"/posts/good-tools/","section":"Posts","summary":"整理作者日常使用的一些实用好工具，持续补充中。","title":"好工具集合","type":"posts"},{"content":"","date":"2018年6月6日","externalUrl":null,"permalink":"/tags/debug/","section":"Tags","summary":"","title":"Debug","type":"tags"},{"content":"","date":"2018年6月6日","externalUrl":null,"permalink":"/tags/pycharm/","section":"Tags","summary":"","title":"PyCharm","type":"tags"},{"content":" 简介 # 本文将介绍如何使用PyCharm进行远程调试Python代码。\n准备 # PyCharm 远程环境，本例中为linux系统 方法一：使用远程解释器调试 # 准备代码\n以下为需要远程调试的代码demo.py\n#!/usr/bin/python # -*- coding:utf-8 -*- import socket def hello_world(name=\u0026#34;world!\u0026#34;): print(\u0026#34;hello \u0026#34; + name) hostname = socket.gethostname() print(hostname) if __name__ == \u0026#34;__main__\u0026#34;: hello_world() PyCharm连接到远程环境\n点击【Tools】-【Deployment】-【Configuration】\n点“+”加号，新增一个sftp配置 填写host, port, User name, Password等信息，填写好后可以点击Test SFTP connection...来测试配置是否正确。可以点击Autodetect自动填写Root path，或者手动配置\n点击【Mappings】来配置远程服务器目录和本地目录映射关系，填写Local path, Deployment path on server，也可以点击右侧...来手动选择目录。注意，Deployment path on server填写的是以Root path为根目录的相对路径，可以在【Excluded Paths】中填写需要被排除同步的文件或文件夹，点击OK保存配置 上传代码至远程服务器\n在需要上传的代码或文件夹上点击右键-【Deployment】-【Upload to \u0026hellip;】，即可将代码上传至远程服务器\n可以点击【Tools】-【Deployment】-【Browse Remote Host】查看远程服务器Root path下的目录结构 配置远程解释器\n点击【settings】-【Project Interpreter】-【右上方小齿轮】-【add】 点击【SSH Interpreter】-【Existing server configuration】，然后选择move，下一步 填写Interpreter（远程服务器Python解释器路径）,以及Sync folders（本地目录和远程目录的映射关系），点击Finish完成 开始调试或运行\n在保证远程Python解释器环境安装了工程所需的依赖包后，开始调试或者运行即可\n方法二：使用pycharm-debug包调试 # 准备代码\n以下为需要远程调试的代码demo.py，将代码上传至远程服务器上\n#!/usr/bin/python # -*- coding:utf-8 -*- import socket def hello_world(name=\u0026#34;world!\u0026#34;): print(\u0026#34;hello \u0026#34; + name) hostname = socket.gethostname() print(socket.gethostname()) if __name__ == \u0026#34;__main__\u0026#34;: hello_world() 远程服务器上安装pytharm-debug.egg（Python2.x适用）或pycharm-debug-py3k.egg（Python3.x适用）\n安装包位于pycharm安装目中的debug-eggs目录中，将需要的安装包上传至远程服务器上，使用如下命令安装依赖包：\neasy_install pycharm-debug.egg 在本地pycharm中新建远程调试配置\n新建Python Remote Debug 填写本地ip，端口（本地启动调试服务的端口，不和已有端口冲突即可），远程和本地目录映射关系（此处可以不配置，调试启动是选择Download远程代码也可以）\n修改远程需要调试的代码\n将如下代码添加至远程需要被调试的代码中，添加至需要开始调试的地方\nimport pydevd pydevd.settrace(\u0026#39;10.60.84.78\u0026#39;, port=6666, stdoutToServer=True, stderrToServer=True) 例如：\n#!/usr/bin/python # -*- coding:utf-8 -*- import socket import pydevd def hello_world(name=\u0026#34;world!\u0026#34;): print(\u0026#34;hello \u0026#34; + name) pydevd.settrace(\u0026#39;10.60.84.78\u0026#39;, port=6666, stdoutToServer=True, stderrToServer=True) hostname = socket.gethostname() print(hostname) if __name__ == \u0026#34;__main__\u0026#34;: hello_world() 远程代码启动\npython demo.py 启动后，运行至pydevd.settrace(...处会等待pycharm启动debug\nPyCharm启动Remote Debug\n此时若没有配置目录映射，则会提示如下信息： 选择Download可以下载远程代码，也可以配置目录映射\n之后可进入到开始调试了的入口，可以开始调试啦 ","date":"2018年6月6日","externalUrl":null,"permalink":"/posts/pycharm-remote-debug/","section":"Posts","summary":"介绍如何使用 PyCharm 远程调试 Python 代码。","title":"PyCharm远程调试Python代码","type":"posts"},{"content":"","date":"2018年5月5日","externalUrl":null,"permalink":"/tags/hadoop/","section":"Tags","summary":"","title":"Hadoop","type":"tags"},{"content":" 简介 # 本文将介绍分布式部署hadoop方式，各角色部署使用独立的用户\nHDFS 部署 httpfs 部署 yarn 部署 hive 部署 HBase 部署 环境准备 # CentOS-7(Ubuntu亦可，或使用docker容器部署) hadoop-2.6.5.tar.gz zookeeper-3.4.12.tar.gz 计划 # hostname 作用 node1 namenode, datanode, JournalNode, zookeeper node2 namenode, datanode, JournalNode, zookeeper node3 datanode, JournalNode, zookeeper, httpfs 安装步骤 # 配置zookeeper # # 添加zookeeper用户 useradd zookeeper # 解压并安装zookeeper包 tar -xvf zookeeper-3.4.12.tar.gz mv zookeeper-3.4.12 /opt/ chown root:root /opt/zookeeper-3.4.12/ -R ln -vs /opt/zookeeper-3.4.12/ /opt/zookeeper # 创建配置文件 cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg # 创建日志和数据目录 mkdir /var/log/zookeeper chown zookeeper:zookeeper /var/log/zookeeper/ mkdir /var/lib/zookeeper chown zookeeper:zookeeper /var/lib/zookeeper/ 在node1上执行：echo 1 \u0026gt; /var/lib/zookeeper/myid 在node2上执行：echo 2 \u0026gt; /var/lib/zookeeper/myid 在node3上执行：echo 3 \u0026gt; /var/lib/zookeeper/myid\n执行vim /opt/zookeeper/conf/zoo.cfg 底部添加如下内容\ndataDir=/var/lib/zookeeper server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 执行vim /opt/zookeeper/bin/zkEnv.sh 修改如下内容\nif [ \u0026#34;x${ZOO_LOG_DIR}\u0026#34; = \u0026#34;x\u0026#34; ] then ZOO_LOG_DIR=\u0026#34;/var/log/zookeeper\u0026#34; fi 在node1, node2, node3上启动zookeeper\n# 启动 su zookeeper -c \u0026#34;/opt/zookeeper/bin/zkServer.sh start\u0026#34; # 停止 su zookeeper -c \u0026#34;/opt/zookeeper/bin/zkServer.sh stop\u0026#34; SSH 配置 # # 创建用户组hadoop groupadd hadoop # 创建用户hdfs并设置用户组为hadoop useradd hdfs -g hadoop # 设置hdfs密码 passwd hdfs su hdfs # 一路回车 ssh-keygen # 将本主机的公钥分发至node1 ssh-copy-id node1 # 使用ssh-copy-id将： # node1, node2的公钥分发至node1, node2, node3 # node3的公钥分发至node3 配置HDFS # 切换至root用户\n安装和配置 # 解压hadoop安装包 tar -xvf hadoop-2.6.5.tar.gz mv hadoop-2.6.5 /opt/ chown root:root /opt/hadoop-2.6.5 -R ln -vs /opt/hadoop-2.6.5/ /opt/hadoop mkdir /var/log/hadoop-hdfs chown hdfs:hadoop /var/log/hadoop-hdfs mkdir /var/lib/hadoop-hdfs chown hdfs:hadoop /var/lib/hadoop-hdfs 以下修改hdfs相关配置，配置文件位于目录/opt/hadoop/ect/hadoop\n执行vim hadoop-env.sh 修改如下对应配置\nexport HADOOP_LOG_DIR=/var/log/hadoop-hdfs # 此处注意修改为环境中对应的JAVA_HOME路径 export JAVA_HOME=/usr/java/jdk1.8.0_171 执行vim core-site.xml，其中\u0026lt;configuration\u0026gt;节点修改为如下内容\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.tmp.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop-hdfs\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;fs.defaultFS\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;hdfs://mycluster\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;ha.zookeeper.quorum\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node1:2181,node2:2181,node3:2181\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 执行vim hdfs-site.xml，其中\u0026lt;configuration\u0026gt;节点修改为如下内容\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.nameservices\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;mycluster\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.namenodes.mycluster\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node1,node2\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.rpc-address.mycluster.node1\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node1:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address.mycluster.node1\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node1:50070\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.rpc-address.mycluster.node2\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node2:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address.mycluster.node2\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;node2:50070\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.shared.edits.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;qjournal://node1:8485;node2:8485;node3:8485/journal\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.journalnode.edits.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/var/lib/hadoop-hdfs\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.automatic-failover.enabled\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.client.failover.proxy.provider.mycluster\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.methods\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt; sshfence shell(/bin/true) \u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.ssh.private-key-files\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/root/.ssh/id_rsa\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.ssh.connect-timeout\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;30000\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.name.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop-hdfs/nn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.datanode.data.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop-hdfs/dn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 执行vim slaves 替换为如下内容\nnode1 node2 node3 执行cp mapred-site.xml.template mapred-site.xml 复制mapred-site.xml.template为mapred-site.xml\n执行vim mapred-site.xml，其中\u0026lt;configuration\u0026gt;节点修改为如下内容\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.framework.name\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;yarn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 启动journalnode su hdfs -c \u0026#34;/opt/hadoop/sbin/hadoop-daemon.sh start journalnode\u0026#34; # 对应停止命令如下 # su hdfs -c \u0026#34;/opt/hadoop/sbin/hadoop-daemon.sh stop journalnode\u0026#34; 使用jps可以查到JournalNode进程\n如果无法使用jps则需要先导入java环境变量，例如使用source /etc/profile\n初始化namenode\n# node1上执行 su hdfs -c \u0026#34;/opt/hadoop/bin/hdfs namenode -format\u0026#34; su hdfs -c \u0026#34;scp -r /var/lib/hadoop-hdfs/nn hdfs@node2:/var/lib/hadoop-hdfs\u0026#34; su hdfs -c \u0026#34;/opt/hadoop/bin/hdfs zkfc -formatZK\u0026#34; su hdfs -c \u0026#34;/opt/hadoop/sbin/start-dfs.sh\u0026#34; 打开http://node1:50070或http://node2:50070查看hdfs信息\n配置HttpFs # ```sh # 创建用户 useradd httpfs # 创建目录 mkdir /var/log/hadoop-httpfs chown httpfs:httpfs /var/log/hadoop-httpfs/ mkdir /var/tmp/hadoop-httpfs chown httpfs:httpfs /var/tmp/hadoop-httpfs/ # 设置权限 chmod +r /opt/hadoop/share/hadoop/httpfs/tomcat/conf -R ``` vim httpfs-site.xml ```xml \u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;httpfs.proxyuser.hue.hosts\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;*\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;httpfs.proxyuser.hue.groups\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;*\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; ``` vim core-site.xml 添加 ```xml \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.proxyuser.httpfs.hosts\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;*\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.proxyuser.httpfs.groups\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;*\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; ``` vim httpfs-env.sh ```sh export HTTPFS_LOG=/var/log/hadoop-httpfs export HTTPFS_TEMP=/var/tmp/hadoop-httpfs ``` 启动或停止 ```bash su httpfs -c \u0026quot;/opt/hadoop/sbin/httpfs.sh start\u0026quot; su httpfs -c \u0026quot;/opt/hadoop/sbin/httpfs.sh stop\u0026quot; ``` 附 # 以下为本文档中所使用的docker容器构建和编排相关的文档，如果需要使用容器部署hadoop，可以参考使用\nDockerfile # 构建centos7-base镜像所使用的相关文件如下\n目录结构\n├── Dockerfile └── files └── jdk-8u171-linux-x64.tar.gz jdk下载地址：\njdk-8u171-linux-x64.tar.gz\nDockerfile内容\nFROM centos:7.2.1511 MAINTAINER yancai ENV TZ Asia/Shanghai # 设置yum源 安装常用工具 RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \\ \u0026amp;\u0026amp; yum makecache \\ \u0026amp;\u0026amp; yum install -y vim mlocate telnet zlib-devel openssh-server openssh-clients net-tools \\ \u0026amp;\u0026amp; mkdir /usr/java WORKDIR /root # 安装jdk ADD files/jdk-8u171-linux-x64.tar.gz /usr/java RUN echo \u0026#34;export JAVA_HOME=/usr/java/jdk1.8.0_171\u0026#34; \u0026gt;\u0026gt; /etc/profile \\ \u0026amp;\u0026amp; echo \u0026#34;export PATH=\\$JAVA_HOME/bin:\\$PATH\u0026#34; \u0026gt;\u0026gt; /etc/profile \\ \u0026amp;\u0026amp; echo \u0026#34;export CLASSPATH=.:\\$JAVA_HOME/lib/dt.jar:\\$JAVA_HOME/lib/tools.jar\u0026#34; \u0026gt;\u0026gt; /etc/profile \\ \u0026amp;\u0026amp; ln -vs /usr/java/jdk1.8.0_171/bin/java /usr/bin/java 在Dockerfile所在目录使用sudo docker build --tag=\u0026quot;centos7-base\u0026quot; .构建镜像\ndocker-compose.yml # 以下为docker-compose.yml内容：\nversion: \u0026#39;2.2\u0026#39; services: node1: image: centos7-base container_name: node1 hostname: node1 environment: - TZ=Asia/Shanghai command: tail -f /dev/null volumes: - ~/share:/root/share node2: image: centos7-base container_name: node2 hostname: node2 environment: - TZ=Asia/Shanghai command: tail -f /dev/null volumes: - ~/share:/root/share node3: image: centos7-base container_name: node3 hostname: node3 environment: - TZ=Asia/Shanghai command: tail -f /dev/null volumes: - ~/share:/root/share 在docker-compose.yml所在目录使用命令sudo docker-compose up -d启动容器\n使用docker容器部署时，需要开启SSH服务，手动开启方式如下：\n# 在容器内执行 ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key /usr/sbin/sshd ","date":"2018年5月5日","externalUrl":null,"permalink":"/posts/hadoop-deploy/","section":"Posts","summary":"介绍 Hadoop 各角色使用独立用户的分布式部署方式。","title":"Hadoop分布式部署","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/docker-compose/","section":"Tags","summary":"","title":"Docker-Compose","type":"tags"},{"content":" 简介 # 在了解了docker的基本用法以及使用dockerfile构建镜像后，我们可以看起来开森愉快的捣腾docker容器了。 部署个nginx，折腾个tomcat，多版本Python，整个Hadoop等等等等。 爽了一段时间，容器逐渐越来越多时候，就会发现又有了新问题。 比个如，如果要搭建个简单的web服务，使用MySQL数据库（一个容器），使用Python Flask开发web（又一个容器），使用Nginx + uwsgi做反向代理（再一个容器），数据库可能会做读写分离，web服务可能会做高可用或者负载均衡。对于这个常见的场景，最简单那就几个容器一个个启动，彼此间约定好访问的ip或者域名。使用久了就会发现比较麻烦，如果要删除重新拉起一套，一个个查容器id，停止，删除，再启动，容器多了就会超级麻烦。\n一个好的办法就是用docker-compose来管理编排多个服务。\n本文将简单介绍使用docker-compose编排服务的基本使用方法。\ndocker-compose安装 # 《Install Docker Compose》这个里面有关docker-compose的安装方法写的挺详细的，建议时间充足阅读这个。\n这里简单介绍下快速安装docker-compose的方法。\n执行如下命令\n# 下载docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 添加可执行权限 sudo chmod +x /usr/local/bin/docker-compose 验证是否安装成功，输入如下命令，查看docker-compose版本\n$ sudo docker-compose --version 输出版本信息\ndocker-compose version 1.21.0, build 5920eb0 docker-compose使用方法 # demo示例 # 下面展示个简单的例子，直接上相关文件内容：\n创建一个demo的目录，目录中包含有docker-compose.yml的文件，目录结构如下：\ndemo └── docker-compose.yml docker-compose.yml中的内容如下：\nversion: \u0026#39;2.2\u0026#39; services: nginx: image: nginx:1.13.12 container_name: nginx hostname: nginx environment: - TZ=Asia/Shanghai ports: - 8000:8000 networks: - front command: tail -f /dev/null python: image: python:2.7 container_name: python hostname: python environment: - TZ=Asia/Shanghai networks: - front - backend command: tail -f /dev/null mysql: image: mysql:5.6 container_name: mysql hostname: mysql environment: - TZ=Asia/Shanghai networks: - backend command: tail -f /dev/null networks: front: backend: 先解释下如上的内容：\n创建了三个容器，分别为nginx, python, mysql； 创建了两个网络层面，分别为front和backend； nginx和python使用网络平面front，python和mysql使用网络平面backend，nginx无法访问mysql； 启动和验证 # 进入demo目录，使用如下命令拉起容器：\nsudo docker-compose up -d 看到如下内容说明拉起成功\nCreating network \u0026#34;demo_front\u0026#34; with the default driver Creating network \u0026#34;demo_backend\u0026#34; with the default driver Creating python ... done Creating mysql ... done Creating nginx ... done 使用命令sudo docker network ls，可以查到有名为demo_front和demo_backend的两个网路。\n使用命令sudo docker inspect demo_front或sudo docker inspect demo_backend可以查看网络平面详细信息。\n使用命令sudo docker exec -it python /bin/bash，进入容器python。在容器python中测试访问nginx和mysql\nping nginx ping mysql 容器python可以ping通容器nginx和容器mysql。 而nginx和mysql之间无法ping通。\n停止和删除 # 使用如下命令可以一把停止和删除相关容器和网络，而无需手动一个个的停止再删除\nsudo docker-compose down 网路问题 # 常见的一个问题：假如需要扩容或者增加一个python的web服务，不妨称之为webapp02，新的webapp02服务需要加入到上面的front网络平面中，需要和nginx以及上面的python服务相互访问。可以使用docker命令的--link把webapp02和nginx、python连接起来，更好的办法是使用docker-compose来编排新的webapp02和其它容器或者网络之间的关系。\n示例如下： 目录结构\ndemo-ext └── docker-compose.yml docker-compose.yml内容如下：\nversion: \u0026#39;2.2\u0026#39; services: webapp02: image: python:2.7 container_name: webapp02 hostname: webapp02 networks: - front # - backend environment: - TZ=Asia/Shanghai command: tail -f /dev/null networks: front: external: name: demo_front # backend: # external: # name: demo_backend 进入demo-ext目录中使用命令启动\nsudo docker-compose up -d 可以看到如下信息\nWARNING: Some networks were defined but are not used by any service: backend Creating webapp02 ... done 进入容器webapp02后，测试可以ping通容器nginx和容器python，而无法ping通容器mysql。如需访问容器mysql删掉上面的#取消注释，重新使用命令sudo docker-compose up -d拉起即可。\n以上为一个简单的docker-compose使用示例，后面将会给出一个详细的nginx+flask+mysql的示例。\n","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/docker-compose-quickstart/","section":"Posts","summary":"介绍使用 docker-compose 编排多个 docker 服务的基本方法。","title":"使用docker-compose编排容器快速上手指南","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/node.js/","section":"Tags","summary":"","title":"Node.js","type":"tags"},{"content":" 简介 # 本文简介Node.js的安装和npm, yarn的安装与代理配置方法。\n安装包准备 # 下载Node.js安装包: node-v8.11.1-linux-x64.tar.xz\n安装配置Node.js # 解压并创建软连接\n# 解压至opt目录 tar -xvf node-v8.11.1-linux-x64.tar.xz -C /opt # 建立软连接 ln -vs /opt/node-v8.11.1-linux-x64 /opt/node 将node.js目录添加至环境变量\n在~/.zshrc或~/.bashrc中添加如下内容\nexport NODE_HOME=/opt/node export PATH=$PATH:$NODE_HOME/bin 使用source ~/.zshrc或source ~/.bashrc导入环境变量 输入node -v查看版本可以看到版本信息\n\u0026gt; node -v v8.11.1 配置cnpm # 使用淘宝的npm（TAONPM）镜像下载包时候很快\n在~/.zshrc或~/.bashrc中添加如下内容\nalias cnpm=\u0026#34;npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist --userconfig=$HOME/.cnpmrc\u0026#34; 使用source ~/.zshrc或source ~/.bashrc导入环境变量，即可使用cnpm命令，用法和npm一致，安装包时候下载会从淘宝镜像下载，速度杠杠的！\n安装与配置yarn # 这里说的yarn是facebook推出的Node.js包管理工具yarn，和Hadoop家族中的Hadoop YARN是不一样的东西。\nyarn的包安装速度比npm快不少。\n使用cnpm安装yarn\ncnpm install yarn -g 将yarn目录添加至环境变量\n在~/.zshrc或~/.bashrc中添加如下内容\nexport PATH=$PATH:$HOME/.yarn/bin 使用source ~/.zshrc或source ~/.bashrc导入环境变量，即可使用yarn命令。\nyarn可以使用上面提到的淘宝的npm镜像，这样yarn就更快了，配置yarn镜像方法很简单，使用命令\nyarn config set registry https://registry.npm.taobao.org 或者在~/.yarnrc中添加：\nregistry \u0026#34;https://registry.npm.taobao.org\u0026#34; 之后即可使用yarn来安装管理包啦\nnpm与yarn常用配置命令 # npm config set prefix D:\\AppData\\npm npm config set cache D:\\AppData\\npm-cache # 设置镜像源 npm config set registry http://registry.npm.taobao.org/ yarn config set global-folder D:\\AppData\\yarn\\global yarn config set cache-folder D:\\AppData\\yarn\\cache # 设置镜像源 yarn config set registry https://registry.npm.taobao.org 快速链接 # Node.js yarn ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/nodejs-install/","section":"Posts","summary":"介绍 Node.js 以及 npm、yarn 的安装与代理配置方法。","title":"Node.js安装配置","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/npm/","section":"Tags","summary":"","title":"Npm","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/yarn/","section":"Tags","summary":"","title":"Yarn","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/dockerfile/","section":"Tags","summary":"","title":"Dockerfile","type":"tags"},{"content":" 简介 # 在了解了docker的基本使用方法后，我们可以通过容器快速准备环境并部署服务。 有些重复性的工作，例如：手动配置一些配置项，安装特定的软件包，使用命令或脚本启动特定服务等等。为了解决这些通用或者重复性的事情，我们可以通过构建一个自己个性化的镜像来固化下来这些环境信息。\n本文将简单介绍使用dockerfile构建docker镜像的基本使用方法。 本文以使用ubuntu的镜像为例说明如何根据已有的镜像为基础构建自己需要的镜像。\n本例中将演示以Ubuntu 16.04为基础，安装ssh, jdk, vim等软件。\n安装包准备 # jdk-8u77-linux-x64.tar.gz 目录结构及Dockerfile # 假如工作目录在：~/dockerfiles/my-ubuntu\n此目录中的结构如下：\n|-- Dockerfile `-- files `-- jdk-8u77-linux-x64.tar.gz 其中Dockerfile中的内容如下：\nFROM ubuntu:16.04 LABEL maintainer=\u0026#34;yancai915@gmail.com\u0026#34; ENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV TZ Asia/Shanghai # 设置apt-get源 RUN sed -i \u0026#34;s/archive.ubuntu.com/mirrors.aliyun.com/g\u0026#34; /etc/apt/sources.list \\ \u0026amp;\u0026amp; sed -i \u0026#34;s/security.ubuntu.com/mirrors.aliyun.com/g\u0026#34; /etc/apt/sources.list \\ \u0026amp;\u0026amp; apt-get update # 安装常用工具 设置SSH RUN apt-get install -y openssh-server vim telnet sudo \\ \u0026amp;\u0026amp; rm /etc/ssh/ssh_host_dsa_key -rf \\ \u0026amp;\u0026amp; rm /etc/ssh/ssh_host_rsa_key -rf \\ \u0026amp;\u0026amp; ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key \\ \u0026amp;\u0026amp; ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \\ \u0026amp;\u0026amp; useradd guest \\ \u0026amp;\u0026amp; echo \u0026#34;guest:guest!@#\u0026#34; | chpasswd \\ \u0026amp;\u0026amp; echo \u0026#34;guest ALL=(ALL) ALL\u0026#34; \u0026gt;\u0026gt; /etc/sudoers \\ \u0026amp;\u0026amp; echo \u0026#34;root:123456\u0026#34; | chpasswd \\ \u0026amp;\u0026amp; sed -i \u0026#34;s/PermitRootLogin\\ without-password/PermitRootLogin\\ yes/g\u0026#34; /etc/ssh/sshd_config # 修改vim配置 RUN sed -i \u0026#39;1s/^/set encoding=utf-8\\n/\u0026#39; /etc/vim/vimrc \\ \u0026amp;\u0026amp; echo \u0026#34;set hls\u0026#34; \u0026gt;\u0026gt; /etc/vim/vimrc \\ \u0026amp;\u0026amp; echo \u0026#34;set expandtab\u0026#34; \u0026gt;\u0026gt; /etc/vim/vimrc \\ \u0026amp;\u0026amp; echo \u0026#34;set sw=4\u0026#34; \u0026gt;\u0026gt; /etc/vim/vimrc \\ \u0026amp;\u0026amp; echo \u0026#34;set tabstop=4\u0026#34; \u0026gt;\u0026gt; /etc/vim/vimrc RUN mkdir /usr/java # 安装jdk ADD files/jdk-8u77-linux-x64.tar.gz /usr/java RUN echo \u0026#34;export JAVA_HOME=/usr/java/jdk1.8.0_77\u0026#34; \u0026gt;\u0026gt; /etc/profile \\ \u0026amp;\u0026amp; echo \u0026#34;export PATH=\\$JAVA_HOME/bin:\\$PATH\u0026#34; \u0026gt;\u0026gt; /etc/profile \\ \u0026amp;\u0026amp; echo \u0026#34;export CLASSPATH=.:\\$JAVA_HOME/lib/dt.jar:\\$JAVA_HOME/lib/tools.jar\u0026#34; \u0026gt;\u0026gt; /etc/profile RUN mkdir /var/run/sshd EXPOSE 22 8080 ENTRYPOINT /usr/sbin/sshd -D 构建镜像 # cd ~/dockerfiles/my-ubuntu # build镜像，注意最后有一个英文半角点号 docker build --tag=\u0026#34;my-ubuntu:1.0\u0026#34; . 稍等片刻后构建完成\n查询镜像 # 使用如下命令可以看到已经构建好的镜像\ndocker images 例如：\nREPOSITORY TAG IMAGE ID CREATED SIZE my-ubuntu 1.0 1979d1447f6d 2 minutes ago 612 MB ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/dockerfile-quickstart/","section":"Posts","summary":"介绍使用 Dockerfile 构建自定义 docker 镜像的基本方法，以 ubuntu 镜像为例。","title":"使用dockerfile构建docker镜像快速上手指南","type":"posts"},{"content":"本文将简单介绍docker的基本使用方法。本文以使用nginx的镜像为例说明如何快速上手使用docker。\ndocker 安装 # 参见: https://docs.docker.com/install/\n拉取镜像 # docker pull nginx 启动容器 # # 启动一个nginx容器，主机的8000转发至容器的80端口 docker run -d --name my-nginx -p 8000:80 nginx 测试访问nginx # 浏览器访问http://{主机ip}:8000，可以看到**Welcome to nginx!**页面\n停止容器 # # 查询已经启动的容器 docker ps 例如查到类似如下信息：\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8eca8f07f68 nginx \u0026#34;nginx -g \u0026#39;daemon ...\u0026#34; 24 seconds ago Up 23 seconds 0.0.0.0:8000-\u0026gt;80/tcp my-nginx # 使用my-nginx对应的ContainerID停止容器 docker stop {container_id} 删除容器 # # 使用my-nginx对应的ContainerID删除容器 docker rm {container_id} 注意 # 如果容器已经停止，可以使用命令docker ps -a查询所有包含已停止的容器; ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/docker-quickstart/","section":"Posts","summary":"简介 docker 的基本使用方法。","title":"docker快速上手指南","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/blog/","section":"Tags","summary":"","title":"Blog","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/flumeng/","section":"Tags","summary":"","title":"FlumeNG","type":"tags"},{"content":" flume kafka single # 本文介绍了flume和kafka单节点部署和使用的方法\n安装包准备 # kafka: kafka_2.11-1.0.0.tgz flume: apache-flume-1.8.0-bin.tar.gz kafka部署配置 # 解压kafka安装包至指定目录/opt/kafka\n启动zookeeper（也可单独部署zookeeper）\n./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties 启动成功后可以查询2181端口已确认是否启动成功\n启动 kafka\n./bin/kafka-server-start.sh -daemon ./config/server.properties 启动成功后可以查询9092端口已确认是否启动成功\nflume部署配置 # 解压flume安装包至指定目录/opt/flume\n修改flume配置文件./conf/flume-conf.properties\na1.sources = r1 a1.sinks = k1 a1.channels = c1 a1.sources.r1.type = netcat a1.sources.r1.bind = 0.0.0.0 a1.sources.r1.port = 44444 a1.sources.r1.channels = c1 a1.channels.c1.type = file a1.channels.c1.checkpointDir = /var/log/flume/checkpoint a1.channels.c1.dataDirs = /var/log/flume/data a1.sinks.k1.channel = c1 a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.brokerList=localhost:9092 a1.sinks.k1.batchSize=10 a1.sinks.k1.topic=flume-topic a1.sinks.k1.request.required.acks=1 启动flume\n./bin/flume-ng agent --conf conf --conf-file conf/flume-conf.properties --name a1 -Dflume.root.logger=WARN,console 使用jps或者ps查询flume进程是否启动成功\n测试flume到kafka的消息传递 # 向flume发送消息\n\u0026gt;telnet flume 44444 \u0026gt;输入任意字符 从kafka读取消费消息\n./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic flume-topic --from-beginning kafka常用命令 # # 查询各组消费状态 ./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g2 ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/flume_kafka_single/","section":"Posts","summary":"介绍 flume 和 kafka 单节点部署与使用的方法。","title":"flume和kafka单节点部署和使用的方法","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/hadoop-yarn/","section":"Tags","summary":"","title":"Hadoop-YARN","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/hbase/","section":"Tags","summary":"","title":"HBase","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/jupyter/","section":"Tags","summary":"","title":"Jupyter","type":"tags"},{"content":" 简介 # 本文简介如何部署jupyter\njupyter类似web版的ipython，吊炸天，帅爆了，很适合写代码示例或者技术文档\n部署步骤 # 默认目录为：/home/jupyter\n使用virtualenv创建虚拟环境\nvirtualenv jupyter_env 进入虚拟环境\nlinux：source env/bin/active windows：jupyter_env\\Scripts\\activate 安装jupyter\npip install jupyter 启动jupyter\njupyter notebook --ip 0.0.0.0 --port 8000\n浏览器打开地址访问jupyter：http://ip:port ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/deploy_jupyter/","section":"Posts","summary":"介绍 jupyter 的快速部署方法。","title":"jupyter快速部署","type":"posts"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/kafka/","section":"Tags","summary":"","title":"Kafka","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/markdown/","section":"Tags","summary":"","title":"Markdown","type":"tags"},{"content":"","date":"2018年4月4日","externalUrl":null,"permalink":"/tags/spark/","section":"Tags","summary":"","title":"Spark","type":"tags"},{"content":" 分布式 HA HDFS YARN SPARK HBASE部署 # 本文介绍了支持HA方式的HDFS + YARN + HBase + Spark的部署方式\n部署计划 # 机器环境 # 操作系统：CentOS-7\n默认在/root中执行操作\n如果对网络端口设置不熟悉，请先关闭防火墙\n# 停止firewall systemctl stop firewalld.service # 禁止firewall开机启动 systemctl disable firewalld.service 机器划分 # hostname 包含角色 nd1（主） namenode, datanode, resourcemanager, nodemanager, zookeeper, hmaster, hregionserver nd2（主） namenode, datanode, resourcemanager, nodemanager, zookeeper, hmaster, hregionserver nd3 datanode, nodemanager, zookeeper, hregionserver 安装包准备 # jdk-7u75-linux-x64.rpm hadoop-2.6.4.tar.gz zookeeper-3.4.8.tar.gz hbase-0.98.18-hadoop2-bin.tar.gz spark-1.6.1-bin-hadoop2.6.tgz 基础环境配置 # 配置hostname及hosts # 选三台机器，按照部署计划配置hosts和hostname\n配置ssh登录 # 生成ssh远程登录公钥-密钥对\nssh-keygen -t rsa 连续回车enter确认\n由于nd1和nd2为master角色，因此nd1和nd2需要可以访问所有主机，将nd1和nd2的公钥分发给所有机器\n如果nd1希望可以ssh无密钥访问nd2，那么需要将nd1自己的~/.ssh/id_rsa.pub中的公钥添加至nd2的~/.ssh/authorized_keys中。ssh提供了ssh-copy-id来简化复制粘贴的操作。\n例如在nd1上执行：\n# 将nd1的公钥分发给nd1，如有提示，输入yes确认，输入nd1登录密码传输公钥 ssh-copy-id nd1 # 将nd1的公钥分发给nd2，如有提示，输入yes确认，输入nd2登录密码传输公钥 ssh-copy-id nd2 # 将nd1的公钥分发给nd3，如有提示，输入yes确认，输入nd3登录密码传输公钥 ssh-copy-id nd3 在nd2上重复如上分发动作，将nd2的公钥分发给所有机器\n在nd3上，将nd3的公钥分发给nd3自己\n在nd1上执行ssh-copy-id nd1以确保nd1可以ssh登录nd1自身；\n在nd1上执行ssh-copy-id nd2以确保nd2可以ssh登录nd2自身；\n在nd1上执行ssh-copy-id nd3以确保nd3可以ssh登录nd3自身；\n验证ssh是否可远程至目标机器，使用ssh hostname验证是否可远程免密登录指定机器。在本例中，nd1和nd2可以远程登录nd1、nd2以及nd3。\n安装配置Java # 安装Java\nrpm -ivh jdk-7u75-linux-x64.rpm 配置环境变量\n打开/etc/profile，vim /etc/profile，最下方添加如下内容：\nexport JAVA_HOME=/usr/java/jdk1.7.0_75 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 导入环境变量source /etc/profile，输入java -version测试Java是否配置成功，正常输出如下信息：\njava version \u0026#34;1.7.0_75\u0026#34; Java(TM) SE Runtime Environment (build 1.7.0_75-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode) 部署zookeeper # 解压并重命名\n# 解压 tar -xvf zookeeper-3.4.8.tar.gz # 重命名 mv zookeeper-3.4.8 zookeeper 配置环境变量\n打开/etc/profile并修改添加如下内容：\nexport ZOOKEEPER_HOME=/root/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin 导入环境变量source /etc/profile\n配置zookeeper\n新建文件夹存储zookeeper文件mkdir /var/lib/zookeeper\n进入zookeeper程序目录，cd /root/zookeeper\n重命名配置文件mv conf/zoo_sample.cfg conf/zoo.cfg\n修改zoo.cfg，修改添加如下内容：\ndataDir=/var/lib/zookeeper server.1=nd1:2888:3888 server.2=nd2:2888:3888 server.3=nd3:2888:3888 在nd1上执行：echo 1 \u0026gt; /var/lib/zookeeper/myid 在nd2上执行：echo 2 \u0026gt; /var/lib/zookeeper/myid 在nd3上执行：echo 3 \u0026gt; /var/lib/zookeeper/myid\n启动并验证\n启动方式：./bin/zkServer.sh start\n验证方式：输入jps查询进程可以看到QuorumPeerMain，则说明zookeeper已启动。\n使用./bin/zkCli.sh进入zookeeper客户端命令行，并执行：\ninput: ls / # 看到[zookeeper]即说明服务运行正常 output: [zookeeper] 部署Hadoop(HDFS + YARN) # 解压并重命名\ncd ~ tar -xvf hadoop-2.6.4.tar.gz mv hadoop-2.6.4 hadoop 配置环境变量\n打开vim /etc/profile并修改添加如下内容：\nexport HADOOP_HOME=/root/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 导入环境变量source /etc/profile\n配置hadoop\n新建文件夹存储hadoop文件mkdir /var/lib/hadoop\n进入hadoop程序目录，cd /root/hadoop\n修改etc/hadoop/hadoop-env.sh\nexport JAVA_HOME=/usr/java/jdk1.7.0_75 修改vim etc/hadoop/core-site.xml\n在\u0026lt;configuration\u0026gt;\u0026lt;/configuration\u0026gt;间添加如下内容：\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.tmp.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;fs.defaultFS\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;hdfs://mycluster\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;ha.zookeeper.quorum\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1:2181,nd2:2181,nd3:2181\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 修改vim etc/hadoop/hdfs-site.xml\n在\u0026lt;configuration\u0026gt;\u0026lt;/configuration\u0026gt;间添加如下内容：\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.nameservices\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;mycluster\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.namenodes.mycluster\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1,nd2\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.rpc-address.mycluster.nd1\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address.mycluster.nd1\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1:50070\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.rpc-address.mycluster.nd2\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd2:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address.mycluster.nd2\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd2:50070\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.shared.edits.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;qjournal://nd1:8485;nd2:8485;nd3:8485/journal\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.journalnode.edits.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/val/lib/hadoop\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.automatic-failover.enabled\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.client.failover.proxy.provider.mycluster\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.methods\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt; sshfence shell(/bin/true) \u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.ssh.private-key-files\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/root/.ssh/id_rsa\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.ha.fencing.ssh.connect-timeout\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;30000\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.name.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop/nn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.datanode.data.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;file:/var/lib/hadoop/dn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 复制mapred-site配置，cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml\n修改vim etc/hadoop/mapred-site.xml\n在\u0026lt;configuration\u0026gt;\u0026lt;/configuration\u0026gt;间添加如下内容：\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.framework.name\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;yarn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 修改vim etc/hadoop/yarn-site.xml\n在\u0026lt;configuration\u0026gt;\u0026lt;/configuration\u0026gt;间添加如下内容：\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.ha.enabled\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.cluster-id\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;YARN-HA\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.ha.rm-ids\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;rm1,rm2\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.hostname.rm1\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.hostname.rm2\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd2\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.recovery.enabled\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.store.class\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.zk-address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1:2181,nd2:2181,nd2:2181\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.nodemanager.aux-service\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;mapreduce_shuffle\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 修改vim etc/hadoop/slaves\n添加如下内容：\nnd1 nd2 nd3 格式化并启动服务\n启动journalnode，在nd1，nd2，nd3上执行hadoop-daemon.sh start journalnode\n格式化namenode，在nd1上执行hdfs namenode -format，拷贝nd1的namenode的目录至nd2的相同目录中scp -r /var/lib/hadoop/nn root@nd2:/var/lib/hadoop/\n有类似如下信息输出则为正常：\n16/04/06 09:06:16 INFO common.Storage: Storage directory /var/lib/hadoop/nn has been successfully formatted. 16/04/06 09:06:17 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid \u0026gt;= 0 16/04/06 09:06:17 INFO util.ExitUtil: Exiting with status 0 ps1: 也可以在nd2上先执行格式化在拷贝目录至nd1\nps2: 此处可使用网络共享磁盘方式使得nd1和nd2同时读写同一个目录，生产环境建议使用此方法\n格式化zookeeper中的hadoop信息，在nd1或者nd2上执行hdfs zkfc -formatZK\n启动hdfs，在nd1或者nd2上执行start-dfs.sh，在nd1和nd2上使用jps查看会有如下进程：\nJournalNode QuorumPeerMain DFSZKFailoverController NameNode DataNode 在nd3上执行jps查看会有如下进程：\nJournalNode QuorumPeerMain DataNode 浏览器中打开http://nd1:50070和http://nd2:50070中可以看到其中一个为**active，另一个为standby**，则说明hadoop namenode的HA配置成功\n或者使用hdfs haadmin -getServiceState nd1来查询nd1的当前状态\n可以在active的机器上强制杀死namenode或者使用hadoop-daemon.sh stop namenode来模拟active namenode故障，之后刷新另一个节点的页面可以看到状态已经由standby变成了active\n由此可以验证hdfs的HA成功\n启动yarn\n在nd1上执行start-yarn.sh，启动nd1的resourcemanager以及nd1-3的nodemanager\n再在nd2上执行yarn-daemon.sh start resourcemanager，启动nd2的resourcemanager\n使用jps查询进程可以在nd1和nd2上看到包含有进程：resourcemanager和nodemanager\n在nd3上可以看到包含有进程：nodemanager\n在浏览器打开http://nd1:8088可以看到yarn的applications界面，打开http://nd2:8088会自动跳转至nd1的界面\n或者使用yarn rmadmin -getServiceState rm1来查询rm1或rm2的状态\n在nd1上杀死resourcemanager的进程或者使用yarn-daemon.sh stop resourcemanager停止resourcemanager进程，这时访问http:nd2:8080，可以看到resourcemanager已经由nd2接替。或者使用yarn rmadmin -getServiceState xxx来查询每个resourcemanager的状态\n由此可以验证yarn的HA成功\n部署HBase # 解压并重命名\ncd ~ tar -xvf hbase-0.98.18-hadoop2-bin.tar.gz mv hbase-0.98.18-hadoop2-bin hbase 配置环境变量\n打开vim /etc/profile并修改添加如下内容：\nexport HBASE_HOME=/root/hbase export PATH=$PATH:$HBASE_HOME/bin 导入环境变量source /etc/profile\n配置HBase\n新建文件夹存储HBase文件mkdir /var/lib/hbase\n进入hbase程序目录，cd /root/hbase\n修改vim conf/hbase-env.sh，在最下放添加如下内容：\nexport JAVA_HOME=/usr/java/jdk1.7.0_75/ export HBASE_MANAGES_ZK=false 修改vim conf/hbase-site.xml\n在\u0026lt;configuration\u0026gt;\u0026lt;/configuration\u0026gt;间添加如下内容：\n\u0026lt;configuration\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.rootdir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;hdfs://mycluster/hbase\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.cluster.distributed\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.zookeeper.quorum\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;nd1,nd2,nd3\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.zookeeper.property.dataDir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/var/lib/zookeeper/\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.replication\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;3\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.zookeeper.property.clientPort\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;2181\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hbase.master\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;60000\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 修改vim conf/regionservers\n在文件中添加如下内容：\nnd1 nd2 nd3 将hadoop中的core-site.xml，hdfs-site.xml拷贝至hbase/conf/中\n或者使用软连接方式，推荐使用软连接方式：\n# 建立软连接 ln -vs /root/hadoop/etc/hadoop/core-site.xml /root/hbase/conf/core-site.xml ln -vs /root/hadoop/etc/hadoop/hdfs-site.xml /root/hbase/conf/hdfs-site.xml 启动验证服务\n在nd1上执行start-hbase.sh，在nd2上执行hbase-daemon.sh start master\n在nd1和nd2上使用jps查询可以看到\nHMaster HRegionServer 浏览器中打开http://nd1:60010或http://nd2:60010可以看到当前HMaster的状态\n在状态为master的机器上执行hbase-daemon.sh stop master或者直接杀死HMaster进程，访问另一个节点对应的HBase web页面，则可看到状态已由Backup变为Master 由此可验证HBase的HA切换成功\n部署 Spark On YARN # spark主要的部署方式有：YARN模式、Standalone模式、HA模式 由于已经部署了YARN HA，因此采用Spark On YARN时，spark仅作为提交作业的客户端，具体的map-reduce任务交由YARN去处理，因此仅需要在一台机器上部署spark即可。\n解压并重命名\n# 解压 tar -xvf spark-1.6.1-bin-hadoop2.6.tgz # 重命名 mv spark-1.6.1-bin-hadoop2.6 spark 配置环境变量\n打开/etc/profile并修改添加如下内容：\nexport SPARK_HOME=/root/zookeeper export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin 导入环境变量source /etc/profile\n配置spark\n进入spark程序目录，cd /root/spark\n复制spark-env.sh配置，cp conf/spark-env.sh.template conf/spark-env.sh\n修改vim conf/spark-env.sh，在最下放添加如下内容：\nHADOOP_CONF_DIR=/root/hadoop/etc/hadoop 测试提交作业\n使用spark-submit提交作业，参数Master URL指定为yarn即可，例如：\nspark-submit --class com.xxx --master yarn xxx.jar ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/hadoop_ha_deploy/","section":"Posts","summary":"介绍支持 HA 的 HDFS、YARN、HBase、Spark 分布式部署方式。","title":"分布式 HA HDFS YARN SPARK HBASE部署","type":"posts"},{"content":" 简介 # 自我推荐一个自己开发的简易博客。\nhttps://github.com/yancai/blog\n此博客是一个基于Flask和Python Markdown开发的简易博客。 本博客支持基本的Markdown语法，并且支持table和Meta信息，具体参见About.md\n工程依赖包安装 # 本工程主要依赖于Flask、Jinja2，具体参见requirement.txt\npip install -r requirements.txt 基本用法 # Python环境搭建及依赖包安装，依赖包参见requirements.txt； 将你写好的.md文件丢到generate.py中INPUT_CONTENT所配置的目录中，默认为./in目录； 运行generate.py文件，生成html页面文件和索引文件； 运行blog.py文件，启动flask网站，用以对外提供访问html文件； 访问http://127.0.0.1:5000/api/index/generate/生成索引文件； 访问http://127.0.0.1:5000/upload/上传你编写好的md文件（md文件名请使用英文字母、数字、中划线、下划线的组合）； 工程结构简介 # blog ├─start.sh -- linux启动脚本 ├─stop.sh -- linux停止脚本 ├─start.bat -- windows启动脚本 ├─blog.py -- flask工程主文件 ├─generate.py -- Markdown生成html工具 ├─ReadMe.md -- 本文档 ├─requirements.txt -- 依赖包 ├─settings.py -- flask 配置 │ ├─api -- 数据查询接口 ├─in │ └─About.md -- 博客撰写方法说明 │ ├─static -- 静态资源文件夹 │ ├─favicon.ico │ ├─css │ ├─font │ ├─fonts │ └─js ├─templates -- html模板 └─utils -- 工具类 示例 # ","date":"2018年4月4日","externalUrl":null,"permalink":"/posts/blog_readme/","section":"Posts","summary":"自我推荐一个自己开发的、基于 Flask 和 Python Markdown 的简易博客。","title":"个人开发的博客介绍","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]