小学做试题网站/陕西省人民政府

小学做试题网站,陕西省人民政府,网站免费正能量小说,凤台做网站关于 PyFlink 的博客我们曾介绍过 PyFlink 的功能开发,比如,如何使用各种算子(Join/Window/AGG etc.),如何使用各种 Connector(Kafka, CSV, Socket etc.),还有一些实际的案例。这些都停留在开发阶段,一旦开发完成&…

关于 PyFlink 的博客我们曾介绍过 PyFlink 的功能开发,比如,如何使用各种算子(Join/Window/AGG etc.),如何使用各种 Connector(Kafka, CSV, Socket etc.),还有一些实际的案例。这些都停留在开发阶段,一旦开发完成,我们就面临激动人心的时刻,那就是将我们精心设计开发的作业进行部署,那么问题来了,你知道怎样部署 PyFlink 的作业吗?

本文将为大家全面介绍部署 PyFlink 作业的各种模式。

组件栈回顾

0f9600a0ef93fdc0e145cafa325719b2.png

上面的组件栈除了 PyFlink 是第一次添加上去,其他部分大家应该非常熟悉了。目前 PyFlink 基于 Java 的 Table API 之上,同时在 Runtime 层面有 Python 的算子和执行容器。那么我们聚焦重点,看最底层的 Deploy 部分,上图我们分成了三种部署模式,Local/Cluster/Cloud,其中 Local 模式还有 2 种不同方式,一是 SingleJVM,也即是 MiniCluster, 前面博客里面运行示例所使用的就是 MiniCluster。二是 SingleNode,也就是虽然是集群模式,但是所有角色都在一台机器上。下面我们简单介绍一下上面这几种部署模式的区别:

  • Local-SingleJVM 模式:该模式大多是开发测试阶段使用的方式,所有角色TM,JM 等都在同一个 JVM 里面。

  • Local-SingleNode 模式:意在所有角色都运行在同一台机器,直白一点就是从运行的架构上看,这种模式虽然是分布式的,但集群节点只有 1 个,该模式大多是测试和 IoT 设备上进行部署使用。

  • Cluster 模式:也就是我们经常用于投产的分布式部署方式,上图根据对资源管理的方式不同又分为了多种,如:Standalone 是 Flink 自身进行资源管理,YARN,顾名思义就是利用资源管理框架 Yarn 来负责 Flink运行资源的分配,还有结合 Kubernetes 等等。

  • Cloud 模式:该部署模式是结合其他云平台进行部署。

接下来我们看看 PyFlink 的作业可以进行怎样的模式部署?

环境依赖

  • JDK 1.8+ (1.8.0_211)

  • Maven 3.x (3.2.5)

  • Scala 2.11+ (2.12.0)

  • Python 3.5+ (3.7.6)

  • Git 2.20+ (2.20.1)

源码构建及安装

在 Apache Flink 1.10 发布之后,我们除了源码构建之外,还支持直接利用 pip install 安装 PyFlink。那么现在我们还是以源码构建的方式进行今天的介绍。

  • 下载源码

git clone https://github.com/apache/flink.git
  • 签出 release-1.10 分支(1.10 版本是 PyFlink 的第二个版本)

git fetch origin release-1.10git checkout -b release-1.10 origin/release-1.10
  • 构建编译

mvn clean package -DskipTests

如果一起顺利,你会最终看到如下信息:

