Cloud Native Sqoop on k8s の解説と実践的な操作

Cloud Native Sqoop on k8s の解説と実践的な操作

1. 概要

Sqoop は、構造化データと Hadoop 間のバッチデータ移行のためのツールです。構造化データは、MySQL や Oracle などの RDBMS にすることができます。 Sqoop は、最下層で MapReduce プログラムを使用して、抽出、変換、およびロードを実装します。 MapReduce の固有の特性により、並列化と高い耐障害性が保証されます。 Kettle などの従来の ETL ツールと比較すると、タスクは Hadoop クラスター上で実行されるため、ETL サーバー リソースの使用量が削減されます。特定のシナリオでは、抽出プロセスのパフォーマンスが大幅に向上します。

Sqoop アーキテクチャ:

  • 公式サイト: https://sqoop.apache.org/
  • 公式ドキュメント: https://sqoop.apache.org/docs/1.99.7/index.html
  • GitHub: https://github.com/apache/sqoop
  • Sqoop についてさらに詳しく知りたい場合は、次の記事も参照してください: Big Data Hadoop - データ同期ツール Sqoop
  • ここでの Hadoop 環境の展開については、私の記事を参照してください: [クラウドネイティブ] Hadoop HA on k8s 環境の展開
  • MySQL環境のデプロイについては、私の記事を参照してください: [Cloud Native] MySQL on k8s環境のデプロイ

2. オーケストレーションとデプロイメントを開始する

1) Sqoopデプロイメントパッケージをダウンロードする

ダウンロードアドレス: http://archive.apache.org/dist/sqoop/

 wget http://archive.apache.org/dist/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar .gz
tar - xf sqoop - 1.99 .7 - bin - hadoop200 .tar .gz

2) イメージを構築する

Dockerファイル

 myharbor.com/bigdata/centosより: 7.9.2009
RUN rm -f / etc / localtime && ln -sv / usr / share / zoneinfo / Asia / Shanghai / etc / localtime && echo "アジア/上海" > / etc / timezone
環境変数LANG = zh_CN .UTF - 8

groupadd --system --gid=10000 admin && useradd --system --home-dir /home/admin --uid=10000 --gid=admin -m admin を実行します。

### ツールをインストールする
実行 yum install -y vim tar wget curl less telnet net -tools lsof mysql

mkdir -p / opt / apacheを実行します

docker-entrypoint.sh/opt/apache/​​​ をコピーします
chmod + x /opt/apache/docker-entrypoint.sh​ を実行します。

JDK
ADD jdk - 8 u212 - linux - x64 .tar .gz / opt / apache /
環境変数JAVA_HOME /opt/apache/jdk1.8.0_212
環境変数PATH = $JAVA_HOME / bin : $PATH

スクープ
ADD sqoop - 1.99.7 - bin - hadoop200.tar.gz / opt / apache /
# 環境変数を設定する
ENV SQOOP_HOME =/ opt / apache / sqoop
環境変数PATH = $SQOOP_HOME / bin : $PATH
環境変数 SQOOP_SERVER_EXTRA_LIB = $SQOOP_HOME / lib
ln -s / opt / apache / sqoop - 1.99.7 - bin - hadoop200 $SQOOP_HOME を実行します。
環境変数PATH = $SQOOP_HOME / bin : $PATH

# sqoop hadoop 環境設定
ADD hadoop - 3.3 .2 .tar .gz / opt / apache /
ENV HADOOP_HOME =/ opt / apache / hadoop
実行ln -s / opt / apache / hadoop - 3.3 .2 $HADOOP_HOME
ENV HADOOP_CONF_DIR = $ { HADOOP_HOME } / etc / hadoop
環境変数PATH = $ { HADOOP_HOME } / bin : $PATH

#mysql JDBC ドライバー
# wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar
コピー mysql -コネクタ- java - 8.0 .30 .jar $SQOOP_HOME / lib /

# チョーン
chown - R admin を実行します: admin / opt / apache

#作業ディレクトリを設定する
ワークディレクトリ $SQOOP_HOME

# スクリプトを実行します。イメージのビルド時には実行されませんが、インスタンスの実行時には実行されます。
エントリポイント[ "/opt/apache/docker-entrypoint.sh" ]

イメージの構築を開始する

ビルド sqoop を docker で実行します。 --キャッシュなし

# 画像をアップロードする
docker push myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200

