2024年2月27日火曜日

BytePlusとは

  • このエントリーをはてなブックマークに追加


 こんにちは、ByteDanceのtoB事業部BytePlusのセールスエンジニアリングリードの叶 長耀(ヨウ チョウヨウ)と申します。

今日はBytePlusはどんなものか、どういった製品やサービスを展開しているかについて書いてみたいと思います。

BytePlusとは

一言で言うと「ByteDance傘下のクラウドサービスです」。AmazonのAWSみたいな感じ。ByteDanceがDouyinを始め、たくさんのtoCアプリで培ってきた技術を企業様に提供します。

BytePlusのHQはシンガポール、インフラはシンガポールのDCになっています。製品ラインナップはレコメンド、エフェクト、動画編集、ビデオクラウド、CDN、SMS等PaaSとSaaSがメインになっています。今後IaaSやLLM関連のサービスも提供する予定です。

BytePlusの製品一覧

ウェイブサイトに全製品がリストされていますが、ここで簡単に各製品について説明します。

BytePlus レコメンド

ECサイト、求人サイト、漫画、小説、ニュース、ライブ配信等コンテンツ数が多いサイト、アプリで使えるレコメンドエンジンです。特徴は3つあります。

  1. リアルタイム性(リアルタイムでモデル自体の更新ができます)

  2. コールドスタート(ユーザーとアイテム両方対応)

  3. カスタマイズ性(柔軟なKPI設定、データスキーマ設計、BytePlusアルゴリズムエンジニアによるモデル作成とトレーニング、KPIに合わせた成果報酬課金等お客様のビジネスニーズに合わせて柔軟に対応可能です)

使われるデータは3つあります。

  1. ユーザーの行動(一番重要。モデルへの寄与度は約80%)

  2. コンテンツの属性データ(モデルへの寄与度は約15%)

  3. ユーザーの属性データ(個人情報に触れない属性データ。モデルへの寄与度は約5%)

成果報酬課金モデルを採用される場合、PoCを実施します。BytePlusからアルゴリズムエンジニア1名+、ビッグデータエンジニア1名、データアナリスト1名、APIエンジニア1名、最小でも4人エンジニアがお客様ごとにアサインされます。

BytePlus Effects

SNS上でよく使われるエフェクトがありますよね。美白、美顔、Face Shaping、メイクアップ、2D/3Dステッカー、AR等様々な機能を企業様に提供できます。企業のサービスに組込むことでエンタメ要素を増やし、サービス全体の成長に貢献することができます。ライブ配信や動画作成、デーティングアプリ等によく使われます。

基本的にSDKの形で提供されます。一部API経由の呼び出しもあります。
CreativeStoreから確認することができます。

またデモアプリもございます。以下のQRコードをスキャンしダウンロードいただけます。

BytePlus Live/MediaLive

BytePlus LiveはライブストリーミングのSaaS製品です。主にライブコマース、社内大型イベント、オンライントレーニング等の用途に使われます。充実な機能、安定性、低遅延、安い等のメリットがあります。
https://assets.byteplus.com/obj/byteplus-assets/videos/live_product_highlights_3.mp4

コンソールから簡単にライブを作成、設定し、すぐにライブ配信ができます。

以下の画像はPC webページ視聴画面になります。簡単にお客様のウェブサイトに組込む(iFrameやWedSDK)ことができます。

モバイルで開く場合は、以下のような感じです。


ブラウザ視聴ではなく、ネイティブアプリ中でもライブ配信や視聴ができます。Live Streaming SDKとViewer SDKが提供され、アプリ内に実装いただけます。

BytePlus MediaLiveはPaaSサービスになります。自由度がLiveより高く、様々なカスタマイズができます。
動画ライブ配信によく使われます。

BytePlus VoD

ビデオオンデマンド、エンドツーエンドの動画(ショート動画、ロング動画)サービスです(PaaS)。

以下の図は、メディアのアップロード、管理と処理(トランスコーディング等)、配信、再生など、BytePlus VODが提供するコア機能を示しています。

大規模なサービス上で実証されている低遅延、高品質、安定性の高いVoDサービス。
BytePlus VoD Playerをご利用いただけます。クラッシュ率0.001%以下、端末側で超解像によって画質を強化、ファーストフレーム表示が速いというメリットがあります。

ぜひ以下の動画を確認してみてください。違いがわかるかと思います。
https://assets.byteplus.com/obj/byteplus-assets/videos/vod_product_highlight_1.mp4