......[INFO] flink-walkthrough-table-scala ...................... SUCCESS [  0.070 s][INFO] flink-walkthrough-datastream-java .................. SUCCESS [  0.081 s][INFO] flink-walkthrough-datastream-scala ................. SUCCESS [  0.067 s][INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:  16:22 min[INFO] Finished at: 2019-12-31T10:37:21+08:00[INFO] ------------------------------------------------------------------------
  • 构建 PyFlink 发布包

上面我们构建了 Java 的发布包,接下来我们构建 PyFlink 的发布包,如下:

cd flink-Python; Python setup.py sdist

最终输出如下信息,证明是成功的:

copying pyflink/util/exceptions.py -> apache-flink-1.10.dev0/pyflink/utilcopying pyflink/util/utils.py -> apache-flink-1.10.dev0/pyflink/utilWriting apache-flink-1.10.dev0/setup.cfgcreating distCreating tar archiveremoving 'apache-flink-1.10.dev0' (and everything under it)

在 dist 目录的 apache-flink-1.10.dev0.tar.gz 就是我们可以用于 pip install 的 PyFlink 包。

  • 安装 PyFlink

上面我们构建了 PyFlink 的发布包,接下来我们利用 pip 进行安装,检测是否之前已经安装过 PyFlink,如下命令:

pip3 list|grep flink...flink                         1.0      pyflink-demo-connector        0.1

上面信息说明我本机已经安装过 PyFlink,我们要先删除,如下:

pip3 uninstall flink

删除以前的安装之后,我们再安装新的如下:

pip3 install dist/*.tar.gz...Successfully built apache-flinkInstalling collected packages: apache-flinkSuccessfully installed apache-flink-1.10.dev0

我们再用 list 命令检查一遍:

pip3 list|grep flink...apache-flink                  1.10.dev0pyflink-demo-connector        0.1

其中 pyflink-demo-connector 是我以前做实验时候的安装,对本篇没有影响。

安装 Apache Beam 依赖

我们需要使用 Python3.5+ 版本,检验一下 Python 版本,如下:

jincheng.sunjc$ Python --versionPython 3.7.6

我本机是 Python 3.7.6,现在我们需要安装 Apache Beam,如下:

python -m pip install apache-beam==2.15.0...Installing collected packages: apache-beamSuccessfully installed apache-beam-2.15.0

如果顺利的出现上面信息,说明 Apache-beam 已经安装成功。

PyFlink 示例作业

接下来我们开发一个简单的 PyFlink 作业,源码如下:

import loggingimport osimport shutilimport sysimport tempfilefrom pyflink.table import BatchTableEnvironment, EnvironmentSettingsfrom pyflink.table.descriptors import FileSystem, OldCsv, Schemafrom pyflink.table.types import DataTypesfrom pyflink.table.udf import udfdef word_count():   environment_settings = EnvironmentSettings.new_instance().in_batch_mode().use_blink_planner().build()   t_env = BatchTableEnvironment.create(environment_settings=environment_settings)   # register Results table in table environment   tmp_dir = tempfile.gettempdir()   result_path = tmp_dir + '/result'   if os.path.exists(result_path):       try:           if os.path.isfile(result_path):               os.remove(result_path)           else:               shutil.rmtree(result_path)       except OSError as e:           logging.error("Error removing directory: %s - %s.", e.filename, e.strerror)   logging.info("Results directory: %s", result_path)   # we should set the Python verison here if `Python` not point   t_env.get_config().set_python_executable("python3")   t_env.connect(FileSystem().path(result_path)) \       .with_format(OldCsv()                    .field_delimiter(',')                    .field("city", DataTypes.STRING())                    .field("sales_volume", DataTypes.BIGINT())                    .field("sales", DataTypes.BIGINT())) \       .with_schema(Schema()                    .field("city", DataTypes.STRING())                    .field("sales_volume", DataTypes.BIGINT())                    .field("sales", DataTypes.BIGINT())) \       .register_table_sink("Results")   @udf(input_types=DataTypes.STRING(), result_type=DataTypes.ARRAY(DataTypes.STRING()))   def split(input_str: str):       return input_str.split(",")   @udf(input_types=[DataTypes.ARRAY(DataTypes.STRING()), DataTypes.INT()], result_type=DataTypes.STRING())   def get(arr, index):       return arr[index]   t_env.register_function("split", split)   t_env.register_function("get", get)   t_env.get_config().get_configuration().set_string("parallelism.default", "1")   data = [("iPhone 11,30,5499,Beijing", ),           ("iPhone 11 Pro,20,8699,Guangzhou", ),           ("MacBook Pro,10,9999,Beijing", ),           ("AirPods Pro,50,1999,Beijing", ),           ("MacBook Pro,10,11499,Shanghai", ),           ("iPhone 11,30,5999,Shanghai", ),           ("iPhone 11 Pro,20,9999,Shenzhen", ),           ("MacBook Pro,10,13899,Hangzhou", ),           ("iPhone 11,10,6799,Beijing", ),           ("MacBook Pro,10,18999,Beijing", ),           ("iPhone 11 Pro,10,11799,Shenzhen", ),           ("MacBook Pro,10,22199,Shanghai", ),           ("AirPods Pro,40,1999,Shanghai", )]   t_env.from_elements(data, ["line"]) \       .select("split(line) as str_array") \       .select("get(str_array, 3) as city, "               "get(str_array, 1).cast(LONG) as count, "               "get(str_array, 2).cast(LONG) as unit_price") \       .select("city, count, count * unit_price as total_price") \       .group_by("city") \       .select("city, "               "sum(count) as sales_volume, "               "sum(total_price) as sales") \       .insert_into("Results")   t_env.execute("word_count")if __name__ == '__main__':   logging.basicConfig(stream=sys.stdout, level=logging.INFO, format="%(message)s")   word_count()

接下来我们就介绍如何用不同部署模式运行 PyFlink 作业!

Local-SingleJVM 模式部署

该模式多用于开发测试阶段,简单的利用 Python pyflink_job.py 命令,PyFlink 就会默认启动一个 Local-SingleJVM 的 Flink 环境来执行作业,如下:

bb8f36c3c99c83fa682086d1a5d860fc.png

首先确认你 Python 是 3.5+,然后执行上面的 PyFlink 作业 Python deploy_demo.py,结果写入到本地文件,然后 cat 计算结果,如果出现如图所示的结果,则说明准备工作已经就绪。


这里运行时 SingleJVM,在运行这个 job 时候大家可以查看 java 进程:

128a9785d8685c43ee641446abceb333.png

我们发现只有一个 JVM 进程,里面包含了所有 Flink 所需角色。

Local-SingleNode 模式部署

这种模式一般用在单机环境中进行部署,如 IoT 设备中,我们从 0 开始进行该模式的部署操作。我们进入到 flink/build-target 目录,执行如下命令(个人爱好,我把端口改成了 8888):

jincheng:build-target jincheng.sunjc$ bin/start-cluster.sh ...Starting cluster.Starting standalonesession daemon on host jincheng.local.

查看一下 Flink 的进程:

7400a2a87e3b15227a242b984be5eac4.png

我们发现有 TM 和 JM 两个进程,虽然在一台机器(Local)但是也是一个集群的架构。


上面信息证明已经启动完成,我们可以查看 web 界面:http://localhost:8888/(我个人爱好端口是 8888,默认是 8080), 如下:

27725a4ae309995c56891e444ec1b81b.png

目前集群环境已经准备完成,我们看如果将作业部署到集群中,一条简单的命令,如下:

bin/flink run -m localhost:8888 -py ~/deploy_demo.py

这里如果你不更改端口可以不添加 -m 选项。如果一切顺利,你会得到如下输出:

jincheng:build-target jincheng.sunjc$ bin/flink run -m localhost:8888 -py ~/deploy_demo.py Results directory: /var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/resultJob has been submitted with JobID 3ae7fb8fa0d1867daa8d65fd87ed3bc6Program execution finishedJob with JobID 3ae7fb8fa0d1867daa8d65fd87ed3bc6 has finished.Job Runtime: 5389 ms

其中 /var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/result 目录是计算结果目录,我们可以产看一下,如下:

jincheng:build-target jincheng.sunjc$  cat /var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/resultBeijing,110,622890Guangzhou,20,173980Shanghai,90,596910Shenzhen,30,317970Hangzhou,10,138990

同时我们也可以在 WebUI 上面进行查看,在完成的 job 列表中,显示如下:

c8e836d1bce1b31625a0ca6a136c1c02.png

到此,我们完成了在 Local 模式,其实也是只有一个节点的 Standalone 模式下完成 PyFlink 的部署。


最后我们为了继续下面的操作,请停止集群:

jincheng:build-target jincheng.sunjc$ bin/stop-cluster.shStopping taskexecutor daemon (pid: 45714) on host jincheng.local.Stopping standalonesession daemon (pid: 45459) on host jincheng.local.

Cluster YARN 模式部署

这个模式部署,我们需要一个 YARN 环境,我们一切从简,以单机部署的方式准备 YARN 环境,然后再与 Flink 进行集成。

准备 YARN 环境
  • 安装 Hadoop

我本机是 mac 系统,所以我偷懒一下直接用 brew 进行安装:

jincheng:bin jincheng.sunjc$ brew install HadoopUpdating Homebrew...==> Auto-updated Homebrew!Updated 2 taps (homebrew/core and homebrew/cask).==> Updated FormulaePython ✔        doxygen         minio           ntopng          typescriptcertbot         libngspice      mitmproxy       ooniprobedoitlive        minimal-racket  ngspice         openimageio==> Downloading https://www.apache.org/dyn/closer.cgi?path=hadoop/common/hadoop-==> Downloading from http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.2.1/######################################################################## 100.0%?  /usr/local/Cellar/Hadoop/3.2.1: 22,397 files, 815.6MB, built in 5 minutes 12 seconds

完成之后,检验一下 Hadoop 版本:

jincheng:bin jincheng.sunjc$ hadoop versionHadoop 3.2.1

超级顺利,Hadoop 被安装到了 /usr/local/Cellar/hadoop/3.2.1/ 目录下,brew 还是很能提高生产力啊~

  • 配置免登(SSH)

Mac 系统自带了 ssh,我们可以简单配置一下即可,我们先打开远程登录。 系统偏好设置 -> 共享 中,左边勾选远程登录,右边选择仅这些用户(选择所有用户更宽松),并添加当前用户。

jincheng:bin jincheng.sunjc$ whoamijincheng.sunjc

我当前用户是 jincheng.sunjc。配置图如下:

31304e45eb4f1c93feae9ef34378f28d.png

然后生产证书,如下操作:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsaGenerating public/private rsa key pair./Users/jincheng.sunjc/.ssh/id_rsa already exists.Overwrite (y/n)? yYour identification has been saved in /Users/jincheng.sunjc/.ssh/id_rsa.Your public key has been saved in /Users/jincheng.sunjc/.ssh/id_rsa.pub.The key fingerprint is:SHA256:IkjKkOjfMx1fxWlwtQYg8hThph7Xlm9kPutAYFmQR0A jincheng.sunjc@jincheng.localThe key's randomart image is:+---[RSA 2048]----+|       ..EB=.o.. ||..      =.+.+ o .||+ .      B.  = o ||+o .    + o + .  ||.o. . .+S. * o   ||  . ..o.= + =    ||   . + o . . =   ||      o     o o  ||            .o   |+----[SHA256]-----+

接下来将公钥追加到如下文件,并修改文件权限:

jincheng.sunjc$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keysjincheng.sunjc$ chmod 0600 ~/.ssh/authorized_keys

利用 ssh localhost 验证,看到 Last login: 字样为 ssh 成功:

jincheng:~ jincheng.sunjc$ ssh localhostPassword:Last login: Tue Dec 31 18:26:48 2019 from ::1
  • 设置环境变量

设置 JAVA_HOME,HADOOP_HOME 和 HADOOP_CONF_DIR,vi ~/.bashrc:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Homeexport HADOOP_HOME=/usr/local/Cellar/hadoop/3.2.1/libexecexport HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

NOTE: 后续操作要确保的 terminal 环境变量是生效哦, 如果不生效可以执行 source ~/.bashrc。:)

  • 修改配置

1) 修改 core-site.xml

<configuration>   <property>      <name>hadoop.tmp.dirname>      <value>/tmpvalue>   property>   <property>      <name>fs.defaultFSname>      <value>hdfs://localhost:9000value>    property>configuration>

2) 修改 hdfs-site.xml

<configuration>    <property>        <name>dfs.namenode.name.dirname>        <value>/tmp/hadoop/namevalue>    property>        <property>        <name>dfs.datanode.data.dirname>        <value>/tmp/hadoop/datavalue>    property>    configuration>

3) 修改 yarn-site.xml

配置 YARN 作为资源管理框架:

<configuration>    <property>        <name>yarn.nodemanager.aux-servicesname>        <value>mapreduce_shufflevalue>        property>    <property>        <name>yarn.nodemanager.env-whitelistname>  <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOMEvalue>    property>configuration>

简单的配置已经完成,我们执行一下简单命令启动环境:

  • 格式化文档系统

jincheng:libexec jincheng.sunjc$ hadoop namenode -format......2019-12-31 18:58:53,260 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************SHUTDOWN_MSG: Shutting down NameNode at jincheng.local/127.0.0.1************************************************************/
  • 启动服务

我们先启动 hdf 再启动 yarn,如下图:

9e0d9a147f0c9bcedf1c5192d46cac9e.png

Okay,一切顺利的话,我们会启动 namenodes,datanodes,resourcemanager 和 nodemanagers。我们有几个 web 界面可以查看,如下:

1)Overview 界面, http://localhost:9870 如下:

81d82028e3383d9edee617c2aad6e6da.png

2)NodeManager 界面, http://localhost:8042,如下:

9f6a63c8317f625216b094eff6256a57.png

3)ResourceManager 管理界面 http://localhost:8088/,如下:

b0b231951dcae40dee920675de00ba01.png

目前 YARN 的环境已经准备完成,我们接下来看如何与 Flink 进行集成。

Flink 集成 Hadoop 包

切换到编译结果目录下 flink/build-target,并将 Haddop 的 JAR 包放到 lib 目录。

在官网下载 Hadoop 包:

cd lib;curl https://repo.maven.apache.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-7.0/flink-shaded-hadoop-2-uber-2.8.3-7.0.jar > flink-shaded-hadoop-2-uber-2.8.3-7.0.jar

下载后,lib 目录下文件如下:

6c5800a415e0d9ac7d072124856de6b7.png

到现在为止我们可以提交 PyFlink 的作业到由 YARN 进行资源分配的集群了。但为了确保集群上有正确的 Python 环境我们最好打包一个 Python 环境到集群上面。因为大部分情况下我们无法得知 YARN 集群上的 Python 版本是否符合我们的要求(Python 3.5+,装有 apache-beam 2.15.0),因此我们需要打包一个符合条件的 Python 环境,并随 job 文件提交到 YARN 集群上。

打包 Python 环境

再次检查一下当前 Python 的版本是否 3.5+,如下:

jincheng:lib jincheng.sunjc$ PythonPython 3.7.6 (default, Dec 31 2019, 09:48:30)

由于这个 Python 环境是用于集群的,所以打包时的系统需要和集群一致。如果不一致,比如集群是 linux 而本机是 mac,我们需要在虚拟机或者 docker 中打包。以下列出两种情况的示范方法,读者根据需求选择一种即可。

1)本地打包(集群和本机操作系统一致时)