# 画像を削除する
docker rmi myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200
crictl rmi myharbor.com/bigdata/sqoop:sqoop-1.99.7-bin-hadoop200

3) sqoopチャートテンプレートを作成する

ヘルムはsqoopを作成します

4) YAMLレイアウトを変更する

  • sqoop/値.yaml
画像
リポジトリ: myharbor.com/bigdata/sqoop
プルポリシー: IfNotPresent
# デフォルトがチャートの appVersionあるイメージ タグをオーバーライドします。
タグ: "sqoop-1.99.7-bin-hadoop200"

セキュリティコンテキスト:
実行ユーザー: 10000
実行グループ: 10000
特権 true

サービス
タイプ: ClusterIP
ポート: 12000
  • sqoop/テンプレート/configmap.yaml
 APIバージョン: v1
種類: ConfigMap
メタデータ:
名前: { { "sqoop.fullname"を含めます。 } }
ラベル:
{ { - "sqoop.labels"を含めます。 |ニンデント4 } }
データ
sqoop .properties : |-
# Sqoop の設定。
#
org .apache .sqoop .log4j .debug = false
org .apache .sqoop .log4j .rootLogger = INFO ファイル
org .apache .sqoop .log4j .category .org .apache .sqoop = INFO
org .apache .sqoop .log4j .appender .file = org .apache .log4j .RollingFileAppender
org .apache .sqoop .log4j .appender .file .File = @LOGDIR@ / sqoop .log
org .apache .sqoop .log4j .appender .file .MaxFileSize = 25 MB
org .apache .sqoop .log4j .appender .file .MaxBackupIndex = 5
org .apache .sqoop .log4j .appender .file .layout = org .apache .log4j .PatternLayout
org .apache .sqoop .log4j .appender .file .layout .Cnotallow =% d { ISO8601 } %- 5 p [ % l ] % m % n
# FileAuditLogger のデフォルト設定の監査ロガー
org .apache .sqoop .log4j .logger .audit = INFO 監査
org .apache .sqoop .log4j .appender .audit = org .apache .log4j .RollingFileAppender
org .apache .sqoop .log4j .appender .audit .File = @LOGDIR@ / audit .log
org .apache .sqoop .log4j .appender .audit .MaxFileSize = 25 MB
org .apache .sqoop .log4j .appender .audit .MaxBackupIndex = 5
org .apache .sqoop .log4j .appender .audit .layout = org .apache .log4j .PatternLayout
org .apache .sqoop .log4j .appender .audit .layout .Cnotallow =% d { ISO8601 } %- 5 p [ % l ] % m % n

#
# 監査ロガーの設定
# ここでは複数の監査ロガーを指定できます。指定するには
# 監査ロガーの場合少なくとも org .apache .sqoopを追加する必要があります。
# 監査ロガー。 [ロガー名] .class .また、
# org .apache .sqoopを使用すると、より多くの構成オプションが利用可能になります。
# 監査ロガー。 [ LoggerName ]プレフィックスを付けるとこれらすべてのオプション
# はロガークラスに解析されます。
#
org .apache .sqoop .auditlogger .default .class = org .apache .sqoop .audit .FileAuditLogger
org .apache .sqoop .auditlogger .default .logger =監査

#
# リポジトリの設定
# リポジトリサブシステムは特別なプレフィックスを提供します。
# は「org.apache.sqoop.repository.sysprop」です。いかなる財産も
#が指定されている場合は、このプレフィックス解析
# システムプロパティ。例えば組み込みDerbyリポジトリの場合
#使用されている場合 syspropプレフィックス付きプロパティを使用できます
# 起動にDerbyの設定影響を与えるには、
# 適切なシステムプロパティ。
#

# リポジトリプロバイダー
org.apache.sqoop.repository.provider = org.apache.sqoop.repository.JdbcRepositoryProvider

# リポジトリのアップグレード
# true設定する sqoop リポジトリ スキーマはアップグレードされませんデフォルトでは、サーバーの起動時にアップグレードが開始されます
org .apache .sqoop .repository .schema .immutable = false

# JDBC リポジトリプロバイダーの設定
org .apache .sqoop .repository .jdbc .handler = org .apache .sqoop .repository .derby .DerbyRepositoryHandler
org .apache .sqoop .repository .jdbc .transaction .isolatinotallow = READ_COMMITTED
org .apache .sqoop .リポジトリ.jdbc .最大.cnotallow = 10
org .apache .sqoop .repository .jdbc .url = jdbc : derby : @BASEDIR@ / repository / db ;作成=
org .apache .sqoop .repository .jdbc .driver = org .apache .derby .jdbc .EmbeddedDriver
org .apache .sqoop .リポジトリ.jdbc .ユーザー= sa
org .apache .sqoop .リポジトリ.jdbc .パスワード=