BytePlus RTC

Zoom等で使われるリアルタイムコミュニケーション技術です。ByteDanceのLark(Zoom, Slack, Google Workspace,メール等の合体)というツールでも使われています。
BytePlus RTCは高品質のリアルタイムオーディオとビデオのPaaSサービスです。

BytePlus RTCは他のサービス(VoD、Effect、MediaLive)と容易に連携できます。

デモアプリはこちら
Web版:https://demo.byteplus.com/rtc/solution/videocall/login

BytePlus Video Editor

BytePlus Video Editorは、ByteDanceのアプリ(抖音、CapCut、西瓜ビデオ、FaceU、Ulikeなど)で広く使われている動画編集技術です。UGCプラットフォームに必須と言っていいツールになります。

簡単に、短期間で質の高い動画を作ることができます。たくさんのSNS上の動画コンテンツがCapCutで作られていると言われています。

BytePlus AR

BytePlusは、顧客の様々なシナリオでARソリューションを提供しています。
BytePlusのAR技術には、Product AR, AR Try-on, SLAM, Landmark AR, Sky & Ground AR等がございます。ByteDanceのいろんなtoCアプリで利用され、業界で最も完成度の高いAIソリューションと言えます。

詳細の紹介はBytePlus AR Libraryをご参照ください。

https://youtu.be/b1PtFsnFvxE

BytePlus VideoOne Solution

BytePlus VideoOneは今までご紹介した複数のビデオサービスを統合したソリューションになります。
MediaLive, VoD, RTCの他EffectsとVideo Editor機能も含まれており、そのものを実現できる強力なソリューションと言えます。

デモアプリもあります。
アプリストアで BytePlus VideoOneダウンロードしてみてください。

BytePlus CDN

CDNサービスも提供しております。
最新のHWとアーキテクチャを採用しており、低遅延、グローバルカバレッジ、コストパフォマンスが高いCDNになります。

BytePlus SMS

SMSサービスも全世界を展開しています。
本人認証用のワンタイムパスワードやマーケティングメッセージ等に使われます。
到達率が高く、コストパフォマンスが高い 等のメリットがあります。

ByteHouse

クラウドネイティブのデータウェアハウスです。

最後

長くなりましたが、今後もいろんなサービスをリリースする予定です。
LLM、CapCut for Business等

ここまで読んでいただきありがとうございます。ぜひBytePlusを注目しておいてください。

2020年8月21日金曜日

CDP 7.1でAtlasをインストール

  • このエントリーをはてなブックマークに追加


CDP 7.1でAtlasをインストール

Cloudera Data Platform(CDP)7.1.1をインストールし、Atlasを追加する際に必要な作業をメモしておきます。

CDP 7.1.1は2020年5月末にGAになりました。CDH6/HDP3系の進化版となっています。
インストール後の画面は以下です。
image.png

Atlasをインストールするにはいくつかコンポーネントを先にインストールしないといけません。

大まかな手順

  • Zookeeper, Kafka, Solr(CDP-infra-solr)を「サービスの追加」からインストール
  • Solrの起動に以下のエラーで失敗した場合、「Solrの初期化」と「HDFSホームディレクトリの作成」を実施
Unable to set the cluster property due to following error : Error setting cluster property
Error: Unable to set the cluster property in ZK
ERROR: Failed to configure urlScheme property for Solr cluster in Zookeeper

image.png

  • Atlasのアクションで「Create HBase tables for Atlas」を実行

image.png

  • 続いてAtlasの初期化を実施。Atlasプロセスを停止してからやらないと、「Initialize Atlas」はグレーになります。

image.png

初期化のログ。Solrにvertex_index, edge_index, fulltext_indexが作成される。
image.png

これでAtlasのUIにアクセスできるようになります。

2019年10月10日木曜日

Intel MKLのようなネイティブな数学ライブラリでSpark機械学習アルゴリズムを加速する

  • このエントリーをはてなブックマークに追加


Intel MKLのようなネイティブな数学ライブラリでSpark機械学習アルゴリズムを加速する

最近、仕事上でSpark MLlibのSVD(特異値分解)でMovieLensの推薦を実装するアプリの性能調査をしております。思った以上遅くて困っていました。SparkのDriver, Executorのメモリ、Executor数、OverHeadなどいろんなSparkパラメーターを調整して試してきましたが、なかなか改善できていません。