如果集群所在机器的操作系统和本地一致(都是 mac 或者都是 linux),直接通过 virtualenv 打包一个符合条件的 Python 环境:

  • 安装 virtualenv

使用 python -m pip install virtualenv 进行安装如下:

jincheng:tmp jincheng.sunjc$ python -m pip install virtualenvCollecting virtualenv  Downloading https://files.Pythonhosted.org/packages/05/f1/2e07e8ca50e047b9cc9ad56cf4291f4e041fa73207d000a095fe478abf84/virtualenv-16.7.9-py2.py3-none-any.whl (3.4MB)     |████████████████████████████████| 3.4MB 2.0MB/s Installing collected packages: virtualenvSuccessfully installed virtualenv-16.7.9

我本地环境已经成功安装。

  • 创建 Python 环境

用 virtualenv 以 always-copy 方式建立一个全新的 Python 环境,名字随意,以 venv 为例,virtualenv --always-copy venv:

jincheng:tmp jincheng.sunjc$ virtualenv --always-copy venvUsing base prefix '/usr/local/Cellar/Python/3.7.6/Frameworks/Python.framework/Versions/3.7'New Python executable in /Users/jincheng.sunjc/temp/hadoop/tmp/venv/bin/Python3.7Also creating executable in /Users/jincheng.sunjc/temp/hadoop/tmp/venv/bin/PythonInstalling setuptools, pip, wheel...done.
  • 在新环境中安装 apache-beam 2.15.0

使用 venv/bin/pip install apache-beam==2.15.0 进行安装:

jincheng:tmp jincheng.sunjc$ venv/bin/pip install apache-beam==2.15.0Collecting apache-beam==2.15.0......Successfully installed apache-beam-2.15.0 avro-Python3-1.9.1 certifi-2019.11.28 chardet-3.0.4 crcmod-1.7 dill-0.2.9 docopt-0.6.2 fastavro-0.21.24 future-0.18.2 grpcio-1.26.0 hdfs-2.5.8 httplib2-0.12.0 idna-2.8 mock-2.0.0 numpy-1.18.0 oauth2client-3.0.0 pbr-5.4.4 protobuf-3.11.2 pyarrow-0.14.1 pyasn1-0.4.8 pyasn1-modules-0.2.7 pydot-1.4.1 pymongo-3.10.0 pyparsing-2.4.6 pytz-2019.3 pyyaml-3.13 requests-2.22.0 rsa-4.0 six-1.13.0 urllib3-1.25.7

上面信息已经说明我们成功的在 Python 环境中安装了 apache-beam==2.15.0。接下来我们打包 Python 环境。

  • 打包 Python 环境

我们将 Python 打包成 zip 文件,zip -r venv.zip venv 如下:

zip -r venv.zip venv......  adding: venv/lib/Python3.7/re.py (deflated 68%)  adding: venv/lib/Python3.7/struct.py (deflated 46%)  adding: venv/lib/Python3.7/sre_parse.py (deflated 80%)  adding: venv/lib/Python3.7/abc.py (deflated 72%)  adding: venv/lib/Python3.7/_bootlocale.py (deflated 63%)

查看一下 zip 大小:

jincheng:tmp jincheng.sunjc$ du -sh venv.zip  81M  venv.zip

这个大小实在太大了,核心问题是 Beam 的包非常大,后面我会持续在 Beam 社区提出优化建议。我们先忍一下:(。

2)Docker 中打包(比如集群为 linux,本机为 mac 时)

我们选择在 docker 中打包,可以从以下链接下载最新版 docker 并安装:
https://download.docker.com/mac/stable/Docker.dmg 安装完毕后重启终端,执行 docker version 确认 docker 安装成功:

jincheng:tmp jincheng.sunjc$ docker versionClient: Docker Engine - Community Version:           19.03.4 API version:       1.40 Go version:        go1.12.10 Git commit:        9013bf5 Built:             Thu Oct 17 23:44:48 2019 OS/Arch:           darwin/amd64 Experimental:      falseServer: Docker Engine - Community Engine:  Version:          19.03.4  API version:      1.40 (minimum version 1.12)  Go version:       go1.12.10  Git commit:       9013bf5  Built:            Thu Oct 17 23:50:38 2019  OS/Arch:          linux/amd64  Experimental:     false containerd:  Version:          v1.2.10  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339 runc:  Version:          1.0.0-rc8+dev  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init:  Version:          0.18.0  GitCommit:        fec3683
  • 启动容器

我们启动一个 Python 3.7 版本的容器如果是第一次启动可能需要较长时间来拉取镜像:docker run -it Python:3.7 /bin/bash, 如下:

jincheng:libexec jincheng.sunjc$  docker run -it Python:3.7 /bin/bashUnable to find image 'Python:3.7' locally3.7: Pulling from library/Python8f0fdd3eaac0: Pull complete d918eaefd9de: Pull complete 43bf3e3107f5: Pull complete 27622921edb2: Pull complete dcfa0aa1ae2c: Pull complete bf6840af9e70: Pull complete 167665d59281: Pull complete ffc544588c7f: Pull complete 4ebe99df65fe: Pull complete Digest: sha256:40d615d7617f0f3b54614fd228d41a891949b988ae2b452c0aaac5bee924888dStatus: Downloaded newer image for Python:3.7
  • 容器中安装 virtualenv

我们在刚才启动的容器中安装 virtualenv, pip install virtualenv,如下:

root@1b48d2b526ae:/# pip install virtualenvCollecting virtualenv  Downloading https://files.Pythonhosted.org/packages/05/f1/2e07e8ca50e047b9cc9ad56cf4291f4e041fa73207d000a095fe478abf84/virtualenv-16.7.9-py2.py3-none-any.whl (3.4MB)     |████████████████████████████████| 3.4MB 2.0MB/s Installing collected packages: virtualenvSuccessfully installed virtualenv-16.7.9root@1b48d2b526ae:/#
  • 创建 Python 环境

以 always copy 方式建立一个全新的 Python 环境,名字随意,以 venv 为例,virtualenv --always-copy venv, 如下:

root@1b48d2b526ae:/# virtualenv --always-copy venvUsing base prefix '/usr/local'New Python executable in /venv/bin/PythonInstalling setuptools, pip, wheel...done.root@1b48d2b526ae:/#
  • 安装 Apache Beam

在新的 Python 环境中安装 apache-beam 2.15.0,venv/bin/pip install apache-beam==2.15.0,如下:

root@1b48d2b526ae:/# venv/bin/pip install apache-beam==2.15.0Collecting apache-beam==2.15.0......Successfully installed apache-beam-2.15.0 avro-Python3-1.9.1 certifi-2019.11.28 chardet-3.0.4 crcmod-1.7 dill-0.2.9 docopt-0.6.2 fastavro-0.21.24 future-0.18.2 grpcio-1.26.0 hdfs-2.5.8 httplib2-0.12.0 idna-2.8 mock-2.0.0 numpy-1.18.0 oauth2client-3.0.0 pbr-5.4.4 protobuf-3.11.2 pyarrow-0.14.1 pyasn1-0.4.8 pyasn1-modules-0.2.7 pydot-1.4.1 pymongo-3.10.0 pyparsing-2.4.6 pytz-2019.3 pyyaml-3.13 requests-2.22.0 rsa-4.0 six-1.13.0 urllib3-1.25.7
  • 查看 docker 中的 Python 环境

用 exit 命令退出容器,用 docker ps - a 找到 docker 容器的 id,用于拷贝文件,如下:

root@1b48d2b526ae:/# exitexitjincheng:libexec jincheng.sunjc$ docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES1b48d2b526ae        Python:3.7          "/bin/bash"         7 minutes ago       Exited (0) 8 seconds ago                       elated_visvesvaraya

由于刚刚结束,一般来说是列表中的第一条,可以根据容器的镜像名 Python:3.7 来分辨。我们记下最左边的容器 ID。如上是 1b48d2b526ae。

  • 打包 Python 环境

从将容器中的 Python 环境拷贝出来,我们切换到 flink/build-target 目录下,拷贝  docker cp 1b48d2b526ae:/venv ./ 并打包 zip -r venv.zip venv。


最终 flink/build-target 录下生成 venv.zip。

部署作业

终于到部署作业的环节了:), Flink on YARN 支持两种模式,per-job 和 session。per-job 模式在提交 job 时会为每个 job 单独起一个 Flink 集群,session 模式先在 Yarn 上起一个 Flink 集群,之后提交 job 都提交到这个 Flink 集群。

  • Pre-Job 模式部署作业

执行以下命令,以 Pre-Job 模式部署 PyFlink 作业:
bin/flink run -m yarn-cluster -pyarch venv.zip -pyexec venv.zip/venv/bin/Python -py deploy_demo.py,如下:

jincheng:build-target jincheng.sunjc$ bin/flink run -m yarn-cluster -pyarch venv.zip -pyexec venv.zip/venv/bin/Python -py deploy_demo.py2020-01-02 13:04:52,889 WARN  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - The configuration directory ('/Users/jincheng.sunjc/blog/demo_dev/flink/flink-dist/target/flink-1.10-SNAPSHOT-bin/flink-1.10-SNAPSHOT/conf') already contains a LOG4J config file.If you want to use logback, then please delete or rename the log configuration file.2020-01-02 13:04:52,889 WARN  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - The configuration directory ('/Users/jincheng.sunjc/blog/demo_dev/flink/flink-dist/target/flink-1.10-SNAPSHOT-bin/flink-1.10-SNAPSHOT/conf') already contains a LOG4J config file.If you want to use logback, then please delete or rename the log configuration file.Results directory: /var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/result2020-01-02 13:04:55,945 INFO  org.apache.hadoop.yarn.client.RMProxy                         - Connecting to ResourceManager at /0.0.0.0:80322020-01-02 13:04:56,049 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - No path for the flink jar passed. Using the location of class org.apache.flink.yarn.YarnClusterDescriptor to locate the jar2020-01-02 13:05:01,153 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - Neither the HADOOP_CONF_DIR nor the YARN_CONF_DIR environment variable is set. The Flink YARN Client needs one of these to be set to properly load the Hadoop configuration for accessing YARN.2020-01-02 13:05:01,177 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Cluster specification: ClusterSpecification{masterMemoryMB=1024, taskManagerMemoryMB=1024, numberTaskManagers=1, slotsPerTaskManager=1}2020-01-02 13:05:01,294 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - The file system scheme is 'file'. This indicates that the specified Hadoop configuration path is wrong and the system is using the default Hadoop configuration values.The Flink YARN client needs to store its files in a distributed file system2020-01-02 13:05:02,600 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Submitting application master application_1577936885434_00042020-01-02 13:05:02,971 INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl         - Submitted application application_1577936885434_00042020-01-02 13:05:02,972 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Waiting for the cluster to be allocated2020-01-02 13:05:02,975 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Deploying cluster, current state ACCEPTED2020-01-02 13:05:23,138 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - YARN application has been deployed successfully.2020-01-02 13:05:23,140 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Found Web Interface localhost:61616 of application 'application_1577936885434_0004'.Job has been submitted with JobID a41d82194a500809fd715da8f29894a0Program execution finishedJob with JobID a41d82194a500809fd715da8f29894a0 has finished.Job Runtime: 35576 ms

上面信息已经显示运行完成,在 Web 界面可以看到作业状态:

2244ca6e00a8c4b06b7e9ed0c1b7b5d9.png

我们再检验一下计算结果:

cat/var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/result:

ee04ffabff7f5c66aaeb0ddb21d47eec.png

到这里,我们以 Pre-Job 的方式成功部署了 PyFlink 的作业!相比提交到本地 Standalone 集群,多了三个参数,我们简单说明如下:

参数说明

-m yarn-cluster

以 Per-Job 模式部署到 yarn 集群

-pyarch venv.zip

将当前目录下的 venv.zip 上传到 yarn 集群

-pyexec venv.zip/venv/bin/Python

指定 venv.zip 中的 Python 解释器来执行 Python UDF,路径需要和 zip 包内部结构一致。

  • Session 模式部署作业

以 Session 模式部署作业也非常简单,我们实际操作一下:

jincheng:build-target jincheng.sunjc$ bin/yarn-session.sh 2020-01-02 13:58:53,049 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: jobmanager.rpc.address, localhost2020-01-02 13:58:53,050 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: jobmanager.rpc.port, 61232020-01-02 13:58:53,050 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: jobmanager.heap.size, 1024m2020-01-02 13:58:53,050 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: taskmanager.memory.process.size, 1024m2020-01-02 13:58:53,050 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: taskmanager.numberOfTaskSlots, 12020-01-02 13:58:53,050 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: parallelism.default, 12020-01-02 13:58:53,051 INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: jobmanager.execution.failover-strategy, region2020-01-02 13:58:53,413 WARN  org.apache.hadoop.util.NativeCodeLoader                       - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable2020-01-02 13:58:53,476 INFO  org.apache.flink.runtime.security.modules.HadoopModule        - Hadoop user set to jincheng.sunjc (auth:SIMPLE)2020-01-02 13:58:53,509 INFO  org.apache.flink.runtime.security.modules.JaasModule          - Jaas file will be created as /var/folders/fp/s5wvp3md31j6v5gjkvqbkhrm0000gp/T/jaas-3848984206030141476.conf.2020-01-02 13:58:53,521 WARN  org.apache.flink.yarn.cli.FlinkYarnSessionCli                 - The configuration directory ('/Users/jincheng.sunjc/blog/demo_dev/flink/flink-dist/target/flink-1.10-SNAPSHOT-bin/flink-1.10-SNAPSHOT/conf') already contains a LOG4J config file.If you want to use logback, then please delete or rename the log configuration file.2020-01-02 13:58:53,562 INFO  org.apache.hadoop.yarn.client.RMProxy                         - Connecting to ResourceManager at /0.0.0.0:80322020-01-02 13:58:58,803 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - Neither the HADOOP_CONF_DIR nor the YARN_CONF_DIR environment variable is set. The Flink YARN Client needs one of these to be set to properly load the Hadoop configuration for accessing YARN.2020-01-02 13:58:58,824 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Cluster specification: ClusterSpecification{masterMemoryMB=1024, taskManagerMemoryMB=1024, numberTaskManagers=1, slotsPerTaskManager=1}2020-01-02 13:59:03,975 WARN  org.apache.flink.yarn.YarnClusterDescriptor                   - The file system scheme is 'file'. This indicates that the specified Hadoop configuration path is wrong and the system is using the default Hadoop configuration values.The Flink YARN client needs to store its files in a distributed file system2020-01-02 13:59:04,779 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Submitting application master application_1577936885434_00052020-01-02 13:59:04,799 INFO  org.apache.hadoop.yarn.client.api.impl.YarnClientImpl         - Submitted application application_1577936885434_00052020-01-02 13:59:04,799 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Waiting for the cluster to be allocated2020-01-02 13:59:04,801 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Deploying cluster, current state ACCEPTED2020-01-02 13:59:24,711 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - YARN application has been deployed successfully.2020-01-02 13:59:24,713 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Found Web Interface localhost:62247 of application 'application_1577936885434_0005'.JobManager Web Interface: http://localhost:62247

执行成功后不会返回,但会启动一个 JoBManager Web,地址如上http://localhost:62247,可复制到浏览器查看:

696f37b0f7c69612bc6c8d7b80bb5e0d.png

我们可以修改 conf/flink-conf.yaml 中的配置参数。如果要更改某些内容,请参考官方文档。接下来我们提交作业,首先按组合键 Ctrl+Z 将 yarn-session.sh 进程切换到后台,并执行 bg 指令让其在后台继续执行, 然后执行以下命令,即可向 Session 模式的 Flink 集群提交 job bin/flink run -m yarn-cluster -pyarch venv.zip -pyexec venv.zip/venv/bin/Python -py deploy_demo.py:

jincheng:build-target jincheng.sunjc$ bin/flink run -pyarch venv.zip -pyexec venv.zip/venv/bin/Python -py deploy_demo.py2020-01-02 14:10:48,285 INFO  org.apache.flink.yarn.YarnClusterDescriptor                   - Found Web Interface localhost:62247 of application 'application_1577936885434_0005'.Job has been submitted with JobID bea33b7aa07c0f62153ab5f6e134b6bfProgram execution finishedJob with JobID bea33b7aa07c0f62153ab5f6e134b6bf has finished.Job Runtime: 34405 ms

如果在打印 finished 之前查看之前的 web 页面,我们会发现 Session 集群会有一个正确运行的作业,如下:

b8db05f7304e3532fde058a43e5d008e.png

如果已经运行完成,那么我们应该会看到状态也变成结束:

ea0a89ecb43f5a6f3279ac2a9b91b5e3.png

相比 per job 模式提交,少了”-m”参数。因为之前已经启动了 yarn-session.sh,所以 Flink 默认会向 yarn-session.sh 启动的集群上提交 job。执行完毕后,别忘了关闭 yarn-session.sh(session 模式):先将 yarn-session.sh 调到前台,执行 fg,然后在再按 Ctrl+C 结束进程或者执行 stop,结束时 YARN 上的集群也会被关闭。

Docker 模式部署

我们还可以将 Flink Python job 打包成 docker 镜像,然后使用 docker-compose 或者 Kubernetes 部署执行,由于现在的 docker 镜像打包工具并没有完美支持运行 Python UDF,因此我们需要往里面添加一些额外的文件。首先是一个仅包含PythonDriver 类的 jar 包. 我们在 build-target 目录下执行如下命令:

jincheng:build-target jincheng.sunjc$ mkdir tempjincheng:build-target jincheng.sunjc$ cd tempjincheng:temp jincheng.sunjc$ unzip ../opt/flink-Python_2.11-1.10-SNAPSHOT.jar org/apache/flink/client/Python/PythonDriver.classArchive:  ../opt/flink-Python_2.11-1.10-SNAPSHOT.jar  inflating: org/apache/flink/client/Python/PythonDriver.class

解压之后,我们再进行压缩打包:

jincheng:temp jincheng.sunjc$ zip Python-driver.jar org/apache/flink/client/Python/PythonDriver.class  adding: org/apache/flink/client/Python/PythonDriver.class (deflated 56%)

ea9059d371a046698509e9614572a617.png