# 埋め込み Derby 構成のシステム プロパティ
org .apache .sqoop .repository .sysprop .derby .stream .error .file = @LOGDIR@ / derbyrepo .log

#
# Sqoop コネクタの設定
# true設定すると、サーバーの起動時にコネクタ構成のアップグレードが開始されます
#
org .apache .sqoop .connector .autoupgrade = false

#
# Sqoop ドライバーの設定
# true設定すると、サーバーの起動時にドライバー構成のアップグレードが開始されます
#
org .apache .sqoop .driver .autoupgrade = false

# 設定ファイルを再読み込みするためのスリープ期間( 1 分に 1 回)
org .apache .sqoop .core .configuration .provider .properties .sleep = 60000

#
# 送信エンジンの設定
#

# 送信エンジンクラス
org .apache .sqoop .submission .engine = org .apache .sqoop .submission .mapreduce .MapreduceSubmissionEngine

# ミリ秒数この制限より前に作成された投稿は削除されますデフォルトは 1 日です
#org .apache .sqoop .submission .purge .threshold =

# パージスレッドがスリープするミリ秒数デフォルトでは1 日
#org .apache .sqoop .submission .purge .sleep =

#更新スレッドがスリープするミリ秒数デフォルトでは5
#org .apache .sqoop .submission .update .sleep =

#Hadoop 構成ディレクトリ
org .apache .sqoop .submission .engine .mapreduce .configuration .directory =/ opt / apache / hadoop / etc / hadoop /

# Sqoop Mapper / Reducer のログレベル
org .apache .sqoop .submission .engine .mapreduce .configuration .loglevel = INFO

#
#実行エンジンの設定
#
org .apache .sqoop .execution .engine = org .apache .sqoop .execution .mapreduce .MapreduceExecutionEngine

#
#認証設定
#
#org .apache .sqoop .security .authentication .type = SIMPLE
# org.apache.sqoop.security.authentication.handler = org.apache.sqoop.security.authentication.SimpleAuthenticationHandler
#org .apache .sqoop .security .authentication .annotallow = true
#org .apache .sqoop .security .authentication .type = KERBEROS
# org.apache.sqoop.security.authentication.handler = org.apache.sqoop.security.authentication.KerberosAuthenticationHandler
#org .apache .sqoop .security .authentication .kerberos .principal = sqoop / _HOST@NOVALOCAL
#org .apache .sqoop .security .authentication .kerberos .keytab =/ home / kerberos / sqoop .keytab
#org .apache .sqoop .security .authentication .kerberos .http .principal = HTTP / _HOST@NOVALOCAL
#org .apache .sqoop .security .authentication .kerberos .http .keytab =/ home / kerberos / sqoop .keytab
#org .apache .sqoop .security .authentication .enable .doAs = true
#org .apache .sqoop .security .authentication .proxyuser .#USER# .users =*
#org .apache .sqoop .security .authentication .proxyuser .#USER# .groups =*
#org .apache .sqoop .security .authentication .proxyuser .#USER# .hosts =*

# デフォルトユーザーデフォルト値は「sqoop.anonymous.user」です
#org .apache .sqoop .security .authentication .default .user =

#
# 認証設定
#
# org.apache.sqoop.security.authorization.handler = org.apache.sqoop.security.authorization.DefaultAuthorizationHandler
# org.apache.sqoop.security.authorization.access_cnotallow = org.apache.sqoop.security.authorization.DefaultAuthorizationAccessController
# org.apache.sqoop.security.authorization.validator = org.apache.sqoop.security.authorization.DefaultAuthorizationValidator
# org.apache.sqoop.security.authorization.authentication_provider = org.apache.sqoop.security.authorization.DefaultAuthenticationProvider
#org .apache .sqoop .security .authorization .server_name = SqoopServer1

#
# SSL / TLS 設定
#
#org .apache .sqoop .security .tls .enabled = false
#org .apache .sqoop .security .tls .protocol = "TLSv1.2"
#org .apache .sqoop .security .tls .keystore =
#org .apache .sqoop .security .tls .keystore_password =

#
# リポジトリの暗号化
#