そして更に調査したところ、そもそもSpark MllibのSVDの実装が古いらしく、性能が出ない情報がネット上で結構上がっています。Workaroundとしては、SVDの代わりにAlternating Least Squares(ALS)などを使うか、あるいはネイティブな数学演算ライブラリを使って高速化するか などがあります。

今回はHDP上でIntel MKLを利用するための設定方法をご紹介します。

まず、ClouderaのBlogを参照しています。CDHのクラスタの場合はMKLのParcelsファイルが提供されているため、Cloudera Managerから簡単にインストールすることができます。
Using Native Math Libraries to Accelerate Spark Machine Learning Applications
https://docs.cloudera.com/documentation/guru-howto/data_science/topics/ght_native_math_libs_to_accelerate_spark_ml.html#using_native_math_libs_with_spark_machine_learning

Native Math Libraries for Spark ML

Spark MLlibは、Breeze線形代数パッケージを使用しています。Breezeは最適化な数値処理を行うにはnetlib-javaというライブラリに依存する。 netlib-javaは、低レベルのBLAS、LAPACK、およびARPACKライ​​ブラリのラッパーです。しかし、ライセンス関連の制限でCDHのSpark,あるいはApache CommunityのSparkに既定でnetlib-javaのネイティブなプロキシが含まれていません。特に手動で何も設定していない場合、netlib-javaはF2JというJavaベースのライブラリを使います。

ネイティブな数学ライブラリを使っているか、JavaベースのF2Jを使っているか Spark-shellで確認できます。

scala> import com.github.fommil.netlib.BLAS
import com.github.fommil.netlib.BLAS

scala> println(BLAS.getInstance().getClass().getName())
com.github.fommil.netlib.F2jBLAS

com.github.fommil.netlib.F2jBLASが表示されている場合は、F2jを使っていることを確認できます。

Intel MKLのインストールと設定

Intel MKL(Intel’s Math Kernel Library)を利用することで、(Alternating Least Squares (ALS) algorithm),Latent Dirichlet Allocation (LDA), Primary Component Analysis (PCA), Singular Value Decomposition (SVD) といったアルゴリズムを使ったモデル訓練を高速化することができます。

Intel MKLインストール

各Sparkノードで実施
https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-yum-repo

# curl -O https://yum.repos.intel.com/mkl/setup/intel-mkl.repo > /etc/yum.repos.d/intel-mkl.repo
# sudo yum -y install intel-mkl-2019.3-062
intel-mkl-<VERSION>.<UPDATE>-<BUILD_NUM>の形式で指定

image.png
MKLのインストール先は/opt/intel/mkl になります。

mklWrapperのダウンロード

mklWrapper.jarとmkl_wrapper.soを以下のリンクからダウンロードする
https://github.com/Intel-bigdata/mkl_wrapper_for_non_CDH

Copy mkl_wrapper.jar to /opt/intel/mkl/wrapper/mkl_wrapper.jar
Copy mkl_wrapper.so to /opt/intel/mkl_wrapper/mkl_wrapper.so

Spark Configuration

# echo "/opt/intel/mkl/lib/intel64" > /etc/ld.so.conf.d/mkl_blas.conf
# ldconfig

AmbariでSpark-default設定を追加

propety value
spark.driver.extraClassPath /opt/intel/mkl/wrapper/mkl_wrapper.jar
spark.executor.extraClassPath /opt/intel/mkl/wrapper/mkl_wrapper.jar
spark.driver.extraJavaOptions -Dcom.github.fommil.netlib.BLAS=com.intel.mkl.MKLBLAS -Dcom.github.fommil.netlib.LAPACK=com.intel.mkl.MKLLAPACK
spark.executor.extraJavaOptions -Dcom.github.fommil.netlib.BLAS=com.intel.mkl.MKLBLAS -Dcom.github.fommil.netlib.LAPACK=com.intel.mkl.MKLLAPACK
spark.driverEnv.MKL_VERBOSE 1
spark.executorEnv.MKL_VERBOSE 1

実際の設定 Custom Spark2-defaults
image.png

spark.executor.extraJavaOptionsは Advanced spark2-defaultsにあります。すでにあった値の後ろに追加する
image.png

確認

image.png

com.intel.mkl.MKLBLASが表示されることを確認できます。

そして再度SVDを実行してみたところ、前に比べて30%〜35%の時間短縮することができました。
アルゴリズムによって加速する度合いが違いますので、ALSの場合は4.3倍も速いという結果が出ています。ぜひ試してみてください。