我们得到 Python-driver.jar。然后下载一个 pyArrow 的安装文件(我准备了一个大家下载直接使用即可 pyarrow-0.12.0a0-cp36-cp36m-linux_x86_64.whl。执行以下命令构建 Docker 镜像,需要作为 artifacts 引入的文件有作业文件,Python-driver 的 jar 包和 pyarrow 安装文件,./build.sh --job-artifacts ~/deploy_demo.py,Python-driver.jar,pyarrow-0.12.0a0-cp36-cp36m-linux_x86_64.whl --with-Python3 --from-local-dist(进入 flink/flink-container/docker 目录)。

jincheng:docker jincheng.sunjc$ ./build.sh --job-artifacts ~/deploy_demo.py,Python-driver.jar,pyarrow-0.12.0a0-cp36-cp36m-linux_x86_64.whl --with-Python3 --from-local-distUsing flink dist: ../../flink-dist/target/flink-*-bina .a ./flink-1.10-SNAPSHOTa ./flink-1.10-SNAPSHOT/temp......Removing intermediate container a0558bbcbdd1 ---> 00ecda6117b7Successfully built 00ecda6117b7Successfully tagged flink-job:latest

构建 Docker 镜像需要较长时间,请耐心等待。构建完毕之后,可以输入 docker images 命令在镜像列表中找到构建结果 docker images:

abb8143a6bfaa24875e892c1fc164a6d.png

然后我们在构建好的镜像基础上安装好 Python udf 所需依赖,并删除过程中产生的临时文件:

  • 启动 docker 容器
    docker run -it --user root --entrypoint /bin/bash --name flink-job-container flink-job

  • 安装一些依赖
    apk add --no-cache g++ Python3-dev musl-dev

  • 安装 PyArrow
    python -m pip3 install /opt/artifacts/pyarrow-0.12.0a0-cp36-cp36m-linux_x86_64.whl

  • 安装 Apache Beam
    python -m pip3 install apache-beam==2.15.0

  • 删除临时文件
    rm -rf /root/.cache/pip

执行完如上命令我可以执行 exit 退出容器了,然后把这个容器提交为新的 flink-job 镜像 docker commit -c 'CMD ["--help"]' -c "USER flink" -c 'ENTRYPOINT ["/docker-entrypoint.sh"]' flink-job-container flink-job:latest:

jincheng:docker jincheng.sunjc$ docker commit -c 'CMD ["--help"]' -c "USER flink" -c 'ENTRYPOINT ["/docker-entrypoint.sh"]' flink-job-container flink-job:latest sha256:0740a635e2b0342ddf776f33692df263ebf0437d6373f156821f4dd044ad648b

到这里包含 Python UDF 作业的 Docker 镜像就制作好了,这个 Docker 镜像既可以以 docker-compose 使用,也可以结合 Kubernetes 中使用。

我们以使用 docker-compose 执行为例,mac 版 docker 自带 docker-compose,用户可以直接使用,在 flink/flink-container/docker 目录下,使用以下命令启动作业,FLINK_JOB=org.apache.flink.client.Python.PythonDriver FLINK_JOB_ARGUMENTS="-py /opt/artifacts/deploy_demo.py" docker-compose up:

jincheng:docker jincheng.sunjc$ FLINK_JOB=org.apache.flink.client.Python.PythonDriver FLINK_JOB_ARGUMENTS="-py /opt/artifacts/deploy_demo.py" docker-compose upWARNING: The SAVEPOINT_OPTIONS variable is not set. Defaulting to a blank string.Recreating docker_job-cluster_1 ... doneStarting docker_taskmanager_1   ... doneAttaching to docker_taskmanager_1, docker_job-cluster_1taskmanager_1  | Starting the task-managerjob-cluster_1  | Starting the job-cluster......job-cluster_1  | 2020-01-02 08:35:03,796 INFO  org.apache.flink.runtime.entrypoint.ClusterEntrypoint         - Terminating cluster entrypoint process StandaloneJobClusterEntryPoint with exit code 0.docker_job-cluster_1 exited with code 0

在 log 中出现“docker_job-cluster_1 exited with code 0”表示 job 已执行成功,JobManager 已经退出。TaskManager 还需要较长的时间等待超时后才会退出,我们可以直接按快捷键 Ctrl+C 提前退出。

查看执行结果,可以从 TaskManager 的容器中将结果文件拷贝出来查看,执行 docker cp docker_taskmanager_1:/tmp/result ./; cat result。

10f44a341248981003f69ed63c1968cc.png

Okay, 到这里本篇要与大家分享的内容已经接近尾声了,如果你期间也很顺利的成功了,可以 Cheers 了:)

小结

本篇核心向大家分享了如何以多种方式部署 PyFlink 作业。期望在 PyFlink 1.10 发布之后,大家能有一个顺利快速体验的快感!作者博客原文在开篇说道部分,为大家分享了老子倡导大家的 “致虚极,守静笃。万物并作,吾以观其复”的大道,同时也给大家带来了 2020 的祝福,祝福大家 “2020 安!”点击「阅读原文」即可查看~

作者介绍:

孙金城(金竹),ASF Member,Committer & PMC Member at @Apache Flink,And Staff Engineer at @Alibaba。自 2015 年以来一直专注于大数据计算领域,并持续贡献于Apache Flink 社区。2011 年加入阿里巴巴集团,目前就职于阿里巴巴计算平台事业部,负责 Apache Flink Python API(PyFlink) 的整体架构开发工作。
关注 Ververica,获取更多 Flink 技术干货fb27dd0890853ad94821b91a3480f8e6.png你也「在看」吗??

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

office2007每次打开都配置进度_office2007 每次打开word,excel等显示正在配置Office Professional Plus 2007的解决方...

有时候 Office2007打开文档&#xff0c;每次都提示需要安装。配置&#xff0c;配置完成之后&#xff0c;下次打开又需要配置点击取消就不能打开。非常的烦。ffice2007下载后为什么每次打开总需要置&#xff1f;office2007每次打开都要正在配置&#xff1f;其实不需要重新安装可…

consul 文件夹无法显示_consul集群搭建参考

1.官网下载安装包https://releases.hashicorp.com/consul/1.4.3/consul_1.4.3_linux_amd64.zip2.部署节点如下192.168.8.142 sxconsul1192.168.8.143 sxconsul2192.168.8.144 sxconsul33.解压之后的consul是一个可执行文件&#xff0c;复制到/usr/local/bin/ 下4.三台服务器创建…

mysql linux环境安装_MySQL Linux环境的安装配置

在Kali中已经内置了MySQL(镜像可以从mysql.com/downloads/ 下载安装)奇怪的是博主我的kali内置的是mariaDB数据库&#xff0c;所以我也懒得弄MySQL了&#xff01;直接mariaDB吧&#xff01;差不多【PS:据博主所致&#xff0c;mariaDB的操作和MySQL一样哦&#xff01;在这后面有…

define定义的是什么类型_DEFINE_PROFILE用法介绍(1)