#org .apache .sqoop .security .repo_encryption .enabled = true
#org .apache .sqoop .security .repo_encryption .password =
#org .apache .sqoop .security .repo_encryption .password_generator =
#org .apache .sqoop .security .repo_encryption .hmac_algorithm = HmacSHA256
#org .apache .sqoop .security .repo_encryption .cipher_algorithm = AES
#org .apache .sqoop .security .repo_encryption .cipher_key_size = 16
#org .apache .sqoop .security .repo_encryption .cipher_spec = AES / CBC / PKCS5Padding
#org .apache .sqoop .security .repo_encryption .initialization_vector_size = 16
#org .apache .sqoop .security .repo_encryption .pbkdf2_algorithm = PBKDF2WithHmacSHA1
#org .apache .sqoop .security .repo_encryption .pbkdf2_rounds = 4000


# 外部コネクタの負荷パス
# "/path/to/external/connectors/" :指定されたフォルダ内のすべてのコネクタJARを追加します
#
org .apache .sqoop .connector .external .loadpath =

# Sqoop アプリケーション クラスパス
# sqoop含める jar の":"区切りリスト。
#
org .apache .sqoop .classpath .extra =

# すべてのジョブに含まれる Sqoop の追加クラスパス
# マップジョブクラスパス含める jar の":"区切りリスト。
#
org .apache .sqoop .classpath .job =

#
# Jetty サーバーの設定
#
#org .apache .sqoop .jetty .thread .pool .worker .max = 500
#org .apache .sqoop .jetty .thread .pool .worker .min = 5
#org .apache .sqoop .jetty .thread .pool .worker .alive .time = 60
org .apache .sqoop .jetty .port = { { .Values ​​.service .port } }

# ブラックリストに登録されたコネクタ
# コネクタ名を「:」区切ってリストしたもの
# sqoopconnector .propertiesファイル
org .apache .sqoop .connector .blacklist =
  • sqoop/テンプレート/statefulset.yaml
 apiバージョン:アプリ/ v1
種類:ステートフルセット
メタデータ:
名前: { { "sqoop.fullname"を含めます。 } }
ラベル:
{ { - "sqoop.labels"を含めます。 |ニンデント4 } }
仕様:
serviceName : { { "sqoop.fullname"を含めます。 } }
{ { - .Values ​​.autoscaling .enabledでない場合} }
レプリカ: { { .Values ​​.replicaCount } }
{ { -終わり} }
セレクター:
マッチラベル:
{ { - "sqoop.selectorLabels"を含めます。 |ニンデント6 } }
テンプレート
メタデータ:
{ { - .Values ​​.podAnnotationsを使用} }
注釈:
{ { - toYaml 。 |ニンデント8 } }
{ { -終わり} }
ラベル:
{ { - "sqoop.selectorLabels"を含めます。 |ニンデント8 } }
仕様:
{ { - .Values ​​.imagePullSecretsを使用} }
イメージプルシークレット:
{ { - toYaml 。 |ニンデント8 } }
{ { -終わり} }
serviceAccountName : { { 「sqoop.serviceAccountName」を含めます。 } }
セキュリティコンテキスト:
{ { - toYaml .Values ​​.podSecurityContext |ニンデント8 } }
コンテナ:
-名前: { { .Chart .Name } }
セキュリティコンテキスト:
{ { - toYaml .Values ​​.securityContext |ニンデント12 } }
画像: "` `.`Values`.`image`.`repository `:{{ .Values.image.tag | default .Chart.AppVersion }}"
イメージプルポリシー: { { .Values ​​.image .pullPolicy } }
ポート:
-名前: sqoop
コンテナポート: { { .Values ​​.service .port } }
プロトコル: TCP
ボリュームマウント:
-名前: { { .Release .Name } } - conf
マウントパス: /opt/apache/sqoop/conf/sqoop.properties
サブパス: sqoop .properties
ライブネスプローブ:
tcpソケット:
ポート: sqoop
準備状況プローブ:
tcpソケット:
ポート: sqoop
リソース
{ { - toYaml .Values ​​.resources |ニンデント12 } }
{ { - .Values ​​.nodeSelectorを使用} }
ノードセレクタ:
{ { - toYaml 。 |ニンデント8 } }
{ { -終わり} }
{ { - .Values ​​.affinityを使用} }
親和性:
{ { - toYaml 。 |ニンデント8 } }
{ { -終わり} }
{ { - .Values ​​.tolerationsを使用} }
許容範囲:
{ { - toYaml 。 |ニンデント8 } }
{ { -終わり} }
巻数:
-名前: { { .Release .Name } } - conf
構成マップ:
名前: { {テンプレート"sqoop.fullname"} }