HDP3 Hive Warehouse connectorを使ってSparkからHiveテーブルにアクセスする

  • このエントリーをはてなブックマークに追加


HDP3 Hive Warehouse connectorを使ってSparkからHiveテーブルにアクセスする

HDP3の環境でSparkからHiveテーブルにアクセスする方法をご紹介します。

HDP以前のバージョンはSpark HiveContext/SparkSession を使ってHiveテーブルにアクセスしていますが、HDP3はHortonworksが開発したHive Warehouse Connector(HWC)を使ってアクセスすることができます。
以下の図の通り、HDP3でSparkとHiveそれぞれMetadataを持っています。お互いへのアクセスはHWC経由になります。
image.png

Hive Warehouse Connector

Hive LLAPを使ってSparkのDataFrameをHiveテーブルにWrite, HiveテーブルデータをDataFrameにReadするためのライブラリになっています。
Hive LLAPを有効にする必要があります。

HWCは以下のアプリケーションをサポートしています。

  • Spark-shell
  • Pyspark
  • Spark-submit

使い方としてはこちらをご参照ください。
HiveWarehouseSession API operations
https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.1/integrating-hive/content/hive_hivewarehousesession_api_operations.html

HWC使うための設定

設定手順は以下のリンクに詳しく書いてあります。
https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.1/integrating-hive/content/hive_configure_a_spark_hive_connection.html

基本的にAmbariでCustom spark-2-defaultsに以下のプロパティを設定する

Property Description Comments
spark.sql.hive.hiveserver2.jdbc.url URL for HiveServer2 Interactive In Ambari, copy the value from Services > Hive > Summary > HIVESERVER2 INTERACTIVE JDBC URL.
spark.datasource.hive.warehouse.metastoreUri URI for metastore Copy the value from hive.metastore.uris. For example, thrift://mycluster-1.com:9083.
spark.datasource.hive.warehouse.load.staging.dir HDFS temp directory for batch writes to Hive For example, /tmp.
spark.hadoop.hive.llap.daemon.service.hosts Application name for LLAP service Copy value from Advanced hive-interactive-site > hive.llap.daemon.service.hosts.
spark.hadoop.hive.zookeeper.quorum Zookeeper hosts used by LLAP Copy value from Advanced hive-sitehive.zookeeper.quorum.

実際の設定画面です
image.png

で、注意する必要があるのが、spark.sql.hive.hiveserver2.jdbc.urlです。
手順で直接Ambari上のHIVESERVER2 INTERACTIVE JDBC URLをコピーするってかいてありますが、実行時にPermission Errorのエラーが表示される場合があります。
例えばPysparkの場合

pyspark --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.1.0.0-78.jar --py-files /usr/hdp/current/hive_warehouse_connector/pyspark_hwc-1.0.0.3.1.0.0-78.zip


Error
py4j.protocol.Py4JJavaError: An error occurred while calling o72.executeQuery.
: java.lang.RuntimeException: java.io.IOException: shadehive.org.apache.hive.service.cli.HiveSQLException: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to compile query: org.apache.hadoop.hive.ql.security.authorization.plugin.HiveAccessControlException: Permission denied: user [anonymous] does not have [USE] privilege on [default]
    at com.hortonworks.spark.sql.hive.llap.HiveWarehouseDataSourceReader.readSchema(HiveWarehouseDataSourceReader.java:130)
    at org.apache.spark.sql.execution.datasources.v2.DataSourceV2Relation$.apply(DataSourceV2Relation.scala:56)

image.png

解決策2つがあります。
1, HIVESERVER2 INTERACTIVE JDBC URLの後ろにユーザーを指定する。例えばuser=hive

jdbc:hive2://hdp-srv2.demotest.com:2181,hdp-srv1.demotest.com:2181,hdp-srv4.demotest.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-interactive;user=hive

2, コードの中にHiveWarehouseSession作成時にユーザーを指定する。例:.userPassword(‘hive’,‘hive’)
ソースコードからヒントを得ました。
https://github.com/hortonworks/hive-warehouse-connector/blob/HDP-3.1.0.158/python/pyspark_llap/sql/session.py

from pyspark_llap import HiveWarehouseSession
hive = HiveWarehouseSession.session(spark).userPassword('hive','hive').build()
hive.setDatabase("default")
hive.executeQuery("select * from test_table").show()
hive.showTables().show()
hive.showDatabases().show()