“ 长风破浪会有时&#xff0c;直挂云帆济沧海&#xff01;”01—概述可以使用DEFINE_PROFILE定义一个自定义边界配置文件或单元格区域条件&#xff0c;该条件随空间坐标或时间而变化。可以自定义的变量如下:速度&#xff0c;压力&#xff0c;温度&#xff0c;湍流动能&#xf…

如何判断输入的是字符还是数字_[Leetgo]判断字符串是否为数字

题解分析代码实现实现一个函数用来判断字符串是否表示数值(包括整数和小数)。题解分析一个标识数字的字符串可能包括以下字符类型&#xff1a;空格&#xff1b;数组&#xff1a;0~9&#xff1b;正负号小数点幂符号&#xff1a;e/E&#xff1b;为了解决此类问题&#xff0c;需要…

mysql语句转为sql语句_MySQL 的分页查询 SQL 语句(转)

转自 https://www.cnblogs.com/wbxk/p/10644766.htmlMySQL一般使用 LIMIT 实现分页。基本语句为&#xff1a;SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...在中小数据量的情况下&#xff0c;这样的SQL足够用了&#xff0c;唯一需要注意的问题就是确保使用了索引。举例…

mysql查询选课最少成绩最高_MySQL 练习

最近在学习MYSQL 数据库&#xff0c;在此mark 一下做过的sql 相关练习表结构如下&#xff1a;teacher表tidtnameclass表cidcaptioncourse表cidcnameteacher_idstudent表sidgenderclass_idsnamescore表sidstudent_idcourse_idnumclass :teacher : course : student :score : 根…

java 判断子类_java判断class是否是某个类的子类或父类

Class c = ArrayList.class; c.isPrimitive(); //判断c是否为基本数据类型 c.isAssignableFrom(List.class); //判断c是否是List类的子类或父类 c.getGenericType(); //得到泛型类型 免费学习视频分享:java视频教程 实例:通过反射得到List 集合中的泛型类型package com.zf.ta…

Java游戏有易筋经_易筋经- JavaWeb-1

JavaScript一种直译式脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内置支持类型。它的解释器被称为JavaScript引擎&#xff0c;为浏览器的一部分&#xff0c;广泛用于客户端的脚本语言组成部分:ECMAScript:js基础语法(规定 关键字 运算符 语句 函数…

java导出hbase表数据_通用MapReduce程序复制HBase表数据

编写MR程序&#xff0c;让其可以适合大部分的HBase表数据导入到HBase表数据。其中包括可以设置版本数、可以设置输入表的列导入设置(选取其中某几列)、可以设置输出表的列导出设置(选取其中某几列)。原始表test1数据如下&#xff1a;每个row key都有两个版本的数据&#xff0c;…

java服务器和linux_在Linux下开一个Java服务器(使用CatServer Pro)

引言Linux开服具有快速&#xff0c;高效&#xff0c;性能等特点&#xff0c;而Windows虽然简单&#xff0c;但是不具备Linux良好的性能。本教程就说明一下简单的Linux开服方式(需要教程的人&#xff0c;如果你学会后&#xff0c;请无偿帮助更多的人。)服务器准备首先。先准备一…

我的世界java版游戏崩溃_我的世界全攻略之-游戏崩溃的解决方法

我的世界崩溃怎么办&#xff1f;下面吾爱网小编给大家带来我的世界无法正常启动的解决方法,需要的朋友可以参考下。我的世界作为许多玩家都十分喜爱的模拟经营沙盘类游戏,经常有玩家反映在玩我的世界的时候,游戏总是会出现崩溃或者无法启动的情况,玩家在遇到的时候不知道怎么办…

vue3 新项目 - 搭建路由router

创建router/index 文件 main.ts 安装 router 然后 在 app下面 去 设置 路由出口

java如何获得相反的颜色_javascript – 如何根据当前颜色生成相反的颜色?

更新&#xff1a;GitHub上的生产就绪代码.我就是这样做的&#xff1a;>将HEX转换为RGB>反转R,G和B组件>将每个组件转换回HEX>用零和输出填充每个组件.function invertColor(hex) {if (hex.indexOf(#) 0) {hex hex.slice(1);}// convert 3-digit hex to 6-digits.…

wamp php启动不成功,wamp的mysql 启动失败解决

wamp启动失败&#xff0c;查看原因是mysql 启动失败首先查看mysql的启动日志命令&#xff1a;mysqld --console知道error报错的地方&#xff1a;然后百度了此报错&#xff0c;解决方法在my.ini中添加innodb_force_recovery 1发现这个会影响insert需要设置为 innodb_force_reco…

php复选框样式,如何自定义checkbox样式?附代码

本篇文章给大家带来的内容是关于如何自定义checkbox样式&#xff1f;附代码&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。修改原生checkbox样式。效果原理1.利用CSS3属性 appearance。该属性(强制)更改(改变)默认(原生)样式…

JAVA用数据留给出师表排序,如果诸葛亮会编程,用Java写出师表...

继上一篇 "如果诸葛亮用C#写出师表..."后&#xff0c;站长想自己的第一语言是Java&#xff0c;虽然平时工作上用的不多&#xff0c;也用Java实现一遍吧&#xff0c;改改就是了&#xff0c;无非就是:C#的Console.WriteLine改为Java的System.out.println&#xff1b;C#…

linux下的安装命令行工具下载,linux系统程序安装(二)yum工具2-yum源及包下载

继续我们的yum工具应用之旅&#xff0c;yum工具之所以方便就是因为有方便的在线云库&#xff0c;实际工作中我们可能没办法链接互联网&#xff0c;或者我们想安装的程序原生源那么我们能不能用其他方式应用方便的yum源呢&#xff1f;一、使用光盘作为yum源1、将光盘挂载到/mnt目…

体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB)...

Tiny Core Linux (TCL) 是一款极体积极小且高度可扩展的微型 Linux 发行版&#xff0c;它将一个 Linux 操作系统精简到仅有 10 多 MB 左右的大小&#xff0c;似乎小巧得有点让人叹为观止&#xff01;要知道无论是常见的 Ubuntu、CentOS、Debian 的体积动辄就是几百MB甚至要上GB…

linux新建samba账户,ubuntu上创建账户和samba用户

系统环境&#xff1a;Linux ubuntu152 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64x86_64 GNU/Linux系统用户登录创建linux账户:1. sudo adduser username --home /home/username执行该命令后需要两次输入账户密码&#xff0c;连续回车&…