5) 展開を開始する

 helm で sqoop をインストールします。/sqoop -n sqoop --create-namespace
kubectl get pods svc - n sqoop - wide を実行します。

6) テスト検証

1. MYSQLからHDFSにデータをインポートする(インポート)

[1] JDBC接続を作成する
 $ kubectl exec - it `kubectl get pods - n sqoop | awk 'NR>1{$1 を印刷}' |ヘッド- 1 ` - n sqoop -- sqoop2-shell

sqoop : 000 >サーバーの設定--host sqoop-0.sqoop.sqoop --port 12000 --webapp sqoop
#sqoop : 000 >サーバーの設定--url http://sqoop-0.sqoop.sqoop:12000/sqoop
# まずコネクタを確認してください
sqoop : 000 >コネクタを表示
# MySQL接続を作成する
sqoop : 000 >リンクの作成-コネクタ汎用- jdbc -コネクタ
generic - jdbc - connector という名前のコネクタのリンクを作成しています
新しいリンクオブジェクトを作成するには、次のを入力してください
名前: mysql - jdbc -リンク

データベース接続

ドライバークラス: com .mysql .cj .jdbc .Driver
接続文字列: jdbc : mysql : // mysql - primary .mysql : 3306 / sqoop?characterEncoding = utf8 & useSSL = false & serverTimeznotallow = UTC & rewriteBatchedStatements = true
ユーザー名: root
パスワード: ****** #MGSwjTorGj
フェッチサイズ:
接続プロパティ:
現在マップには0 個のがあります:
エントリ#

SQL方言

識別子を囲む:
検証ステータスが OK で名前が mysql - jdbc - link の新しいリンクが正常に作成されました。
スクイープ: 000 >

sqoop : 000 >リンクを表示
# 消去
# sqoop : 000 >リンクを削除--name mysql-jdbc-link

【2】HDFS接続を作成する
 sqoop : 000 >リンクの作成-コネクタ hdfs -コネクタ
hdfs - connector という名前のコネクタのリンクを作成しています
新しいリンクオブジェクトを作成するには、次のを入力してください
名前: hdfs -リンク

HDFS クラスター

URI : hdfs : // myhdfs
#URI : hdfs : // hadoop - ha - hadoop - hdfs - nn - 0.hadoop - ha - hadoop - hdfs - nn.hadoop - ha.svc.cluster.local : 8082
confディレクトリ: / opt / apache / hadoop / etc / hadoop
追加設定::
現在マップには0 個のがあります:
エントリ#
検証ステータスが OK で名前hdfs - link の新しいリンクが正常に作成されました

sqoop : 000 >リンクを表示

【3】ジョブを作成する

まず、HDFSストレージディレクトリを作成します

 hadoop fs -mkdir -p /ユーザー/管理者/ sqoop /出力/

次にデータ変換を実行します

 $ kubectl exec - it `kubectl get pods - n sqoop | awk 'NR>1{$1 を印刷}' |ヘッド- 1 ` - n sqoop -- sqoop2-shell

sqoop : 000 >サーバーの設定--url http://sqoop-0.sqoop.sqoop:12000/sqoop

sqoop : 000 >ジョブを作成- f "mysql-jdbc-link" - t "hdfs-link"
開始名が mysql - jdbc - link で終了名hdfs - link のリンクのジョブを作成しています
新しいジョブオブジェクトを作成するには、次のを入力してください
名前: mysql2hdfs

データベースソース

スキーマ名: sqoop
テーブル: test1
SQL文:
列名:
現在リストには0 個のがあります:
要素#
パーティション列:
パーティション列のNULL可能:
境界クエリ:

増分読み取り

チェック列:
最終値:

ターゲット構成

null値を上書き:
NULL:
ファイル形式:
0 :テキストファイル
1 :シーケンスファイル
2 :パーケットファイル
選択: 0
圧縮コーデック:
0 :なし
1 :デフォルト
2 :空気を抜く
3 : ZIP
4 : BZIP2
5 :エルゾー
6 : LZ4
7 :スナッピー
8 :カスタム
選択: 0
カスタムコーデック:
出力ディレクトリ: / user / admin / sqoop / output
追加モード: 1

リソースの調整

抽出機 1
ローダー 1