Zeppelin Spark Interpreterから接続する際の設定

ZeppelinからHiveにアクセスする場合もZeppelin側での設定が必要です。
詳細の設定はこちら
https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.0.1/integrating-hive/content/hive_zeppelin_configuration_hivewarehouseconnector.html

設定例
image.png

ただし、実際にコード実行したら、以下のように pyspark_llapモジュールが見つかりません というエラーが出力されます。
image.png

調べたところ、Zeppelin側でspark.submit.pyfilesの設定がうまく動作しないバグがあるらしい。
回避策として、コートの中に直接モジュールファイルをインポートする。

image.png

これでspark-shell, pyspark, zeppelinから使えるようになります。

2019年7月19日金曜日

Druidインストール後、Druid Coordinatorが起動失敗

  • このエントリーをはてなブックマークに追加


Druidインストール後、Druid Coordinatorが起動失敗

HDP 3.1にDruidを追加し、起動したところ、Druid Coordinatorが以下のエラーにより起動失敗しています。

エラーログ

2019-07-19T14:35:13,842 WARN [main] io.druid.metadata.SQLMetadataConnector - Exception creating table
org.skife.jdbi.v2.exceptions.CallbackFailedException: io.druid.java.util.common.ISE: Database default character set is not UTF-8.
  Druid requires its MySQL database to be created using UTF-8 as default character set.
        at org.skife.jdbi.v2.DBI.withHandle(DBI.java:284) ~[jdbi-2.63.1.jar:2.63.1]
        at io.druid.metadata.SQLMetadataConnector$2.call(SQLMetadataConnector.java:135) ~[druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.java.util.common.RetryUtils.retry(RetryUtils.java:63) ~[java-util-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.java.util.common.RetryUtils.retry(RetryUtils.java:81) ~[java-util-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector.retryWithHandle(SQLMetadataConnector.java:139) ~[druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector.retryWithHandle(SQLMetadataConnector.java:148) ~[druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector.createTable(SQLMetadataConnector.java:189) [druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector.createRulesTable(SQLMetadataConnector.java:287) [druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector.createRulesTable(SQLMetadataConnector.java:553) [druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataRuleManagerProvider$1.start(SQLMetadataRuleManagerProvider.java:71) [druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.java.util.common.lifecycle.Lifecycle.start(Lifecycle.java:311) [java-util-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.guice.LifecycleModule$2.start(LifecycleModule.java:134) [druid-api-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.cli.GuiceRunnable.initLifecycle(GuiceRunnable.java:101) [druid-services-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.cli.ServerRunnable.run(ServerRunnable.java:50) [druid-services-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.cli.Main.main(Main.java:116) [druid-services-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
Caused by: io.druid.java.util.common.ISE: Database default character set is not UTF-8.
  Druid requires its MySQL database to be created using UTF-8 as default character set.
        at io.druid.metadata.storage.mysql.MySQLConnector.tableExists(MySQLConnector.java:174) ~[?:?]
        at io.druid.metadata.SQLMetadataConnector$4.withHandle(SQLMetadataConnector.java:195) ~[druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at io.druid.metadata.SQLMetadataConnector$4.withHandle(SQLMetadataConnector.java:191) ~[druid-server-0.12.1.3.1.0.0-78.jar:0.12.1.3.1.0.0-78]
        at org.skife.jdbi.v2.DBI.withHandle(DBI.java:281) ~[jdbi-2.63.1.jar:2.63.1]
        ... 14 more
2019-07-19T14:35:13,846 ERROR [main] io.druid.cli.CliCoordinator - Error when starting up.  Failing.
org.skife.jdbi.v2.exceptions.CallbackFailedException: org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'druid.druid_rules' doesn
't exist [statement:"SELECT id from druid_rules where datasource=:dataSource", located:"SELECT id from druid_rules where datasource=:dataSource", rewritten:"SELECT id from druid_rules where datasource=?", arg
uments:{ positional:{}, named:{dataSource:'_default'}, finder:[]}]

MySqlの文字コードがUTF-8ではないため、テーブルが見つからない というようなエラー

早速MySqlでdatabase(druid)の文字コードを変更してみます。

alter database druid character set utf8 collate utf8_general_ci;
use druid;
show variables like "character_set_database";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.00 sec)

これで起動成功しました。