クラスパス構成

追加のマッパージャー:
現在リストには0 個のがあります:
要素#
新しいジョブが正常に作成され、検証ステータスが OK名前が mysql2hdfs になりました
sqoop : 000 >ジョブを表示
+------+----------------------+------------------------------------------+------------------------------------------+---------+
| ID |名前|コネクタから|コネクタへ|有効|
+------+----------------------+------------------------------------------+------------------------------------------+---------+
| 2 |翻訳: mysql - jdbc -リンク(汎用- jdbc -コネクタ) | hdfs-リンク( hdfs-コネクタ) |本当|
+------+----------------------+------------------------------------------+------------------------------------------+---------+
スクイープ: 000 >

【4】ジョブを実行する
 sqoop : 000 >ジョブを表示
sqoop : 000 >ジョブを開始- n mysql2hdfs

永続的なジョブ送信オブジェクトを表示します

提出物を表示
提出内容を表示--j ジョブ名
送信を表示--job ジョブ名 --detail

2. データのエクスポート (Haoop->RDBMS)

この例のデモンストレーションについては、私の記事「ビッグデータ Hadoop - データ同期ツール Sqoop」を参照してください。

7) アンインストール

 helm アンインストール sqoop - n sqoop
kubectl ns sqoopを削除します--force

Git アドレス: https://gitee.com/hadoop-bigdata/sqoop-on-k8s

<<:  Kubernetes で livenessProbe、ReadinessProbe、StartupProbe を構成する

>>:  Kubernetes でコンテナを検出するための 3 種類のプローブ

推薦する

共同購入のために戦ったが、利益を得ることができなかった第二世代の富裕層は、固執すべきか、断絶すべきか、それとも変革すべきか?

共同購入の「裕福な第二世代」とは、大規模なウェブサイトに依存して成長してきた共同購入ビジネスを指しま...

優秀な SEO 担当者にとって、平時においても危険に備えるという前向きな意識を持つことは非常に重要です。

周知のとおり、SEO はウェブサイトの運用と保守の手段であり、その費用対効果の高さから多くの運用と保...

外部リンクを永続させたい場合、その方法は非常に重要です

ウェブサイトの最適化は、外部リンクの構築と切り離せないものです。Baidu の新しいアルゴリズムでは...

Baidu スナップショットがタイトルと説明タグをキャプチャできない理由を明らかにする

昨日、あるファンが長沙SEOに問い合わせたところ、ウェブサイトは百度に登録されているが、タイトルと説...

検索エクスペリエンスの最適化、Seo3.0の登場

インターネット技術の継続的な発展に伴い、すべてのウェブサイト構築者は、検索エンジンの検索ルールを使用...

どのような状況でウェブサイトを修正できますか?

どのような状況でウェブサイトを改訂できるのでしょうか? これは多くのウェブマスターやウェブマスターが...

オンラインプロモーションの8つのヒントで、あなたのプロモーションの方向性が定まらなくなります

序文: オンラインプロモーションに携わる者として、私たちは皆、オンラインプロモーションに関して独自の...

unesty: ドイツの VPS、1Gbps 帯域幅、無制限のトラフィック、月額 2.49 ユーロ、1G メモリ/1 コア/25g SSD/4 コア

unesty は 2009 年に設立されたドイツの企業です。仮想ホスティング、VPS、クラウド サー...

キャプテンサーバー - 3.75ドル/Kvm/1gメモリ/100M無制限

まったく新しい VPS マーチャントである captainserver は、仮想ホスティング、x、V...

SEO担当者は、独自のリソースに基づいてウェブサイトのキーワードを設定する必要があります。

ウェブサイトに最も適切なキーワードの数はいくつでしょうか? この質問は実のところ長い間議論されてきま...

優れたオンライン h5 ゲームを設計するにはどうすればよいでしょうか?

本稿では、主にTiantian Ptuの「小学校卒業写真」、「みんなで呉美娘のコスプレ」、「神経質な...

Docker のマルチステージイメージ構築を理解する

Docker テクノロジーは、2013 年の誕生以来 4 年以上にわたって存在しています。日常の開発...

HUYAの急速な海外進出の秘密

[51CTO.com からのオリジナル記事] Huya は、ゲームライブストリーミングを主力事業とす...

初心者のためのウェブサイトのBaiduの重みを改善する方法

実際、この記事のタイトルを見ると、初心者のウェブマスターとして、Baidu ウェイトとは何なのか疑問...